一、分而治之和信息隐藏
(一)分而治之( Divide and Conquer,Wirth, 1971 )
函数把较大的任务分解成若干个较小的任务,并提炼出公用任务
(二)信息隐藏(Information Hiding, Parnas, 1972)
设计得当的函数可把具体操作细节对外界隐藏起来,从而使整个程序结构清楚
使用函数时,不用知道函数内部是如何运作的,只按照我们的需要和它的参数形式调用它即可。
函数设计的基本原则
· 函数规模要小、函数功能要单一、函数接口定义要清楚
入口参数的有效性检查、敏感操作前的检查、调用成功与否的检查
二、程序设计的艺术
算法设计的艺术、结构设计艺术
三、函数
(一)定义
函数是C语言中模块化编程的最小单位;若干相关的函数可以合并成一个“模块”,一个C程序由一个或多个源程序文件组成,一个源程序文件由一个或多个函数组成
(二)分类
1、函数互相独立,没有从属之分。
main():C程序的执行从main函数开始,调用其他函数后流程回到main函数,在main函数中结束整个程序运行。
2、
1)标准库函数
ANSI/ISO C定义的标准库函数:符合标准的C语言编译器必须提供这些函数。函数的行为也要符合ANSI/ISO C的定义。
第三方库函数:由其他厂商自行开发的C语言函数库。不在标准范围内,能扩充C语言的功能(图形、网络、数据库等)
2)自定义函数
自己定义的函数,包装后,也可成为函数库,供别人使用
3.
类型 函数名(类型 参数1, 类型 参数2, ……){
声明语句序列
可执行语句序列
return 表达式;
}
四、向函数传递值和从函数返回值
1、
形式参数和实际参数
//有返回值
c = max(a,b);//数值表达式存放返回值
c = max(max(a,b),c);//作为另一个函数调用的参数
display(a,b);//无返回值时:函数调用表达式
2、函数的参数传递
实参和形参必须匹配:数目一致,类型一一对应(否则会发生自动类型转换)
五、函数原型
调用函数前先声明其返回值类型、函数名和参数
函数原型有助于编译器对函数参数类型的匹配检查
六、函数定义与函数声明的区别
1、函数定义
函数功能的确立
指定函数名、函数类型、形参及类型、函数体等
2、函数声明
不包括函数体
一条语句,仅声明作用
七、函数封装与防御性程序设计
(一)函数封装(Encapsulation)
(二)函数设计的基本原则
信息隐藏
八、函数的嵌套调用
九、函数的递归调用和递归函数
1、如果一个对象部分地由它自己组成或按它自己定义,则我们称它是**递归(Recursive)**的。
典型实例:字典
2、任何一个递归调用程序必须包括两部分
递归循环继续的过程、递归调用结束的过程
if(递归终止条件成立)
return 递归公式初值;
else return 递归函数调用返回的结果值;
3、
1)回推过程:每个递归函数必须至少有一个基线条件。一般情况必须最终能简化为基线条件
2)递推过程:递归层数太多易,导致栈空间溢出。后果很严重,程序被异常中止
十、递归与迭代
十一、变量的作用域和存储类型
(一)、变量的作用域
在源程序中定义变量的位置及其能被读写访问的范围
分为:局部变量(Local Variable) 、全局变量(Global Variable )
1、局部变量
在语句块内定义的变量.
形参也是。
特点:
生存期是该语句块,进入语句块时获得内存,仅能由语句块内语句访问,退出语句块时释放内存,不再有效
定义时不会自动初始化
并列语句块各自定义的同名变量互不干扰 ,形参和实参可以同名
2、全局变量
在所有函数之外定义的变量
特点:
生存期是整个程序,从程序运行起占据内存,程序运行过程中可随时访问,程序退出时释放内存
有效范围是从定义变量的位置开始到本程序结束
全局变量使函数间的数据交换更容易,更高效,但建议尽量少用,因为谁都可改写它,所以很难确定是谁改写了它
(二)、变量的存储类型
1、指数据在内存中存储的方式,即编译器为变量分配内存的方式,它决定变量的生存期
存储类型 数据类型 变量名;
2、C程序的存储类别:
auto型(自动变量)//进入语句块时自动申请内存,退出时自动释放内存;动态局部变量,缺省的存储类型
static型(静态变量)//生存期为整个程序运行期间
extern型(外部变量)
register型(寄存器变量)
/*寄存器:CPU内部容量有限、但速度极快的存储器
使用频率比较高的变量声明为register ,可使程序更小、执行速度更快
现代编译器有能力自动把普通变量优化为寄存器变量,并且可以忽略用户的指定,所以一般无需特别声明变量为register
*/
3、变量的生存期
静态存储区(RAM)中的变量:与程序“共存亡”
动态存储区(RAM)中的变量:与程序块“共存亡”
寄存器中(CPU)的变量: 同动态存储区