第五章 函数与编译预处理

上传人:豆浆 文档编号:6401582 上传时间:2017-08-08 格式:PPT 页数:35 大小:158KB
返回 下载 相关 举报
第五章 函数与编译预处理_第1页
第1页 / 共35页
第五章 函数与编译预处理_第2页
第2页 / 共35页
第五章 函数与编译预处理_第3页
第3页 / 共35页
第五章 函数与编译预处理_第4页
第4页 / 共35页
第五章 函数与编译预处理_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《第五章 函数与编译预处理》由会员分享,可在线阅读,更多相关《第五章 函数与编译预处理(35页珍藏版)》请在金锄头文库上搜索。

1、第五章 函 数,5. 1 函数的定义与调用,一个源程序文件由一个或多个函数组成。C程序执行从main()开始,在main()中结束;所有C函数都是平行(独立)的,不能嵌套定义;函数分类: 从用户角度: 标准函数和用户自定义函数;从函数形式: 无参函数和有参函数;,函数定义的一般形式:函数类型 函数名(类型 形式参数1,类型 形式参数2,) 函数内部变量说明 函数执行语句,函数头,函数体,例:设计函数,求1+n的和,int sum(int n) int i,s=0; for (i=1;i=n;i+) s=s+i; return s;,5.2 函数的调用,5.2.1 函数调用的格式:函数名(实际参

2、数表)说明:实参间用逗号隔开;实参与形参必须一一对应;,例5-1:调用函数计算1=2+100,int sum() int i,t=0; for(i=1;i=100;i+) t=t+i; return(t);#include stdio.hmain() int sum(); int s; s=sum(); printf(%dn,s);,5.2.2 函数调用方式函数语句: printf(“%d,%d”,a,b);函数表达式:c=2*max(a,b)函数参数: m=max(max(a,b),c);,例5-2 读程序,double fun (int n) /*fun函数的定义*/int i;doubl

3、e s=1;for (i =1;i=n;i+) s=s*i;return s;#include stdio.hmain() /*main函数的定义*/ int i,n; double sum=0;printf(ninput n : ); scanf(%d,&n);for (i=1;i=n;i+) sum=sum+fun(i); /*调用fun函数计算1!+2!+n!*/printf(n1!+2!+%d!=%.0lf,n,sum);,5.2.3 函数的参数和返回值,形式参数:定义函数时,函数名后面括号中变量名; 实际参数:调用函数时,函数名后面括号中变量名;2. 调用函数时:给形参分配存储单元;

4、将实参的值传递给形参;执行函数体;返回函数值,释放形参占用存储单元。3. 说明:形参只有在函数调用时才分配存储单元,调用结束释放;实参可以是常量、变量、表达式;实参与形参类型应一致;C规定,实参与形参间为“值传递”,即单向传递。,例5-3 “值传递”举例,void swap(int x,int y)int t; t=x;x=y;y=t; printf(“x=%d,y=%dn”,x,y);main()int a,b; a=5;b=8; swap(a,b); printf(“a=%d,b=%d”,a,b);,调用前,调用开始时,调用结束后,函数的返回值类型类型标识符,函数返回值指通过函数调用得到的

5、一个确定的值;函数返回值通过return语句得到。形式为: return(表达式); 或 return 表达式; 一个函数可以有一个以上的return语句。函数返回值的类型为定义函数时说明的类型;C规定:凡定义函数时不说明类型的,一律按整型处理;函数值类型与return中表达式类型不一致时,以函数值类型为准;函数若无return语句,不是不带回值,而是带回不确定的值;可用“void”定义“无类型”,可保证不使函数带回任何值。,例5-4 求一个整数的绝对值,int fun(int x) if(x0) x=-x; return(x); #include stdio.hmain() int a,b;

6、 scanf(%d,&a); b=fun(a); printf(%dn,b);,练习:求以下函数的返回值:,#include max(float x,float y) return xy?x:y; main() printf(%dn,max(2,3.5); ,程序运行结果:3,5.2.4 被调函数需具备的条件函数的声明,被调函数函数必须存在(自定义或库函数);若被调函数是库函数,须在文件头加 #include “”;若被调函数为自定义函数, 且与主调函数在同一文件中,一般应在主调函数中对被调函数作声明, 形式为:类型名 被调函数名( 类型1 参数1, 类型2 参数2, )或类型名 被调函数名(

7、 类型1, 类型2, ),函数原型,C规定,以下几种情况可不作被调函数声明:被调函数的定义出现在主调函数之前;已经在所有函数定义之前作了函数声明;,5.2.5 函数的嵌套调用,所谓嵌套调用,就是在调用一个函数的过程中,又调用另一个函数。即:函数A中调用函数B,函数B中又调用函数C。例如:,若有以下程序int f(int x, int y) return (y-x)*x ; void main() int a=3, b=4, c=5, d; d=f( f(3, 4), f(3, 5) ) ; printf(“%:d); 执行后输出结果是 _,有以下程序char fun (char x, char

8、 y) if (xy) return x; return y; void main() int a=9, b=8, c=7; printf(“%c” fun(fun(a, b), fun(b, c); 程序的执行结果是 -,练习:,有以下程序void f(int x, int y) int t; if (xy) t=x; x=y; y=t; void main() int a=4, b=3, c=5; f(a, b); f(a, c); f(b, c); printf(“%d,%d,%d”,a,b,c 运行结果是_,以下程序的功能是调用函数fun计算: m=1-2+3-4+9-10,并输出结果

9、,请填空 。int fun( int n ) int m=0, f=1, i; for (i=1; ib?a:b) ; ,以下sum函数的功能是计算下列级数之和。 S=1 + x + x2/2! + x3/3! + xn/n! 请给函数中的各变量正确赋初值。 double sum(doudle x, int n) int i; double a, b, s; _ for (i=1; iA间接递归:A-B-A年龄问题:age(n)=age(n-1)+2 (n1)age(n)=10 (n=1)递归函数:,int age(int n)int c; if (n=1) c=10; else c=age(

10、n-1)+2; return(c);,递归调用过程:回推递推递归函数的条件:递推公式 age(n)=age(n-1)+2 (n1)结束条件 age(n)=10 (n=1),例: 求n!,n!=1 (n=0或1)n!=n*(n-1)! (n1),long factl(long m) if(m1) return (1); else return(m * factl(m1);,/*文件名:exam7_22.cpp*/#include int fun(int i) if (i=1) return i; else return i*fun(i-1); void main() printf(%dn,fun

11、(4); ,/*文件名:exam7_23.cpp*/#include int gcd(int x,int y) if (yx) return gcd(y,x); else return gcd(y,x%y); void main() int a,b; printf(输入两个正整数:); scanf(%d,%d,&a,&b); printf(最大公因子为:%dn,gcd(a,b);,5.3 变量的作用域存储类别,变量分类:从变量作用域分:全局变量和局部变量;从变量生存期分:静态存储变量和动态存储变量;变量存储方式:静态存储方式:指在程序运行期间分配固定存储空间的方式;动态存储方式:指在程序运行期

12、间根据需要进行动态分配存储空间的方式;,Auto变量,格式: auto 类型 变量名;该变量在动态存储区动态的分配空间;局部变量和函数形式参数都属auto变量;“auto”可以省略。如在函数内部定义的:auto int a,b; 等价于: int a,b;这样变量的值在函数调用结束后自动释放。如果希望变量的值在函数调用结束后仍保留,可通过指定该局部 变量为“局部静态变量”实现。,Static局部静态变量,格式:static 类型 变量名;说明:局部静态变量在静态存储区内分配存储单元,在整个程序运行期间都不释放;局部静态变量赋初值在编译时只进行一次(例8-17);静态变量不赋初值自动赋0;局部静

13、态变量在调用函数结束后仍然存在,但其他函数不能引用它(P175例8-18);静态存储缺点:占用存储空间;降低程序可读性。,宏定义,不带参数的宏定义用一个指定的标识符代表一个字符串。形式:#define 标识符 字符串 如:#define PI 3.14159,5.4 编译预处理,说明:宏定义是用宏名代替一个字符串,即只作简单置换,不作语法检查;宏定义不是语句,不用分号;#define在函数外面,有效范围为定义开始到源文件结束;可用 #undef 中止宏定义的作用域;进行宏定义时,可引用已定义的宏名;程序中双引号内的字符,即使与宏名相同也不置换。可用 #undef 中止宏定义的作用域;进行宏定义时,可引用已定义的宏名;程序中双引号内的字符,即使与宏名相同也不置换。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号