大一下C语言

大一下的课程:

  • 电路分析基础
  • 通信工程导论
  • 体育
  • 中国近现代史纲要
  • 应用写作
  • 大学英语
  • 大学物理实验
  • 高等数学
  • 大学物理

独白:

C 语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言。

C 语言是一种广泛使用的计算机语言,它与 Java 编程语言一样普及,二者在现代软件程序员之间都得到广泛使用。

当前最新的 C 语言标准为 C18 ,在它之前的 C 语言标准有 C17、C11…C99 等。
当是 int main() 时,main() 的返回值是 int 类型,所以是 return 0; 现在 C 标准里规定 main() 返回值必须为 int,所以必须写成是 int main()。

当是 void main() 时,main() 的返回值是空,所以可以不写或者是 return; 但这是以前的写法了,现在很少用 void main() 了,也不推荐大家这么用。写出来的目的就是给大家提个醒,别犯一些低级错误。

#include <stdio.h>
 
int main()
{
    /* 我的第一个 C 程序 */
    printf("Hello, World! \n");
 
    return 0;
}


所有的 C 语言程序都需要包含 main() 函数。 代码从 main() 函数开始执行。
/* ... */ 用于注释说明。
printf() 用于格式化输出到屏幕。
printf() 函数在 "stdio.h" 头文件中声明。
stdio.h 是一个头文件 (标准输入输出头文件) , #include 是一个预处理命令,
用来引入头文件。 
当编译器遇到 printf() 函数时,如果没有找到 stdio.h 头文件,会发生编译错误。
return 0; 语句用于表示退出程序。

运行 C 程序,main(int argc, char *argv[]) 函数传参,argc 为参数个数,argv 是字符串数组, 下标从 0 开始,第一个存放的是可执行程序的文件名字,然后依次存放传入的参数,举个例子 HelloWorld.c :



#include <stdio.h> 

int main(int argc, char *argv[])
{ 
    /* 我的第一个 C 程序 */ 
    printf("可执行程序 %s ,参数个数为[%d], 运行输出:[%s]\n",argv[0],argc,argv[1]); 
    return 0;
}
编译 gcc HelloWorld.c,得到可执行程序 a.out,运行程序:

./a.out Hello,World!
可执行程序 ./a.out ,参数个数为[2], 运行输出:[Hello,World!]
#include<stdio.h>  

/*
这一句话是必须要的格式
stdio 表示系统文件库, 也可以声明其它的
.h  表示头文件,因为这些文件都是放在程序各文件的开头
#include 告诉预处理器将指定头文件的内容插入到预处理器命令的相应位  导入头文件的预编译指令
<> 表示系统自带的库
也可以写成" " 表示用户自定义的库
如果写成" "并且自定义的库里面没有这个文件系统会自动查找自带的库,如果还是没有报错
*/

int main() // 程序的入口
{ //程序从这里开始运行
/*
int 表示数字格式,返回一个数字
main()主函数 表示程序的入口  一个程序有且只能有一个main函数的存在
*/
printf("hello C"); //打印一个hello C
return 0; //返回一个整数0,因为它是int类型,所以只能返回整数
}  //程序从这里结束

1、 电路分析基础

  • 电路的基本概念
    电路模型,电路变量,欧姆定律,理想电源,基尔霍夫定律KCL,KVL,电路等效,实际电源的模型及互换等效。
  • 电阻电路分析

支路电流法,网孔分析法,节点电位法,叠加定理,齐次定理,替代定理,等效电源定理:戴维南定理和诺顿定理,最大功率传输定理。

  • 动态电路时域分析

电感和电容元件,串并联等效
动态电路及其解
一阶动态电路的零输入响应,零状态响应和全响应
阶跃函数与阶跃响应
二阶电路的零输入响应
正弦激励下的一阶电路的响应

  • 正弦稳态电路分析
    正弦交流电的基本概念,三要素,相位差,有效值。
    正弦交流电的相量表示法
    复数的两种表达形式及四则运算
    基本元件的相量形式
    KVL,KCL的相量形式
    正弦稳态电路的功率

  • 互感与理想变压器
    耦合电感元件
    耦合电感的去耦等效
    含互感电路的相量法分析
    理想变压器
    实际变压器模型

  • 电路频率响应
    网络函数与频率响应
    常用的RC一阶电路的频率特性
    常用rLC串联谐振电路的频率

  • 二端口网络
    互易定理
    n端网络与n口网络
    二端口网络的方程与参数
    二端口网络的连接
    二端口网络的等效
    二端口网络函数与特性阻抗

C 语言最初是用于系统开发工作,特别是组成操作系统的程序。由于 C 语言所产生的代码运行速度与汇编语言编写的代码运行速度几乎一样,所以采用 C 语言作为系统开发语言。

Windows 环境下使用 GCC
MinGw 是 Minimal GNU on Windows 的缩写,允许在 GNU/Linux 和 Windows 平台生成本地的 Windows 程序而不需要第三方运行时库。

$ gcc hello.c
$ ./a.out
Hello, World!

如果是多个 c 代码的源码文件,编译方法如下:

$ gcc test1.c test2.c -o main.out
$ ./main.out
C 的令牌(Token)
C 程序由各种令牌组成,令牌可以是关键字、标识符、常量、字符串值,或者是一个符号。例如,下面的 C 语句包括五个令牌:

printf("Hello, World! \n");
这五个令牌分别是:

printf
(
"Hello, World! \n"
)
;

C 中的空格
只包含空格的行,被称为空白行,可能带有注释,C 编译器会完全忽略它。

在 C 中,空格用于描述空白符、制表符、换行符和注释。空格分隔语句的各个部分,让编译器能识别语句中的某个元素(比如 int)在哪里结束,下一个元素在哪里开始。

C 可变参数
有时,您可能会碰到这样的情况,您希望函数带有可变数量的参数,而不是预定义数量的参数。C 语言为这种情况提供了一个解决方案,它允许您定义一个函数,能根据具体的需求接受可变数量的参数。下面的实例演示了这种函数的定义。

int func(int, ... ) 
{
   .
   .
   .
}
 
int main()
{
   func(2, 2, 3);
   func(3, 2, 3, 4);
}

请注意,函数 func() 最后一个参数写成省略号,即三个点号(…),省略号之前的那个参数是 int,代表了要传递的可变参数的总数。为了使用这个功能,您需要使用 stdarg.h 头文件,该文件提供了实现可变参数功能的函数和宏。具体步骤如下:

  • 定义一个函数,最后一个参数为省略号,省略号前面可以设置自定义参数。
  • 在函数定义中创建一个 va_list 类型变量,该类型是在 stdarg.h 头文件中定义的。
  • 使用 int 参数和 va_start 宏来初始化 va_list 变量为一个参数列表。宏 va_start 是在 stdarg.h
    头文件中定义的。
  • 使用 va_arg 宏和 va_list 变量来访问参数列表中的每个项。
  • 使用宏 va_end 来清理赋予 va_list 变量的内存。
    编写一个带有可变数量参数的函数,并返回它们的平均值:
#include <stdio.h>
#include <stdarg.h>
 
double average(int num,...)
{
 
    va_list valist;
    double sum = 0.0;
    int i;
 
    /* 为 num 个参数初始化 valist */
    va_start(valist, num);
 
    /* 访问所有赋给 valist 的参数 */
    for (i = 0; i < num; i++)
    {
       sum += va_arg(valist, int);
    }
    /* 清理为 valist 保留的内存 */
    va_end(valist);
 
    return sum/num;
}
 
int main()
{
   printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5));
   printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15));
}

当上面的代码被编译和执行时,它会产生下列结果。应该指出的是,函数 average() 被调用两次,每次第一个参数都是表示被传的可变参数的总数。省略号被用来传递可变数量的参数。

Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000
2、 通信工程导论

  • 通信发展简史
    信号与通信,模拟和数字信号,信号的时域,频域特性,带宽,衰耗与增益,噪声与失真。
    单工,双工
    串行与并行
    同步与异步

  • 数字通信系统
    模数与数模转换
    数字信号的基带传输
    数字信号的频带传输
    数字同步与复接技术
    数字传输的差错控制

  • 程控数字电路交换系统
    电路交换的概念模型
    硬件与软件组成
    时隙交换与复用线交换
    T-S-T数字交换网络
    软交换

  • 光纤通信系统
    光纤的传输特性
    光波分复用与光时分复用
    相干光通信
    光孤子通信
    光交换技术
    全光通信网

  • 数字微波通信系统
    微波的视距传播距离
    天线高度与传播距离
    *空间传播损耗
    地面效应和大气效应
    中继通信线路与设备组成
    微波波道及频率配置
    发信设备
    收信设备
    天馈线系统

  • 移动通信系统
    GSM蜂窝系统
    CDMA数字移动通信系统
    第三代
    第四代移动通信系统
    第五代

C 中的动态内存管理。C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。

1	void *calloc(int num, int size);
在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。
2	void free(void *address);
该函数释放 address 所指向的内存块,释放的是动态分配的内存空间。
3	void *malloc(int num);
在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。
4	void *realloc(void *address, int newsize);
该函数重新分配内存,把内存扩展到 newsize。

注意:void * 类型表示未确定类型的指针。C、C++ 规定 void * 类型可以通过类型转换强制转换为任何其它类型的指针。

编程时,如果您预先知道数组的大小,那么定义数组时就比较容易。例如,一个存储人名的数组,它最多容纳 100 个字符,所以您可以定义数组,如下所示:

char name[100];
但是,如果您预先不知道需要存储的文本长度,例如您想存储有关一个主题的详细描述。在这里,我们需要定义一个指针,该指针指向未定义所需内存大小的字符,后续再根据需求来分配内存,如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
   char name[100];
   char *description;
 
   strcpy(name, "Zara Ali");
 
   /* 动态分配内存 */
   description = (char *)malloc( 200 * sizeof(char) );
   if( description == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   }
   else
   {
      strcpy( description, "Zara ali a DPS student in class 10th");
   }
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );
}

上面的程序也可以使用 calloc() 来编写,只需要把 malloc 替换为 calloc 即可,如下所示:

calloc(200, sizeof(char));
当动态分配内存时,您有完全控制权,可以传递任何大小的值。而那些预先定义了大小的数组,一旦定义则无法改变大小。

当程序退出时,操作系统会自动释放所有分配给程序的内存,但是,建议您在不需要内存时,都应该调用函数 free() 来释放内存。

或者,您可以通过调用函数 realloc() 来增加或减少已分配的内存块的大小。让我们使用 realloc() 和 free() 函数,再次查看上面的实例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
   char name[100];
   char *description;
 
   strcpy(name, "Zara Ali");
 
   /* 动态分配内存 */
   description = (char *)malloc( 30 * sizeof(char) );
   if( description == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   }
   else
   {
      strcpy( description, "Zara ali a DPS student.");
   }
   /* 假设您想要存储更大的描述信息 */
   description = (char *) realloc( description, 100 * sizeof(char) );
   if( description == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   }
   else
   {
      strcat( description, "She is in class 10th");
   }
   
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );
 
   /* 使用 free() 函数释放内存 */
   free(description);
}
对于 void 指针,GNU 认为 void * 和 char * 一样,所以以下写法是正确的:

description = malloc( 200 * sizeof(char) );
但按照 ANSI(American National Standards Institute) 标准,需要对 void 指针进行强制转换,如下:

description = (char *)malloc( 200 * sizeof(char) );
同时,按照 ANSI(American National Standards Institute) 标准,不能对 void 指针进行算法操作:

void * pvoid;
pvoid++; //ANSI:错误
pvoid += 1; //ANSI:错误
// ANSI标准之所以这样认定,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的。

int *pint;
pint++; //ANSI:正确
对于我们手动分配的内存,在 C 语言中是不用强制转换类型的。

description = malloc( 200 * sizeof(char) ); // C 语言正确。
description = malloc( 200 * sizeof(char) ); // C++ 错误
但是 C++ 是强制要求的,不然会报错。
动态可变长的结构体:

typedef struct
{
  int id;
  char name[0];
}stu_t;
定义该结构体,只占用4字节的内存,name不占用内存。

stu_t *s = NULL;    //定义一个结构体指针
s = malloc(sizeof(*s) + 100);//sizeof(*s)获取的是4,但加上了100,4字节给id成员使用,100字节是属于name成员的
s->id = 1010;
strcpy(s->name,"hello");
注意:一个结构体中只能有一个可变长的成员,并且该成员必须是最后一个成员。
上一篇:编程学习找项目篇:你会在 GitHub 上面找项目吗?我会哦!


下一篇:Github检索方法