C语言电子教案第6章函数

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第6章函数•教学目标:•1.领会函数在C语言程序中的作用;•2.会运用函数调用的原则和参数传递方式;•3.会运用简单的递归算法;•4.能够分析C语言程序中变量的作用域和生存期。本章结构•概述•函数的定义•函数的参数和返回值•函数的调用•数组作为函数参数•函数的嵌套调用•函数的递归调用•外部变量与内部变量•静态变量与自动变量•变量的存储类别•多文件程序的编译与连接6.1概述◆C语言程序是一种独特的模块结构,每个模块都是一个函数◆有且只能有一个名为main的主函数◆main可以调用其他函数,但其他函数不能调用主函数自定义函数的作用函数分类:•从用户角度–主函数:名为main的函数–标准函数(库函数):由系统提供–用户自定义函数•从函数形式–无参函数–有参函数[类型标识符]函数名(形参列表)/*函数头*/{说明部分/*函数体*/语句部分}例intmax(intx,inty){intz;z=xy?x:y;return(z);}例无参函数printstar(){printf(“**********\n”);}6.2函数定义的一般形式6.3函数参数和返回值6.3.1形式参数与实际参数max(intx,inty){intz;Z=xy?x:y;return(z);}main(){inta,b;a=2;b=3;Printf(“%d”,max(a,b));}实际参数形式参数•返回语句•形式:return(表达式);或return表达式;或return;•功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数•说明:−函数中可有多个return语句−若无return语句,遇}时,自动返回调用函数6.3.2函数的返回值floatarea(floata,floatb){floats;s=a*b;return(s);}•6.4.1函数调用的一般形式6.4函数的调用函数名(实参表)•函数语句:例printstar();printf(“Hello,World!\n”);•函数表达式:例m=max(a,b)*2;•函数参数:例printf(“%d”,max(a,b));m=max(a,max(b,c));函数的调用方式•对被调用函数要求:−必须是已存在的函数−库函数:#include*.h−用户自定义函数:函数类型说明•函数说明−一般形式:函数类型函数名(形参类型[形参名],…..);或函数类型函数名();−作用:告诉编译系统函数类型、参数个数及类型,以便检验−函数定义与函数说明不同−函数说明位置:程序的数据说明部分(函数内或外)−下列情况下,可不作函数说明–若函数返值是char或int型,系统自动按int型处理函数说明•实参必须有确定的值•形参必须指定类型•形参与实参类型一致,个数相同•若形参与实参类型不一致,自动按形参类型转换———函数调用转换•形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放函数参数说明(1)值传递:函数调用时,为形参分配存储单元,并将实参的值传送到形参中;调用结束时,形参单元释放,实参单元仍保留并维持原值特点:①形参和实参占用不同的内存单元②单向传递参数传递方式(2)地址传递:函数调用时,将数据的存储地址作为参数传递给形参特点:①形参与实参占用同样的存储单元②实现了数据的“双向”传递③实参和形参必须是地址利用自定义函数计算:1!+2!+…5!•fact(n)/*阶乘函数*/•{•inti,t=1;•for(i=1;i=n;i++)•t=t*i;•return(t);/*返回阶乘值*/•}•main()•{•inti,sum=0;•for(i=1;i=5;i++)•{sum=sum+fact(i);/*调用阶乘函数,之后进行累加*/•printf(sum=%d\n,sum);•}}music(hz,t){inti;sound(hz);/*演奏音阶*/for(i=0;i=t;i++)/*以延时形成节拍*/delay(2000000000);nosound();}模拟电子琴键盘#includestdio.h#includedos.h#includeconio.h#includestdlib.hmain(){chari=1,j;inthz,t;while((i=getch())!='\x1b')/*Esc键退出演奏*/{switch(i){case’a':hz=262;break;case's':hz=294;break;case'd':hz=330;break;case'f':hz=349;break;case'j':hz=392;break;case'k':hz=440;break;case'l':hz=494;break;case';':hz=523;break;case'm':hz=523;break;case',':hz=523;break;case'.':hz=523;break;default:break;}if(kbhit()&&getch()=='')t=20;elset=10;music(hz,t);}}69xy:调用前:调用结束:#includestdio.hswap(inta,intb){inttemp;temp=a;a=b;b=temp;}main(){intx=6,y=9;printf(x=%d,\ty=%d\n,x,y);swap(x,y);printf(x=%d,\ty=%d\n,x,y);}调用:a:b:swap:temp交换两个变量的值:xy:69699696xy:69b:a:y:x结果:x=6y=96.5数组作为参数数组作为参数时:实参数组的首地址传给形参sort(intb[])/*形参b长度不定*/{┇}{inta[11];┇sort(a);/*实参a长度11*/┇}首地址例6-9调用自定义排序函数对数组排序main(){inti,a[11]={0};voidsort(intb[11]);for(i=1;i=10;i++)scanf(%d,&a[i]);sort(a);printf(\n);for(i=1;i=10;i++)printf(%6d,a[i]);}/*输出已排序的数组a*//*调用*/voidsort(intb[11]){inti,j,t;for(i=1;i=9;i++)for(j=2;j=11-i;j++)if(b[j]b[j-1]){t=b[j];b[j]=b[j-1];b[j-1]=t;}for(i=1;i=10;i++)printf(%6d,b[i]);}/*自定义函数中输出排序后的数组b*/6.6函数的嵌套主函数main()子函数fun1()子函数fun2()#includestdio.hmain(){inti,j,n,t,t1,t2,s[4][11];voidoutput(intscore[4][11]);for(i=1;i=3;i++){printf(no.%d:1-10?,i);for(j=1;j=10;j++)scanf(%d,&s[i][j]);}for(n=1;n=3;n++)for(i=1;i=9;i++)for(j=2;j=11-i;j++)if(s[n][j]s[n][j-1]){t=s[n][j];s[n][j]=s[n][j-1];s[n][j-1]=t;}output(s);}voidoutput(intcore[4][11]){inti,j;print_line();for(i=1;i=3;i++){printf(\n|);for(j=1;j=10;j++)printf(%3d|,score[i][j]);printf(\n);print_line();}}print_line(){inti;for(i=1;i=40;i++)putch('-');}6.7函数的递归调用实质:子函数自身的调用main(){longfact(int),y;intn;printf(Entern(n0):);scanf(%d,&n);y=fact(n);printf(%d!=%ld\n,n,y);}longfact(intn){longf;if(n==0||n==1)f=1;elsef=n*fact(n-1);return(f);}/*递归时如果没有“如果”,一定是错误的!*/6.8外部变量与内部变量内部变量(局部变量):在一个函数内部起作用外部变量(全局变量):从定义开始处直到程序结束6.8.1外部变量的定义(1)在整个函数之前定义。如:floatx,y;floataverage(x,y){floataver;aver=(x+y)/2;return(aver);}(2)在整个函数之后定义。如:floataverage(x,y){floataver;aver=(x+y)/2;return(aver);}floatx,y;(3)在函数体之前,函数头部。如:floataverage(x,y)floatx,y;{floataver;aver=(x+y)/2;return(aver);}6.8.2外部变量的作用范围intx=2;main(){voidprint();inta=x;printf(a=%dx=%d\n,a,x);print(a);printf(a=%dx=%d\n,a,x);}voidprint(inta){a++;x++;printf(a=%dx=%d\n,a,x);}运行结果:a=2x=2a=3x=3a=2x=3/*外部变量*//*a为内部变量*/6.9静态变量和自动变量静态变量:赋值后一直保留到程序结束。自动变量:每次调用值都可能发生变化外部变量时静态变量;内部变量如果没有特殊说明都是自动变量静态变量的声明:如:staticinta=3;static类型名变量名;main(){voidprint();inta=2,b=2;staticintc=2;printf(a=%db=%dc=%d\n,a,b,c);print(a);print(a);printf(a=%db=%dc=%d\n,a,b,c);}/*a,b为自动变量,只在main中有效*//*c为静态局部变量,只在main中有效*/voidprint(inta){intb=2;/*a,b为自动变量只在内部有效*/staticintc=2;/*c为静态局部变量,只在内部有效*/a++;b++;c++;printf(a=%db=%dc=%d\n,a,b,c);}a=2b=2c=2a=3b=3c=3a=3b=3c=4a=2b=2c=26.10变量的存储类别auto:内部变量没有特别声明时register:存取速度极快,但数量有限static:外部变量为静态变量extern:可作特别说明6.11内部函数与外部函数内部函数:仅在文件内部调用用static定义。如:staticfunc1(inta,intb){}外部函数:可在多个文件中调用用exturn定义。如:exturnfunc2(intx,inty){}本章小结•1.学会自定义函数的编写和函数的相互调用关系,是程序设计的基本技能。函数之间是通过函数名和参数来建立联系的。•2.主调函数调用其它函数时提供的参数称为实在参数,被调函数中的参数称为形式参数。函数调用时,主调函数将实在参数传递给形式参数。•3.当被调用的函数又调用另一个函数时,就出现了函数的嵌套调用。而当一个函数又调用自身的功能时,就出现了递归调用。•4.程序中的变量作用范围是不同的。当一个变量在几个函数中或整个程序中都有效时,就称为全局变量。当一个变量仅在一个函数内部有效时,就称为局部变量,也称为内部变量。•5.auto型变量所占存储单元在退出函数时释放;static型变量所占存储单元要到程序结束才释放。•6.所有函数可以构成一个源程序文件,也可以构成多个源程序文件。无论有几个源程序文件,最终都要生成一个可执行文件。

1 / 32
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功