函数与编译预处理_第1页
函数与编译预处理_第2页
函数与编译预处理_第3页
函数与编译预处理_第4页
函数与编译预处理_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、现在学习的是第一页,共67页2现在学习的是第二页,共67页C程序程序源程序文件源程序文件n函数函数1函数函数m 源程序文件源程序文件1函数函数1函数函数n3现在学习的是第三页,共67页程序运行情况如下:程序运行情况如下:Enter an integer number: 2 2 * 2 * 2 = 8程序的执行总是程序的执行总是从从main函数开始函数开始4现在学习的是第四页,共67页 一个一个可以由可以由组成组成。C编译系统在对编译系统在对C源程序进行编译时是以文件为单位源程序进行编译时是以文件为单位进行的。进行的。 一个一个可以由可以由组成。所组成。所有函数都是独立的。主函数可以调用其它函数

2、,其有函数都是独立的。主函数可以调用其它函数,其它函数可以相互调用。它函数可以相互调用。 在一个在一个C程序中,有且仅有一个主函数程序中,有且仅有一个主函数。C程程序的执行总是从序的执行总是从函数开始,调用其它函数后最终函数开始,调用其它函数后最终回到回到函数,在函数,在函数中结束整个程序的运行。函数中结束整个程序的运行。5现在学习的是第五页,共67页6现在学习的是第六页,共67页程序的输出结果如下:程序的输出结果如下:* Welcome to China*7现在学习的是第七页,共67页函数类型函数类型 函数名函数名( (类型名类型名 形式参数形式参数1, ) ) 说明语句说明语句 执行语句执

3、行语句 例如:求两个数的最大值。例如:求两个数的最大值。 int max(int x, int y) int z; z = x y ? x : y; return( z );8现在学习的是第八页,共67页int max(x,y) int x,y;或或int max(x,y)int x,y,z; z = x y ? x : y; return( z );形参也可以这样定义形参也可以这样定义 9现在学习的是第九页,共67页函数名(实参表列)函数名(实参表列)在在C语言中,把函数调用也作为一个表达式。因语言中,把函数调用也作为一个表达式。因此凡是表达式可以出现的地方都可以出现函数调用。此凡是表达式可

4、以出现的地方都可以出现函数调用。例如:例如: welcome( ); if (iabs (a)max) max=iabs(a); m=max(c,max(a,b);函数调用的一般形式:函数调用的一般形式:10现在学习的是第十页,共67页程序输出结果:程序输出结果:5050思思考考:两两个个程程序序有有何何不不同同程序输出结果:程序输出结果:505011现在学习的是第十一页,共67页void swap( ) int z; z=x; x=y; y=z; printf(nx=%d,y=%d,x ,y);main( ) int a= 10,b=20; swap(); printf(na=%d,b=%d

5、n,a,b);程序输出结果:程序输出结果:x=20,y=10a=10,b=20形式参数(形参)形式参数(形参)【例例7.4】编一程序,将主函数中的两个变量的值传递给编一程序,将主函数中的两个变量的值传递给swap函数中的两个形参,交换两个形参的值。函数中的两个形参,交换两个形参的值。单向值传递单向值传递12现在学习的是第十二页,共67页 10 20abswapswap函数在函数在,形参,形参x,yx,y,从从mainmain函数中分别获实参函数中分别获实参传递的值传递的值10,2010,20,此为虚实,此为虚实结合。结合。void swap( ) int z; z=x; x=y; y=z; p

6、rintf(nx=%d,y=%d,x ,y);main( ) int a= 10,b=20; swap(); printf(na=%d,b=%dn,a,b);10 20 x y201013现在学习的是第十三页,共67页 当函数被调用时才当函数被调用时才。调用结束。调用结束,所占内存被释放。,所占内存被释放。 实参可以是常量、变量或表达式,但要求它们有确实参可以是常量、变量或表达式,但要求它们有确定的值。定的值。 实参与形参类型要一致。实参与形参类型要一致。 实参与形参的个数必须相等。在函数调用时,实实参与形参的个数必须相等。在函数调用时,实参的值赋给与之相对应的形参。参的值赋给与之相对应的形参

7、。“”。14现在学习的是第十四页,共67页15现在学习的是第十五页,共67页; 16现在学习的是第十六页,共67页思考:思考:若要得到双精度实型的圆面积,程序应如何修改若要得到双精度实型的圆面积,程序应如何修改程序运行情况如下:程序运行情况如下:2 1217现在学习的是第十七页,共67页void swap(int x, int y) main( ) swap(a,b); 18现在学习的是第十八页,共67页第二种形式省略了参数名,此种形式也称为第二种形式省略了参数名,此种形式也称为函数的原型函数的原型。19现在学习的是第十九页,共67页main( ) void calc(float x,floa

8、t y,char opr); float a,b; char opr; printf(nInput expression:); scanf(%f%c%f,&a,&opr,&b); calc(a,b,opr);void calc(float x,float y,char opr) switch(opr) case +:printf(%5.2f%c%5.2f=%6.2fn,x,opr,y,x+y);return; case -:printf(%5.2f%c%5.2f=%6.2fn,x,opr,y,x-y);return; case *:printf(%5.2f%c%5.2f

9、=%6.2fn,x,opr,y,x*y);return; case /:printf(%5.2f%c%5.2f=%6.2fn,x,opr,y,x/y);return; default :printf(Operator err! n); 对被调函对被调函数的声明数的声明现在学习的是第二十页,共67页main( ) int a5,i,m ; for (i=0; i5; i+) scanf(%d,&ai); m=a0; for (i=1; i5; i+) m=min(m,ai); printf(%dn, m);【例例7.8】求求5个数中的最小值。个数中的最小值。int min(int x,

10、int y) return (xy?x:y); 单向值传递单向值传递21现在学习的是第二十一页,共67页22现在学习的是第二十二页,共67页地址传递地址传递23现在学习的是第二十三页,共67页a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 63 97 58 80 45 32 73 36(a) 排序前排序前a0 a1 a2 a3 a4 a5 a6 a7 a8 a9b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 32 36 45 58 63 73 80 97(b) 排序后排序后图图7.3 调用调

11、用sort函数函数a:2000实参赋给形参实参赋给形参首地址首地址: 2000首地址首地址: 200024现在学习的是第二十四页,共67页25现在学习的是第二十五页,共67页 26现在学习的是第二十六页,共67页27现在学习的是第二十七页,共67页28现在学习的是第二十八页,共67页程序输出结果:程序输出结果:9 29现在学习的是第二十九页,共67页:一个函数直接或间接地调用了它本身,就称:一个函数直接或间接地调用了它本身,就称为函数的递归调用。为函数的递归调用。:在函数体内调用该函数本身。:在函数体内调用该函数本身。int sub(int x) int y,z; if( ) z=sub(y)

12、; else return ;例如:例如:30现在学习的是第三十页,共67页思路思路:以求:以求4的阶乘为例的阶乘为例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。递归结束条件递归结束条件:当:当n=1或或n=0时,时,n!=1。递归公式:递归公式:31现在学习的是第三十一页,共67页main( ) int n; float y; printf(nInput n:); scanf(%d,&n); y=fact(n); printf(%d!=%-10.0fn,n,y);运行情况如下:运行情况如下:Input a integer number:4 4!=2432现在

13、学习的是第三十二页,共67页 回回 推推main( ) fact(4) fact(3) fact(2) fact(1) y=fact(4); f=4*fact(3); f=3*fact(2); f=2*fact(1); f=1; return 24 return 6 return 2 return 1 递递 推推 33现在学习的是第三十三页,共67页1. 局部变量及其作用域局部变量及其作用域变量的作用域变量的作用域:变量在程序中可以被使用的范围。:变量在程序中可以被使用的范围。根据变量的作用域可以将变量分为根据变量的作用域可以将变量分为局部变量和全局变局部变量和全局变量。量。局部变量(局部变量

14、():在:在函数内函数内或或复合语句内复合语句内定义定义的变量以及的变量以及。作用域作用域:函数内或复合语句内。:函数内或复合语句内。【例例7.13】分析下面程序的运行结果及变量的作用域。分析下面程序的运行结果及变量的作用域。34现在学习的是第三十四页,共67页main( ) int a=1,b=1,c=1; printf(main:ta=%d b= %d c= %dn,a,b,c); sub(a,b); printf(main:ta=%d b= %d c= %dn,a,b,c); int a=2,b=2; printf(comp:ta=%d b= %d c= %dn,a,b,c); prin

15、tf(main:ta=%d b= %d c= %dn,a,b,c); 程序输出结果:程序输出结果:main: a=1 b= 1 c= 1sub: a=2 b= 3 c= 1main: a=1 b= 1 c= 1comp: a=2 b= 2 c= 1main: a=1 b= 1 c= 135现在学习的是第三十五页,共67页全局变量全局变量():在):在函数外部函数外部定义的变定义的变量。量。作用域作用域:。如在其作用域内的函数或分程序中定义了。如在其作用域内的函数或分程序中定义了同名同名局局部变量,则在局部变量的作用域内,部变量,则在局部变量的作用域内,同名同名全局变全局变量暂时不起作用。量暂时

16、不起作用。【例例7.14】全局变量和局部变量的作用域。全局变量和局部变量的作用域。36现在学习的是第三十六页,共67页main( ) int b=6,c=7; f(b,c); printf(%dt%dt%dn,a,b,c); int a=9,b=8; printf(%dt%dt%dn,a,b,c); c=10; printf(%dt%dt%dn, a,b,c); printf(%dt%dt%dn,a,b,c); printf(%dt%dt%dn,a,b,c); 程序输出结果:程序输出结果:5 11 -25 6 79 8 79 8 109 8 105 6 10全局变量全局变量37现在学习的是第三

17、十七页,共67页变量的生存期变量的生存期:变量在内存中占据存储空间的时间。:变量在内存中占据存储空间的时间。存储分配存储分配动态存储变量动态存储变量静态存储变量静态存储变量38现在学习的是第三十八页,共67页变量的属性39现在学习的是第三十九页,共67页 main()int x,y; main()auto int x,y; 等价等价40现在学习的是第四十页,共67页41现在学习的是第四十一页,共67页全局静态变量(或称外部静态变量)全局静态变量(或称外部静态变量)static int a; main( ) float x,y; f( ) static int =1; 全局静态变量全局静态变量4

18、2现在学习的是第四十二页,共67页43现在学习的是第四十三页,共67页44int c;static int a; main( ) float ; char s;f( ) static int =1; 全局静态变量全局静态变量外部变量外部变量现在学习的是第四十四页,共67页注意:注意:外部变量声明用关键字外部变量声明用关键字externextern,而外部变量的定义不,而外部变量的定义不能用能用externextern,只能隐式定义。,只能隐式定义。定义外部变量时,系统要给变量分配存储空间,定义外部变量时,系统要给变量分配存储空间,而对外部变量声明时,系统不分配存储空间,只而对外部变量声明时,系

19、统不分配存储空间,只是让编译系统知道该变量是一个已经定义过的外是让编译系统知道该变量是一个已经定义过的外部变量,与函数声明的作用类似。部变量,与函数声明的作用类似。45现在学习的是第四十五页,共67页file2.c文件中程序如下:文件中程序如下:extern int i; void f2( ) int i=3; printf(nf2: i=%d,i);void f3( ) i=3; printf(nf3: i=%d,i);程序输出结果:程序输出结果:f1: i=2 main: i=2f2: i=3 main: i=2f3: i=3 main: i=3声明外部变量声明外部变量定义外部变量定义外部变量46现在学习的是第四十六页,共67页现在学习的是第四十七页,共67页现在学习的是第四十八页,共67页 输出:输出:111输出:输出:123现在学习的是第四十九页,共67页【例例7.17】寄

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论