第4章 C语言程序设计课件_第1页
第4章 C语言程序设计课件_第2页
第4章 C语言程序设计课件_第3页
第4章 C语言程序设计课件_第4页
第4章 C语言程序设计课件_第5页
已阅读5页,还剩76页未读, 继续免费阅读

下载本文档

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

kok电子竞技:文档简介

1、请用请用PowerPoint 2003PowerPoint 2003播放播放教学目的教学目的 要求学生了解要求学生了解模块化程序设计与函数,模块化程序设计与函数,重点掌握函数的定义与调用重点掌握函数的定义与调用 ;重点掌握参数的重点掌握参数的传递和函数的嵌套调用,掌握递归调用传递和函数的嵌套调用,掌握递归调用 ;了解了解变量的作用域与存储方式,重点掌握编译预处理变量的作用域与存储方式,重点掌握编译预处理及综合应用及综合应用 。教学重点教学重点 函数参数传递与返回值;变量的作用域与函数参数传递与返回值;变量的作用域与存储类型;模块化原则存储类型;模块化原则。关键词关键词模块化;函数;函数定义;函

2、数调用;模块化;函数;函数定义;函数调用;变量作用域;变量存储方式;编译预处理。变量作用域;变量存储方式;编译预处理。 授课时量授课时量理论学时:理论学时:6 6例例4.1 1). 一个源程序文件由一个或多个函数组成。一个源程 序文件是一个编译单位,即以源文件为单位进行编译,而不是以函数为单位进行编译。2). 一个程序由一个或多个源程序文件组成。一个源文件可以为多个程序公用。3). 一个程序有且只能有一个名为main的主函数,程序的执行从 main 函数开始,调用其它函数后流程回到 main 函数,在 main 函数中结束整个程序的运行。main 函数是系统定义的。 4). 所有函数都是平等的

3、,即在定义函数时是互相独立的,一个函数并不从属于另一个函数,即函数不能嵌套定义,但可以互相调用(main 函数不能调用)。 5). 从用户使用的角度看,函数有两种:标准函数,即库函数。这是由系统提供的。使用时应注意:函数功能、函数参数的数目和顺序,及各参数意义和类型、函数返回值意义和类型、需要使用的包含文件用户自己定义的函数,以解决用户的专门需要。所谓编程实质就是编写自定义功能函数,通过各函数的相互调用实现算法,甚至可以考虑把相关的函数集合到一起,形成自己的函数库,并加以相应的头文件,实现商业化。6). 从函数的形式看,函数分两类无参函数。调用时,主调函数无数据传送给被调函数。有参函数。调用时

4、,主调函数与被调函数之间有参数传递。 7). 函数调用完成后,通过return语句返回函数值,若无该语句将返回不确定值,若函数类型定义为void(空)类型,该函数将没有返回值。 合法标识符函数返回值类型缺省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”);或prints

5、tar(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=b)c=0;el

6、sec=-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(Pleaseinp

7、utvalueofa:);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;调用:711a:b:711x

8、: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返回:#includelongsum(in

9、ta,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 注:当函数返回值类型与函数的类型不一致的时候,按函数的类型转换。 例函数说明举例main

10、()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);被调函数出现在主调函数之前,不必函数说明/*ch4_1

11、0.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,intz);vo

12、idmain()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调用函数minmin函数例用弦截

13、法求方程的根)()()()(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()intf(in

14、tx)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,three,two);

15、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函数中有效;不同函数中同名变量,属于不同的变量,占不同内存单元;形参属于局部变量;可定义在复合语句中有

16、效的变量,上级语句块定义的变量对下级语句块有效(除非下级语句块定义了同名变量将屏蔽上级语句块定义的变量) 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);例复合语句中变量#defineN5main()inti

17、;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=array0;for(i=

18、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);例外部变量与局部变量运行结果:max

19、=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或空字符不确定未赋初值静态存储区动态区存储区寄存器局

20、部变量外部变量作用域定义变量的函数或复合语句内本文件其它文件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生存期:例auto变量的作

21、用域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);例局部静态变量值具有可继承性运行结果:11

22、1main()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;printf(-M

23、AIN-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:15例变量的寿命与

24、可见性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;.externintglobal;sta

25、ticintnumber;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;intpower(in

26、tn)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); 例用宏定义和函数实现同样的功能带参宏函数处理过程不分配内存简单的字符置换分配内存先求实参值,再代入形参处理时间编译时程序运行时参数类型无类型问题定义实参,形参类型程序长度变长不变运行速度不占运行时间调用和返回占时间#include“file2

27、.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

28、.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),cube(n),quad(n);功能:常量表达式为非时,程序段被编译。否则,程序段不被编译。()if常量表达式程序段else程序段#endif功能:常量表达式为非,程序段被编译。否则,编译程序段。.控制条件为定义标识符的条件编译)ifdef标识符程序段#endif功能:当标识符在该条件编译结构前已定义过时,程序段被编译。

29、否则,程序段不被编译。()ifndef标识符程序段else程序段#endif功能是,当标识符在该条件编译结构之前没有被define定义过时,程序段被编译;否则,编译程序段源程序文件1预编译命令说明部分执行部分函数1函数n源程序文件i源程序文件nC程序C C程序结构程序结构&C是函数式语言&必须有且只能有一个名为main的主函数&C程序的执行总是从main函数开始,在main中结束&函数不能嵌套定义,可以嵌套调用例:设计一个如图所示,例:设计一个如图所示,由由 * 号组成,大小和位置号组成,大小和位置可调整的圣诞树。可调整的圣诞树。 需解决三个问题需解决三个问题

30、:一是一是如何制作任意大小三角如何制作任意大小三角形的文本图形形的文本图形 ;二是;二是如如何制作树干的文本图形何制作树干的文本图形 ;三是如何给文本图形定三是如何给文本图形定位位 程序代码:#include /*n为行数,m为位置偏移数,本函数功能为制作三角图形*/void sjx(int n, int m)int i,j;for(i=1;i=n;i+) for(j=1;j=m-i;j+) printf( ); for(j=1;j=2*i-1;j+)printf(* ); printf(n); /*n为行数,m为位置偏移数,本函数功能为制作圣诞树*/void sds(int n,int m) int i,j; for(i=0;i=4;i=i+2)sjx(n+i,m); for(i=1;i=n;i+) for(j=1;j=m-1;j+) printf( ); printf(*n); void main()int n,m; printf(Input n,m: ); scanf(%d,%d,&n,&m); /*n为行数,m为位置偏移数*/ sds(n,m);

温馨提示

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

评论

0/150

提交评论