第06章函数与预处理.ppt
《第06章函数与预处理.ppt》由会员分享,可在线阅读,更多相关《第06章函数与预处理.ppt(87页珍藏版)》请在三一文库上搜索。
1、第6章 函数与预处理,*重点与难点 6.1 模块化软件与C程序的模块结构 6.2 函数定义、参数和返回值 6.3 函数调用 6.4 函数中使用的变量,6.5 内部函数与外部函数 6.6 多文件的程序运行 6.7 预处理命令 *本章小结 *作业,重点与难点,重点:函数的定义、声明、参数传递和调用;函数的嵌套调用;变量的作用域与生存期。 难点:参数传递和函数的嵌套调用。,6.1 模块化软件与C程序的模块结构,6.1.1 模块化软件 6.1.2 C语言的模块结构,6.1.1 模块化软件,模块化:就是将一个较为复杂的、大型的项目按其功能与结构,划分为若干个功能相对独立的模块(Module),每个模块实
2、现一个功能。 C语言:是一种结构化程序设计语言,结构化程序设计的基本思想之一就是程序的“模块化”。每个模块在C语言中可以用函数来实现。,6.1.2 C语言的模块结构,C程序的组成,C程序:可以由一个或多个C源程序文件组成。在C语言中,一个C语言的源程序文件就是一个编译单位。 函数:它是C源程序的基本模块。,函数分类,从用户使用的角度 标准库函数与用户自定义函数 从有无函数返回值的角度 有返回值函数与无返回值函数 从有无参数的角度 有参函数与无参函数,6.2 函数定义、参数和返回值,6.2.1 函数定义的一般形式 6.2.2 函数参数与参数传递 6.2.3 函数返回值,6.2.1 函数定义的一般
3、形式,1、无参函数 2、有参函数 3、空函数,1、无参函数,类型标识符 函数名() 类型说明 语句 ,void printmessage() printf(“nHello!“); ,2、有参函数,类型标识符 函数名(形式参数列表) 类型说明 语句 ,int max(int x,int y) return (xy?x:y);,3、空函数,类型说明符 函数名() ,调用这种函数没有任何实际作用,但 在系统规划的初期用于标示各个部分, 使得程序结构清楚,可读性好,以后 扩充新的功能方便。,6.2.2 函数参数与参数传递,1、分类:形式参数和实际参数。 2、形参:在函数定义的时候声明的参数称为形式参数
4、,简称形参。形参是变量名。 3、实参:在函数调用的时候使用到的参数称为实际参数,简称实参。实参是表达式。,参数传递,1、参数传递是实参传递给形参。 2、传递要求:在参数传递的过程中,实参的个数必须与形参的个数一样多,并且类型应相同或保持兼容,否则系统会给出错误。 3、分类 值传递与地址传递,值传递方式,一般采用的是单向的值传递,即将实参的值拷贝给形参。形参在调用前和调用后都是不存在的,只有函数被调用时形参才被分配相应的存储单元。实参与形参即使是同名的变量,它们也代表不同的存储单元,互不影响。,值传递图示,c=min(a,b);,函数调用开始,函数调用结束,地址传递方式,如果形参是地址方式,实参
5、传递给形参采用地址传递方式,即形参共用实参的地址,这样,形参的改变也会间接地改变形参的值。,6.2.3 函数返回值,函数的返回值是通过return语句返回主调函数。该语句的形式如下:,return 表达式;,一个函数至多只能返回一个值。,返回值类型,return语句的表达式的计算结果的类型常常与函数定义的返回类型不一致。这时应该以哪一个为准呢? (1)C语言规定,函数的返回值的类型以函数定义的类型为准。 (2)如果return语句中的表达式是数值型的,系统自动进行类型转换。如果系统不能自动转换的,则需要编程人员进行强制转换。,函数默认类型,如果在函数定义时没有指定返回值的类型,系统默认为int
6、型的。,无return语句,如果被调用函数中没有return语句,是不是没有返回值呢? 其实不是,函数仍然返回一个值,只不过这个值是不确定的、也不是用户所希望得到的。 如果一个函数没有返回值,最好是用void明确地表示出来。这样,可以保证函数正确调用,减少出错。,6.3 函数调用,6.3.1 函数的一般调用 6.3.2 函数的嵌套调用 6.3.3 函数的递归调用,6.3.1 函数的一般调用,函数名(实参表列),函数调用形式,(1)函数语句 printf(“Welcome to C language.“); (2)函数表达式 c=max(a,b); (3)函数作参数 d=max(a,max(b,
7、c) ;,6.3.2 函数的嵌套调用,举例:用弦截法求方程的根。,自定义函数,1、f(x) = 2、xpoint( , )= 3、root(x1,x2),函数调用关系,root函数,float root(float x1,float x2) float x,y,y1=f(x1); do x=point(x1,x2); y=f(x); if(y*y10) y1=y;x1=x; else x2=x; while(fabs(y)=0.0001); return(x); ,6.3.3 函数的递归调用,1)直接调用自身,2)间接调用自身,递归的两个阶段,回推和递推 回推到可以确定值(即递归结束条件)时结
8、束;递推从起初值开始进行迭代。,4!的回推与递推举例,回推 f(4)=4*f(3)=4*3*f(2)=4*3*2*f(1) 递推 f(1)=1 f(2)=2*f(1)=2 f(3)=3*f(2)=3*2=6 f(4)=4*f(3)=4*6=24,递归调用实质,在不能计算出结果时,先压栈;在能够计算时,逐个出栈。,例6.8 利用递归算法求Fibonacci数列,0 (n=0) f(n)= 1 (n=1) f(n-1)+f(n-2) (n1),long f(int n) long c; if(n=0) c=0; else if(n=1) c=1; else c=f(n-1)+f(n-2); ret
9、urn(c); ,课堂训练,自定义两个函数实现: (1)判断一个整数是否为完数; (2)在屏幕上显示完数的因子。 要求:在main函数中输入整数,并调用上述两个函数进行测试。,6.4 函数中使用的变量,6.4.1 局部变量与全局变量 6.4.2 变量的存储方式 6.4.3 变量的存储类别,6.4.1 局部变量与全局变量,1、局部变量 2、全局变量,1、局部变量,在一个函数内部定义的变量是内部变量,也称局部变量。 局部变量只在定义它的函数范围内有效(即可以使用),在其他函数不能使用。,局部变量举例,float f1(int a) int b,c; . char f2(int x,int y) i
10、nt i,j; main() int a,b; . int c; c=a+b; ,a,b,c有效,x,y,i,j有效,c有效,a,b有效,2、全局变量,程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数。在函数内定义的变量是局部变量;而在函数外定义的变量是外部变量,也称全局变量。 全局变量的有效范围:从定义变量的位置开始到本源文件结束。,全局变量举例,int p=1,q=5; float f1(a) int b,c;. char a,b; char f2(int x,int y) int i,j; main() int a,b; char c; c=a+b; ,a,b,c有效,x,
11、y,i,j有效,c有效,a,b有效,全局变量 a,b有效,全局变量 p,q有效,例6.9 全局变量a,int a=10; fun(int i) a+=2*i; return a; main() int a=10; printf(“n%d,%d“,fun(a),a); printf(“n%d,%d“,fun(a),a); ,运行结果: 20,10 40,10,例6.10 有一个数组存放10个学生的成绩,编一个函数求出10个学生的平均成绩、最高分和最低分。,float max=0,min=0; float averagescore(float a,int n) int i; float sum=a
12、0; max=min=a0; for(i=1;imax) max=ai; else if(aimin) min=ai; sum=sum+ai; return(sum/n); ,全局变量应慎用,全局变量在程序执行过程中一直占用内存。 降低了函数的通用性。 使用全局变量过多,会降低程序的可读性。 建议不在必要时不要使用全局变量。,6.4.2 变量的存储方式,静态存储方式,静态存储方式是指在程序运行期间分配固定的存储空间的方式。 全局变量和静态(static)变量全部存放在静态存储区。 静态存储方式在程序执行过程中一直占据固定的存储单元,直到程序执行完毕才释放。,动态存储方式,动态存储方式:是在程序
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 06 函数 预处理
链接地址:https://www.31doc.com/p-2250542.html