大一第一学期期末C语言程序设计笔记(四)
1、语句
switch后面括弧内的表达式和case后的常量表达式,可以是整型表达式或字符型表达式。
每一个case的常量表达式的值必须互不相同,否则就会出现相互矛盾的现象(对表达式的同一个值,有两种或多种执行方案)。
default是可选的。当所有case中常量表达式的值都没有与表达式的值匹配时,如果switch中有default就执行default后面的语句。如无default则一条语句也不执行。
2、数组
注意: C语言对数组不作越界检查,使用时要注意
一维数组:数组必须先定义,后使用
只能逐个引用数组元素,不能一次引用整个数组
数组元素表示形式:数组名[下标] (其中:下标可以是常量或整型表达式)
数组不初始化,其元素值为随机数
对static数组元素不赋初值,系统会自动赋以0值
只给部分数组元素赋初值
当全部数组元素赋初值时,可不指定数组长度
3、选择排序
排序过程:
(1)首先通过n-1次比较,从n个数中找出最小的, 将它与第一个数
交换—第一趟选择排序,结果最小的数被安置在第一个元素位置上
(2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,
将它与第二个数交换—第二趟选择排序
(3)重复上述过程,共经过n-1趟排序后,排序结束
4、冒泡排序
5、字符串
6、输入字符串长度<数组维数>
7、字符串输入函数gets
格式:gets(字符数组)
功能:从键盘输入一以回车结束的字符串放入字符数组中,
并自动加‘\0’
说明:输入串长度应小于字符数组维数
8、字符串输出函数puts
格式:puts(字符数组)
功能:向显示器输出字符串(输出完,换行)
说明:字符数组必须以‘\0’结束
9、字符串比较函数strcmp
格式:strcmp(字符串1,字符串2)
功能:比较两个字符串
比较规则:对两串从左向右逐个字符比较(ASCII码),
直到遇到不同字符或‘\0’为止
返值:返回int型整数,a. 若字符串1< 字符串2, 返回负整数
b. 若字符串1> 字符串2, 返回正整数
c. 若字符串1== 字符串2, 返回零
说明:字符串比较不能用“==”,必须用strcmp
10、字符串长度函数strlen
格式:strlen(字符数组)
功能:计算字符串长度
返值:返回字符串实际长度,不包括‘\0’在内
11、字符串连接函数strcat
格式:strcat(字符数组1,字符数组2)
功能:把字符数组2连到字符数组1后面
返值:返回字符数组1的首地址
说明:字符数组1必须足够大
‚连接前,两串均以‘\0’结束;连接后,串1的‘\0’取消,
新串最后加‘\0’
12、字符串拷贝函数strcpy
格式:strcpy(字符数组1,字符串2)
功能:将字符串2,拷贝到字符数组1中去
返值:返回字符数组1的首地址
说明:字符数组1必须足够大
‚拷贝时‘\0’一同拷贝,不能使用赋值语句为一个字符数组赋值
1、注意:必须有且只能有一个名为main的主函数
C程序的执行总是从main函数开始,在main中结束
函数不能嵌套定义,可以嵌套调用
2、使用库函数应注意:
1、函数功能
2、函数参数的数目和顺序,及各参数意义和类型
3、函数返回值意义和类型
4、需要使用的包含文件
3、函数的返回值
返回语句
形式:return(表达式);或return 表达式;或return;
功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数
说明:函数中可有多个return语句
若无return语句,遇}时,自动返回调用函数
若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换------函数调用转换
4、函数名(实参表)
说明:实参与形参个数相等,类型一致,按顺序一一对应
实参表求值顺序,因系统而定
5、函数说明
对被调用函数要求:必须是已存在的函数
库函数: #include <*.h>
用户自定义函数: 函数类型说明
函数说明
一般形式:函数类型 函数名(形参类型 [形参名],….. );或函数类型 函数名();
作用:告诉编译系统函数类型、参数个数及类型,以便检验
函数定义与函数说明不同
函数说明位置:程序的数据说明部分(函数内或外)
下列情况下,可不作函数说明:
1)若函数返值是char或int型,系统自动按int型处理(int型函数可不作函数说明)
2)被调用函数定义出现在主调函数之前
3)有些系统(如Borland C++)要求函数说明指出函数返值类型和形参类型,并且对void 和 int 型函数也要进行函数说明
6、实参与形参
实参必须有确定的值
形参必须指定类型
形参与实参类型一致,个数相同
若形参与实参类型不一致,自动按形参类型转换———函数调用转换
形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放
7、参数传递方式
1)值传递方式
方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;
调用结束,形参单元被释放,实参单元仍保留并维持原值。
特点:形参与实参占用不同的内存单元;单向传递。
2)地址传递
方式:函数调用时,将数据的存储地址作为参数传递给形参。
特点:形参与实参占用同样的存储单元;“双向”传递。
实参和形参必须是地址常量或变量。
8、函数的嵌套与递归调用
C规定:函数定义不可嵌套,但可以嵌套调用函数
说明:C编译系统对递归函数的自调用次数没有限制
每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息, 所以递归次数过多,可能引起堆栈溢出。
递归问题处理的条件
1)可以把一个问题转化为一个新的问题,而这个新问题的解决方法与原问题的解法相同,只是处理的对象有所不同,但它们也只是有规律的递增或递减。
2)可以通过转化过程使问题得到简化。
3)必定有一个明确的结束条件,否则递归将会无休止地进行下去。也就是说必须要有某个终止递归的条件。
9、数组作为函数参数
1)数组元素作函数实参——值传递
2)数组名作函数参数
地址传递
在主调函数与被调函数分别定义数组,且类型应一致
形参数组大小(多维数组第一维)可不指定
形参数组名是地址变量
10、变量的存储属性
堆区(自由存储区):在运行的时候调用程序(如C中的malloc)分配内存,可以在任何时候决定分配内存及分配的大小,用户自己负责在何时释放内存(如用free)。堆中的所有东西都是匿名的,这样不能按名字访问,而只能通过指针访问。
栈区:存放自动变量。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元由编译器自动释放,超出其作用域外的操作没有 定义。栈内存分配运算内置于处理器的指令集中,效率很高,但分配的内存容量有限。栈存放函数的参数值,局部变量的值等。
代码区:存放函数体的二进制代码
静态数据区:内存在程序启动的时候才被分配,而且可能直到程序开始执行的时候才被初始化,如函数中的静态变量就是在程序第一次执行到定义该变量的代码时才被初始化。所分配的内存在程序的整个运行期间都存在,如全局变量,static变量等。
11、变量的存储类型
auto -----自动型
register-----寄存器型
static ------静态型
extern -----外部型
12、局部变量--内部变量
定义:在函数内定义,只在本函数内有效
说明:
main中定义的变量只在main中有效
不同函数中同名变量,占不同内存单元
形参属于局部变量
可定义在复合语句中有效的变量
局部变量可用存储类型:auto register static (默认为auto)
13、全局变量--外部变量
定义:在函数外定义,可为本文件所有函数共用
有效范围:从定义变量的位置开始到本源文件结束,及有extern说明的其它源文件
若外部变量与局部变量同名,则外部变量被屏蔽
外部变量可用存储类型:缺省 或 static
外部变量说明: extern 数据类型 变量表;
外部变量定义与外部变量说明不同
14、静态存储:程序运行期间分配固定存储空间
动态存储:程序运行期间根据需要动态分配存储空间
静态变量:从程序开始执行到程序结束
动态变量:从包含该变量定义的函数开始执行至函数执行结束
15、
局部变量默认为auto型
register型变量个数受限,且不能为long, double, float型
局部static变量具有全局寿命和局部可见性
局部static变量具有可继承性
extern不是变量定义,可扩展外部变量作用域