版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、请用请用PowerPoint 2003PowerPoint 2003播放播放第第4章章 函数函数本章导读本章导读 学习完本章以后,你将能够:l理解模块化程序设计的基本思想,掌握利用函数实现程序的模块化设计 ;l掌握函数的定义与调用方法 ;l了解系统标准函数的作用,掌握利用系统函数解决具体问题的方法 ;l掌握函数的嵌套调用,递归调用 ;l理解变量作用域与存储方式 ;l掌握编译预处理 内容介绍内容介绍C语言是面向过程的模块化语言,以函数(具有某种特定功能相对独立的程序模块)作为程序的模块单位,实现程序模块化,又称函数式的语言。的源程序是由一个主函数和若干个函数组成的,函数的相互调用构成了程序。 在
2、程序设计中常将一些常用的功能模块编写成函数,放在函数库中供公共选用。要善于利用函数,以减少重复编写程序段的工作量。 变量是对程序中数据的存储空间的抽象,必须先定义后使用,每个变量仅在定义它的语句块(包含下级语句快)内有效 。 变量的属性包括:操作属性和存储属性 。教学目的教学目的 要求学生了解要求学生了解模块化程序设计与函数,模块化程序设计与函数,重点掌握函数的定义与调用重点掌握函数的定义与调用 ;重点掌握参数的重点掌握参数的传递和函数的嵌套调用,掌握递归调用传递和函数的嵌套调用,掌握递归调用 ;了解了解变量的作用域与存储方式,重点掌握编译预处理变量的作用域与存储方式,重点掌握编译预处理及综合
3、应用及综合应用 。v系统函数的正确调用系统函数的正确调用 v用户函数的定义方法用户函数的定义方法 v函数的类型和返回值函数的类型和返回值 v形式参数与实际参数,参数值的传递形式参数与实际参数,参数值的传递 v函数的正确调用,嵌套调用,递归调用函数的正确调用,嵌套调用,递归调用 v局部变量和全局变量局部变量和全局变量 v变量的存储类别(自动,静态,寄存器,外变量的存储类别(自动,静态,寄存器,外部),变量的作用域和生存期部),变量的作用域和生存期 v宏定义,文件包含和条件编译宏定义,文件包含和条件编译教学重点教学重点教学难点教学难点 函数参数传递与返回值;变量的作用域与函数参数传递与返回值;变量
4、的作用域与存储类型;模块化原则存储类型;模块化原则。关键词关键词模块化;函数;函数定义;函数调用;模块化;函数;函数定义;函数调用;变量作用域;变量存储方式;编译预处理。变量作用域;变量存储方式;编译预处理。 授课时量授课时量理论学时:理论学时:6 6本章主要内容如下:本章主要内容如下:4.1 概述概述 C语言是面向过程的模块化语言,以函数(具有某语言是面向过程的模块化语言,以函数(具有某种特定功能相对独立的程序模块)作为程序的模块单位,种特定功能相对独立的程序模块)作为程序的模块单位,实现程序模块化,又称函数式的语言。的源程序是由实现程序模块化,又称函数式的语言。的源程序是由一个主函数和若干
5、个函数组成的,函数的相互调用构成一个主函数和若干个函数组成的,函数的相互调用构成了程序。了程序。 运行时,运行时, 程序从主函数程序从主函数main( ) 开始执开始执行,到行,到 main( ) 的终止行结束。其它函数由的终止行结束。其它函数由 main() 或别或别的函数或自身调用后组成可执行程序。的函数或自身调用后组成可执行程序。 在程序设计中常将一些常用的功能模块编写成函数,在程序设计中常将一些常用的功能模块编写成函数,放在函数库中供公共选用。要善于利用函数,以减少重放在函数库中供公共选用。要善于利用函数,以减少重复编写程序段的工作量。复编写程序段的工作量。例例4.1 1). 一个源程
6、序文件由一个或多个函数组成。一个源程 序文件是一个编译单位,即以源文件为单位进行编译,而不是以函数为单位进行编译。2). 一个程序由一个或多个源程序文件组成。一个源文件可以为多个程序公用。3). 一个程序有且只能有一个名为main的主函数,程序的执行从 main 函数开始,调用其它函数后流程回到 main 函数,在 main 函数中结束整个程序的运行。main 函数是系统定义的。 4). 所有函数都是平等的,即在定义函数时是互相独立的,一个函数并不从属于另一个函数,即函数不能嵌套定义,但可以互相调用(main 函数不能调用)。 5). 从用户使用的角度看,函数有两种:标准函数,即库函数。这是由
7、系统提供的。使用时应注意:函数功能、函数参数的数目和顺序,及各参数意义和类型、函数返回值意义和类型、需要使用的包含文件用户自己定义的函数,以解决用户的专门需要。所谓编程实质就是编写自定义功能函数,通过各函数的相互调用实现算法,甚至可以考虑把相关的函数集合到一起,形成自己的函数库,并加以相应的头文件,实现商业化。6). 从函数的形式看,函数分两类无参函数。调用时,主调函数无数据传送给被调函数。有参函数。调用时,主调函数与被调函数之间有参数传递。 7). 函数调用完成后,通过return语句返回函数值,若无该语句将返回不确定值,若函数类型定义为void(空)类型,该函数将没有返回值。 4.2 函数
8、的定义与调用函数的定义与调用函数的定义函数的定义 函数的调用、参数及传递方式函数的调用、参数及传递方式 函数的返回值函数的返回值 函数声明的作用函数声明的作用 main函数中的参数函数中的参数 合法标识符函数返回值类型缺省int型无返回值void函数体函数类型函数名(形参类型说明表)说明部分语句部分现代风格:例有参函数(现代风格)intmax(intx,inty)intz;z=xy?x:y;return(z);例有参函数(现代风格)intmax(intx,y)intz;z=xy?x:y;return(z);例空函数dummy()函数体为空例无参函数printstar()printf(“*n”)
9、;或printstar(void)printf(“*n”);函数类型函数名(形参表)形参类型说明说明部分语句部分传统风格:例有参函数(传统风格)intmax(x,y)intx,y;intz;z=xy?x:y;return(z);main()inti=2,p;p=f(i,+i);printf(%d,p);intf(inta,intb)intc;if(ab)c=1;elseif(a=b)c=0;elsec=-1;return(c);例参数求值顺序main()inti=2,p;p=f(i,i+);printf(%d,p);intf(inta,intb)intc;if(ab)c=1;elseif(a=
10、b)c=0;elsec=-1;return(c);运行结果:0运行结果:1c=max(a,b);(main函数)(max函数)max(intx,inty)intz;z=xy?x:y;return(z);例比较两个数并输出大者main()inta,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(Maxis%d,c);max(intx,inty)intz;z=xy?x:y;return(z);形参实参例计算x的立方#includefloatcube(floatx)return(x*x*x);main()floata,product;printf(P
11、leaseinputvalueofa:);scanf(%f,&a);product=cube(a);printf(”Cubeof%.4fis%.4fn,a,product);xaproduct1.21.21.728711x:y:调用前:调用结束:711x:y:例交换两个数/*ch7_2.c*/#includemain()intx=7,y=11;printf(x=%d,ty=%dn,x,y);printf(swapped:n);swap(x,y);printf(x=%d,ty=%dn,x,y);swap(inta,intb)inttemp;temp=a;a=b;b=temp;调用:711
12、a:b:711x:y:swap:711x:y:117a:b:temp/*ch9_3.c*/swap(p1,p2)int*p1,*p2;intp;p=*p1;*p1=*p2;*p2=p;main()inta,b;scanf(%d,%d,&a,&b);printf(“a=%d,b=%dn”,a,b);printf(“swapped:n”);swap(&a,&b);printf(”a=%d,b=%dn,a,b);例交换两个数a59b调前:a59b调swap:p1&a&bp2a95b交换:p1&a&bp2a95b返回:#includelo
13、ngsum(inta,intb);longfactorial(intn);main()intn1,n2;longa;scanf(%d,%d,&n1,&n2);a=sum(n1,n2);printf(a=%1d,a);longsum(inta,intb)longc1,c2;c1=factorial(a);c2=factorial(b);return(c1+c2);longfactorial(intn)longrtn=1;inti;for(i=1;iy?x:y;return(z);输入:5.6,7.3输出:7 注:当函数返回值类型与函数的类型不一致的时候,按函数的类型转换。 例函数
14、说明举例main()floata,b;intc;scanf(%f,%f,&a,&b);c=max(a,b);printf(Maxis%dn,c);max(floatx,floaty)floatz;z=xy?x:y;return(z);int型函数可不作函数说明(VisualC+不行)/*ch4_10.c*/floatadd(floatx,floaty)floatz;z=x+y;return(z);main()floata,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sumis%f,c);被调函数出现在主调函数之前,不必函数说
15、明/*ch4_10.c*/main()floatadd(float,float);/*functiondeclaration*/floata,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sumis%f,c);floatadd(floatx,floaty)floatz;z=x+y;return(z);float add();main()调用函数a结束a函数b函数调用函数b例求三个数中最大数和最小数的差值#includeintdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,
16、intz);voidmain()inta,b,c,d;scanf(%d%d%d,&a,&b,&c);d=dif(a,b,c);printf(Max-Min=%dn,d);Ch7_202.cintdif(intx,inty,intz)returnmax(x,y,z)-min(x,y,z);intmax(intx,inty,intz)intr;r=xy?x:y;return(rz?r:z);intmin(intx,inty,intz)intr;r=xy?x:y;return(rz?r:z);main()调用函数dif输出结束dif函数max函数调用函数max调用函数minm
17、in函数例用弦截法求方程的根)()()()(121221xfxfxfxxfxxxyf(x)0 x1x2xf(x1)f(x2)077951923xxx求f(x1)与f(x2)连线与x轴的交点x输入x1,x2,求f(x1),f(x2)直到f(x1)与f(x2)异号y=f(x),y1=f(x1)y与y1同号真假x1=xy1=yx2=x直到|y|root=x输出rootroot函数运行情况:Inputx1,x2:2,6Arootofequationis5.0000main()调用函数root输出根x结束root函数xpoint函数调用函数xpoint调用函数ff函数f()调f调f2调f1f1()f2(
18、)intf(intx)inty,z;z=f(y);.return(2*z);intf1(intx)inty,z;z=f2(y);.return(2*z);intf2(intt)inta,c;c=f1(a);.return(3+c);例求n的阶乘) 1()!1() 1 , 0(1!nnnnn/*ch4_14.c*/#includeintfac(intn)intf;if(n0)printf(n%cn,getone,putone);voidhanoi(intn,charone,chartwo,charthree)if(n=1)move(one,three);elsehanoi(n-1,one,thr
19、ee,two);move(one,three);hanoi(n-1,two,one,three);main()intm;printf(Inputthenumberofdisks:);scanf(%d,&m);printf(Thestepstomoving%3ddisks:n,m);hanoi(m,A,B,C);ABC运行情况如下:Inputthenumberofdisks:3Inputthenumberofdisks:A-CA-BC-BA-CB-AB-CA-C说明:main函数中定义的变量只在main函数中有效;不同函数中同名变量,属于不同的变量,占不同内存单元;形参属于局部变量;可定
20、义在复合语句中有效的变量,上级语句块定义的变量对下级语句块有效(除非下级语句块定义了同名变量将屏蔽上级语句块定义的变量) floatf1(inta)intb,c;.charf2(intx,inty)inti,j;main()intm,n;.a,b,c有效x,y,i,j有效m,n有效例不同函数中同名变量main()inta,b;a=3;b=4;printf(main:a=%d,b=%dn,a,b);sub();printf(main:a=%d,b=%dn,a,b);sub()inta,b;a=6;b=7;printf(sub:a=%d,b=%dn,a,b);例复合语句中变量#defineN5ma
21、in()inti;intaN=1,2,3,4,5;for(i=0;iN/2;i+)inttemp;temp=ai;ai=aN-i-1;aN-i-1=temp;for(i=0;iN;i+)printf(%d,ai);运行结果:54321例复合语句中变量#defineN5main()inti;intaN=1,2,3,4,5;for(i=0;iN/2;i+)inttemp;temp=ai;ai=aN-i-1;aN-i-1=temp;for(i=0;ifloatmax,min;floataverage(floatarray,intn)inti;floatsum=array0;max=min=array
22、0;for(i=1;imax)max=arrayi;elseif(arrayiy?x:y;return(z);main()externinta,b;printf(max=%d,max(a,b);inta=13,b=-8;运行结果:max=13externinta,b;intmax()intz;z=ab?a:b;return(z);main()printf(max=%d,max();inta=13,b=-8;inta=3,b=5;max(inta,intb)intc;c=ab?a:b;return(c);main()inta=8;printf(max=%d,max(a,b);例外部变量与局部变量
23、运行结果:max=8inti;main()voidprt();for(i=0;i5;i+)prt();voidprt()for(i=0;i5;i+)printf(“%c”,*);printf(“n”);例外部变量副作用运行结果:*如:intsum;autointa,b,c;registerinti;staticfloatx,y;程序区静态存储区动态存储区全局变量、局部静态变量形参变量局部动态变量(autoregister)函数调用现场保护和返回地址等静态动态存储方式程序整个运行期间函数调用开始至结束生存期编译时赋初值,只赋一次每次函数调用时赋初值自动赋初值0或空字符不确定未赋初值静态存储区动态
24、区存储区寄存器局部变量外部变量作用域定义变量的函数或复合语句内本文件其它文件u局部变量默认为auto型uregister型变量个数受限,且不能为long, double, float型u局部static变量具有全局寿命和局部可见性u局部static变量具有可继承性uextern不是变量定义,可扩展外部变量作用域register局部staticauto外部static外部存储类别例文件file1.cinta;main().f2;.f1;.f1()autointb;f2;.f2()staticintc;C作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期:例
25、auto变量的作用域main()intx=1;voidprt(void);intx=3;prt();printf(“2ndx=%dn”,x);printf(“1stx=%dn”,x);voidprt(void)intx=5;printf(“3thx=%dn”,x);运行结果:3thx=52ndx=31stx=1x=1作用域x=1作用域x=3作用域x=5作用域main()voidincrement(void);increment();increment();increment();voidincrement(void)intx=0;x+;printf(“%dn”,x);例局部静态变量值具有可继承
26、性运行结果:111main()voidincrement(void);increment();increment();increment();voidincrement(void)staticintx=0;x+;printf(“%dn”,x);运行结果:123other()staticinta=2;staticintb;intc=10;a=a+2;i=i+32;c=c+5;printf(-OTHER-n);printf(i:%da:%db:%dc:%dn,i,a,b,c);b=a;#includeinti=1;main()staticinta;registerintb=-10;intc=0;p
27、rintf(-MAIN-n);printf(i:%da:%db:%dc:%dn,i,a,b,c);c=c+8;other();printf(-MAIN-n);printf(i:%da:%db:%dc:%dn,i,a,b,c);i=i+10;other();全局i1main:a0b:-10registermain:c0静态存储区动态存储区other:a2other:b0other:c10843315443other:c10675156-Main-i:1a:0b:-10c:0-Other-i:33a:4b:0c:15-Main-i:33a:0b:-10c:8-Other-i:75a:6b:4c:1
28、5例变量的寿命与可见性main()voidgx(),gy();externintx,y;printf(“1:x=%dty=%dn”,x,y);y=246;gx();gy();voidgx()externintx,y;x=135;printf(“2:x=%dty=%dn”,x,y);intx,y;voidgy()printf(“3:x=%dty=%dn”,x,y);例用extern扩展外部变量作用域运行结果:1:x=0y=02:x=135y=2463:x=135y=246例引用其它文件中的外部变量intglobal;externfloatx;main()intlocal;.externintgl
29、obal;staticintnumber;func2().floatx;staticintnumber;func3()externintglobal;.file1.cfile2.cfile3.c例引用其它文件中的变量,输出ab和a的m次方inta;main()intpower(intn);intb=3,c,d,m;printf(Enterthenumberaanditspower:n);scanf(%d,%d,&a,&m);c=a*b;printf(%d*%d=%dn,a,b,c);d=power(m);printf(%d*%d=%d,a,m,d);externinta;int
30、power(intn)inti,y=1;for(i=1;i(y)?(x):(y) .main() int a,b,c,d,t; . t=MAX(a+b,c+d); 宏展开:t=(a+b)(c+d)?(a+b):(c+d);int max(int x,int y) return(xy?x:y);main() int a,b,c,d,t; . t=max(a+b,c+d); 例用宏定义和函数实现同样的功能带参宏函数处理过程不分配内存简单的字符置换分配内存先求实参值,再代入形参处理时间编译时程序运行时参数类型无类型问题定义实参,形参类型程序长度变长不变运行速度不占运行时间调用和返回占时间#inclu
31、de“file2.c”file1.cfile2.cfile1.cfile2.cABA 直接按标准目录搜索“” 先在当前目录搜索,再搜索标准目录可指定路径宏定义数据结构定义函数说明等#include“file2.c”file1.cAfile3.cC#include“file3.c”file2.cBfile1.cAfile3.cfile2.c例文件包含举例/*powers.h*/#definesqr(x)(x)*(x)#definecube(x)(x)*(x)*(x)#definequad(x)(x)*(x)*(x)*(x)/*ch8_10.c*/#include#included:fengyibkcpowers.h#defineMAX_POWER10voidmain()intn;printf(numbertexp2texp3texp4n);printf(-t-t-t-n);for(n=1;n=MAX_POWER;n+)printf(%2dt%3dt%4dt%5dn,n,sqr(n),cu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026恒风聚能新能源(甘肃)有限公司招聘考试参考题库及答案解析
- 2026年甘肃电投常乐发电有限责任公司招聘30人考试备考题库及答案解析
- 2026年怒江州福贡县公安局辅警招聘(9人)考试备考试题及答案解析
- 2026重庆医科大学附属第一医院工作人员招聘考试备考题库及答案解析
- 2026年1月重庆市万州区高峰街道办事处公益性岗位招聘4人考试参考试题及答案解析
- 2026年广东水利电力职业技术学院高职单招职业适应性测试备考试题有答案解析
- 胺碘酮的患者生活质量改善
- 2026浙江绍兴市本级卫生健康单位第一次招聘硕士博士研究生、高级专家和医学类工作人员80人考试参考试题及答案解析
- 2026年西湖区转塘街道编外用工招聘备考题库参考答案详解
- 2026年韶关市大宝山资源综合利用有限公司招聘备考题库含答案详解
- 缺血性脑卒中静脉溶栓护理
- 电子电路基础-电子科技大学中国大学mooc课后章节答案期末考试题库2023年
- 四年级科学上册期末试卷及答案-苏教版
- DB51T 2875-2022彩灯(自贡)工艺灯规范
- 小学数学人教版六年级上册全册电子教案
- 主要负责人重大危险源安全检查表
- 《工程经济学》模拟试题答案 东北财经大学2023年春
- 2023-2024学年广西壮族自治区来宾市小学数学五年级下册期末自测试卷
- 2023年福海县政务中心综合窗口人员招聘笔试模拟试题及答案解析
- GB/T 25129-2010制冷用空气冷却器
- FZ/T 01057.2-2007纺织纤维鉴别试验方法 第2部分:燃烧法
评论
0/150
提交评论