C语言程序设计教程第7章函数和预处理命令_第1页
C语言程序设计教程第7章函数和预处理命令_第2页
C语言程序设计教程第7章函数和预处理命令_第3页
C语言程序设计教程第7章函数和预处理命令_第4页
C语言程序设计教程第7章函数和预处理命令_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

1、C语言程序设计教程第7章函数和预处理命令C语言程序设计教程-第7章-函数和预处理命令C程序程序源程序文件源程序文件n函数函数1函数函数m 源程序文件源程序文件1函数函数1函数函数n程序运行情况如下:程序运行情况如下:Enter an integer number:2 2 * 2 * 2 = 8程序的执行总是程序的执行总是从从main函数开始函数开始 一个一个C源程序可以由一个或多个源程序文件组成。源程序可以由一个或多个源程序文件组成。C编译系统在对编译系统在对C源程序进行编译时是以文件为单位进行的源程序进行编译时是以文件为单位进行的。 一个一个C源程序文件可以由一个或多个函数组成。所源程序文件

2、可以由一个或多个函数组成。所有函数都是独立的。主函数可以调用其它函数,其它函有函数都是独立的。主函数可以调用其它函数,其它函数可以相互调用。数可以相互调用。 在一个在一个C程序中,有且仅有一个主函数程序中,有且仅有一个主函数main。C程程序的执行总是从序的执行总是从main函数开始,调用其它函数后最终回函数开始,调用其它函数后最终回到到main函数,在函数,在main函数中结束整个程序的运行。函数中结束整个程序的运行。程序的输出结果如下:程序的输出结果如下:* Welcome to China*函数类型函数类型 函数名函数名( (类型名类型名 形式参数形式参数1, ) ) 说明语句说明语句

3、执行语句执行语句 例如:求两个数的最大值。例如:求两个数的最大值。 int max(int x,int y) int z; z = x y ? x : y; return( z );类型省略时类型省略时默认为默认为int类类型型没有形式参数没有形式参数为无参函数为无参函数 int max(x,y) int x,y;或或int max(int x,y) 形参也可以这样定义形参也可以这样定义 函数名(实参表列)函数名(实参表列)在在C语言中,把函数调用也作为一个表达式。因语言中,把函数调用也作为一个表达式。因此凡是表达式可以出现的地方都可以出现函数调用此凡是表达式可以出现的地方都可以出现函数调用。

4、例如:。例如: welcome( ); if (iabs (a)max) max=iabs(a); m=max(c,max(a,b);函数调用的一般形式:函数调用的一般形式:程序输出结果:程序输出结果:5050思思考考:两两个个程程序序有有何何不不同同程序输出结果:程序输出结果:5050void swap(int x, int y) int z; z=x; x=y; y=z; printf(nx=%d,y=%d,x ,y);main( ) int a= 10,b=20; swap(a,b); printf(na=%d,b=%dn,a,b);程序输出结果:程序输出结果:x=20,y=10a=10

5、,b=20形式参数(形参)形式参数(形参)【例例7.4】编一程序,将主函数中的两个变量的值传递编一程序,将主函数中的两个变量的值传递给给swap函数中的两个形参,交换两个形参的值。函数中的两个形参,交换两个形参的值。单向值传递单向值传递 当函数被调用时才给形参分配内存单元。调用结束,当函数被调用时才给形参分配内存单元。调用结束,所占内存被释放。所占内存被释放。 实参可以是常量、变量或表达式,但要求它们有确定实参可以是常量、变量或表达式,但要求它们有确定的值。的值。 实参与形参类型要一致,字符型与整型可以兼容。实参与形参类型要一致,字符型与整型可以兼容。 实参与形参的个数必须相等。在函数调用时,

6、实参实参与形参的个数必须相等。在函数调用时,实参的值赋给与之相对应的形参。的值赋给与之相对应的形参。“单向值传递单向值传递”。程序输出结果:程序输出结果:a=9,b=5说明:说明:函数的类型决函数的类型决定了函数返回值定了函数返回值的类型。若省略的类型。若省略函数的类型,系函数的类型,系统默认其为统默认其为int型型。无返回值的函无返回值的函数应将其类型定数应将其类型定义为义为void 如果不一致,系统自动将表达式类型转换为函如果不一致,系统自动将表达式类型转换为函数类型数类型思考:思考:若要得到单精度实型的圆面积,程序应如何修改若要得到单精度实型的圆面积,程序应如何修改程序运行情况如下:程序

7、运行情况如下:2 12void swap(int x, int y) main( ) swap(a,b); 第二种形式省略了参数名,此种形式也称为函数的原型。第二种形式省略了参数名,此种形式也称为函数的原型。main( ) void calc(float x,float 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) ca

8、se +: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=%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); 对被调函对被调函数的声明数的声明图图 7.2 验证哥德巴赫猜想验证哥德巴赫猜想输入输入n的值的值

9、 for (a=6; a=n; a+=2) for(b=3;b=a/2;b+=2) b是素数是素数 ? T F c=a-b c是素数?是素数? T F 输出:输出: a、b、c的值的值 break;/* 穷举法判断素数穷举法判断素数 */int prime(int n) int i; for (i=2; i=sqrt(n); i+) if (n%i=0) return 0; return 1;可以在可以在main函数的前面对函数的前面对prime函数进行声明。实际上,该声明函数进行声明。实际上,该声明可以省略,为什么?可以省略,为什么?main( ) int a5,i,m ; for (i=0

10、; i5; i+) scanf(%d,&ai); m=a0; for (i=1; i5; i+) m=min(m,ai); printf(%dn, m);【例例7.11】求求5个数中的最小值。个数中的最小值。int min(int x, int y) return (x0)n程序运行情况如下:程序运行情况如下:2,10 1024 余数:余数: 商:商:15613%8=5 15613/8=19511951%8=7 1951/8=243243%8=3243/8=3030%8=630/8=33%8=33/8=0结果:结果:36375 图图 7.5 十进制转换成八进制十进制转换成八进制程序运行

11、情况如下:程序运行情况如下:15613 15613=(36375)87.5.2 局部变量及其作用域局部变量及其作用域变量的作用域:变量在程序中可以被使用的范围。变量的作用域:变量在程序中可以被使用的范围。根据变量的作用域可以将变量分为局部变量和全局变量。根据变量的作用域可以将变量分为局部变量和全局变量。局部变量(局部变量():在函数内或复合语句内定义的变):在函数内或复合语句内定义的变量以及量以及。作用域:函数内或复合语句内。作用域:函数内或复合语句内。【例例7.19】分析下面程序的运行结果及变量的作用域。分析下面程序的运行结果及变量的作用域。main( ) int a=1,b=1,c=1;

12、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); printf(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

13、 c= 1全局变量(全局变量():在函数外部定义的变量):在函数外部定义的变量。作用域:作用域:。如在其作用域内的函数或分程序中定义了同名局部如在其作用域内的函数或分程序中定义了同名局部变量,则在局部变量的作用域内,同名全局变量暂变量,则在局部变量的作用域内,同名全局变量暂时不起作用。时不起作用。【例例7.20】全局变量和局部变量的作用域。全局变量和局部变量的作用域。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,

14、 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全局变量全局变量变量的生存期:变量在内存中占据存储空间的时间。变量的生存期:变量在内存中占据存储空间的时间。程序代码区静态存储区动态存储区存储分配存储分配动态存储变量动态存储变量静态存储变量静态存储变量变量的属性 1自动变量(自动变量(auto类别)类别) 局部变量可以定义为自动变量。局部变量可以定义为自动变量。main()int x,y; main()auto int x,y;

15、等价等价可省全局静态变量(或称外部静态变量)全局静态变量(或称外部静态变量)static int a; main( ) float x,y; f( ) static int b=1; 全局静态变量全局静态变量不能省int c;static int a; main( ) float ; char s;f( ) static int b=1; 全局静态变量全局静态变量外部变量外部变量问题:问题:全局静全局静态变量态变量的作用的作用域可以域可以扩展到扩展到本程序本程序的其它的其它文件吗文件吗?注意:注意:外部变量声明用关键字外部变量声明用关键字externextern,而外部变量的定义不,而外部变量

16、的定义不能用能用externextern,只能隐式定义。,只能隐式定义。定义外部变量时,系统要给变量分配存储空间,而对定义外部变量时,系统要给变量分配存储空间,而对外部变量声明时,系统不分配存储空间,只是让编译外部变量声明时,系统不分配存储空间,只是让编译系统知道该变量是一个已经定义过的外部变量,与函系统知道该变量是一个已经定义过的外部变量,与函数声明的作用类似。数声明的作用类似。外部变量声明外部变量声明思考:在思考:在f1函数中声明函数中声明c1、c2的的作用是什么?如何修改程序使作用是什么?如何修改程序使所有函数都可以使用外部变量所有函数都可以使用外部变量而又不需要声明?而又不需要声明?文

17、件中程序如下:文件中程序如下: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声明外部变量声明外部变量定义外部变量定义外部变量【例例7.26】寄存器变量的使用。寄存器变量的使用。main( ) long int sum=0; register int i; for (i=1; i(Y)?(X):(Y)分两次替换:分两次替换:将宏名将宏名 替换成字符串替换成字符串 。用实参用实参a替换形参替换形参x,实参,实参b替换形参替换形参y。程序中的两个程序中的两个printf语句被展开为:语

温馨提示

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

最新文档

评论

0/150

提交评论