《C语言电子教案第6章函数课件》由会员分享,可在线阅读,更多相关《C语言电子教案第6章函数课件(32页珍藏版)》请在金锄头文库上搜索。
1、第6章 函数教学目标:1.领会函数在C语言程序中的作用;2.会运用函数调用的原则和参数传递方式;3.会运用简单的递归算法;4.能够分析C语言程序中变量的作用域和生存期。 本章结构概述函数的定义函数的参数和返回值函数的调用数组作为函数参数函数的嵌套调用函数的递归调用外部变量与内部变量静态变量与自动变量变量的存储类别多文件程序的编译与连接6.1概述C语言程序是一种独特的模块结构, 每个模块都是一个函数函数有且只能有一个名为mainmain的主函数 mainmain可以调用其他函数,但其他函数不能可以调用其他函数,但其他函数不能调用主函数调用主函数自定义函数的作用函数分类:从用户角度主函数:名为ma
2、in的函数标准函数(库函数):由系统提供用户自定义函数从函数形式无参函数有参函数类型标识符 函数名(形参列表)/*函数头*/说明部分 /*函数体*/语句部分例 int max(int x,int y) int z; z=xy?x:y; return(z); 例 无参函数 printstar( ) printf(“*n”); 6.2 函数定义的一般形式 6.3函数参数和返回值6.3.1形式参数与实际参数max(int x, int y)int z;Z=xy?x:y;return(z);main()int a,b;a=2;b=3;Printf(“%d”,max(a,b);实际参数形式参数返回语句形
3、式: return(表达式表达式); 或 return 表达式表达式; 或 return;功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数说明:函数中可有多个return语句若无return语句,遇时,自动返回调用函数6.3.2函数的返回值float area(float float area(float a,float b)a,float b) float s; float s; s=a*b; s=a*b; return(s); return(s);6.4.1 函数调用的一般形式6.4 函数的调用函数名(实参表)函数语句:函数语句: 例 printstar(); prin
4、tf(“Hello,World!n”);函数表达式:函数表达式: 例 m=max(a,b)*2;函数参数:函数参数: 例 printf(“%d”,max(a,b); m=max(a,max(b,c);函数的调用方式对被调用函数要求:必须是已存在已存在的函数库函数: #include 用户自定义函数: 函数类型说明函数类型说明函数说明一般形式: 函数类型函数类型 函数名函数名(形参类型形参类型 形参名形参名,. ); 或 函数类型函数类型 函数名函数名();作用:告诉编译系统函数类型、参数个数及类型,以便检验函数定义函数定义与函数说明函数说明不同函数说明位置:程序的数据说明部分(函数内或外)程序
5、的数据说明部分(函数内或外)下列情况下,可不作函数说明若函数返值是若函数返值是char或或int型型,系统自动按int型处理函数说明实参必须有确定的值形参必须指定类型形参与实参类型一致,个数相同类型一致,个数相同若形参与实参类型不一致,自动按形参 类型转换函数调用转换函数调用转换形参在函数被调用前不占内存;函数调用函数调用 时为形参分配内存;调用结束,内存时为形参分配内存;调用结束,内存 释放释放函数参数说明(1)值传递)值传递:函数调用时,为形参分配存储单元为形参分配存储单元, ,并并将实参的值传送到形参中;调用将实参的值传送到形参中;调用结束时结束时,形参单,形参单元释放,实参单元仍保留并
6、维持原值元释放,实参单元仍保留并维持原值特点:形参和实参占用不同不同的内存单元单向单向传递参数传递方式(2)地址传递)地址传递:函数调用时,将数据的存储地址存储地址作为参数传递给形参特点:形参与实参占用同样同样的存储单元实现了数据的“双向双向”传递实参和形参必须是地址地址利用自定义函数计算:1!+2!+5!fact(n) /*阶乘函数*/int i,t=1;for(i=1;i=n;i+)t=t*i;return(t); /*返回阶乘值*/main()int i,sum=0;for(i=1;i=5;i+)sum=sum+fact(i); /*调用阶乘函数,之后进行累加*/printf(sum=%
7、dn,sum);music(hz,t) int i; sound(hz); /*演奏音阶*/ for(i=0;i=t;i+) /*以延时形成节拍*/ delay(2000000000); nosound();模拟电子琴键盘#include#include#include#includemain()char i=1,j;int hz,t;while (i=getch()!=x1b) /*Esc键退出演奏*/ switch(i) casea:hz=262;break; case s:hz=294;break; case d:hz=330;break; case f:hz=349 ;break; c
8、ase 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;else t=10; music(hz,t); 69xy:调用前:调用结束:调用结束:#include swap(int a,int b) int temp; temp=a; a=b; b=temp; main() int x
9、=6,y=9; printf(x=%d,ty=%dn,x,y);swap(x,y); printf(x=%d,ty=%dn,x,y);调用:调用:a:b:swap:temp交换两个变量的值:xy:69699696xy:69b:a:y:x结果:x=6 y=96.5 数组作为参数数组作为参数时:实参数组的首地址传给形参sort(int b) /*形参b长度不定*/ int a11; sort(a); /*实参a长度11*/ 首地址例6-9 调用自定义排序函数对数组排序main()int i,a11=0;void sort(int b11);for(i=1;i=10;i+)scanf(%d,&ai)
10、;sort(a); printf(n);for(i=1;i=10;i+)printf(%6d,ai);/*输出已排序输出已排序的数组的数组a*/*调用*/void sort(int b11)int i,j,t;for(i=1;i=9;i+) for(j=2;jbj-1)t=bj;bj=bj-1;bj-1=t;for(i=1;i=10;i+)printf(%6d,bi);/*自定义函数中自定义函数中输出排序后的输出排序后的数组数组b*/6.6 函数的嵌套主函数main()子函数fun1()子函数fun2()#includemain()int i,j,n,t,t1,t2,s411;void out
11、put(int score411);for(i=1;i=3;i+) printf(no.%d:1-10?,i); for(j=1;j=10;j+)scanf(%d,&sij);for(n=1;n=3;n+) for(i=1;i=9;i+)for(j=2;jsnj-1)t=snj; snj=snj-1;snj-1=t;output(s); void output(int core411)int i,j;print_line(); for(i=1;i=3;i+)printf(n|);for(j=1;j=10;j+)printf(%3d|,scoreij);printf(n);print_line(
12、);print_line()int i;for(i=1;i0):); scanf(%d, &n);y=fact(n);printf(%d!=%ldn, n, y);long fact(int n)long f;if(n=0|n=1) f=1; else f=n*fact(n-1); return(f);/*递归时如果没有“如果”,一定是错误的!*/6.8 外部变量与内部变量内部变量(局部变量): 在一个函数内部起作用外部变量(全局变量): 从定义开始处直到程序结束6.8.1外部变量的定义 (1)在整个函数之前定义。如:float x,y;float average(x,y)float aver
13、;aver=(x+y)/2;return(aver);(2)在整个函数之后定义。如:float average(x,y)float aver;aver=(x+y)/2;return(aver); float x,y; (3)在函数体之前,函数头部。如:float average(x,y)float x,y;float aver;aver=(x+y)/2;return(aver);6.8.2外部变量的作用范围 int x=2;main()void print();int a=x;printf(a=%d x=%dn,a,x);print(a);printf(a=%d x=%dn,a,x);void
14、 print(int a)a+;x+;printf(a=%d x=%dn,a,x);运行结果:a=2 x=2a=3 x=3a=2 x=3/*外部变量*/*a为内部变量*/6.9静态变量和自动变量 静态变量: 赋值后一直保留到程序结束。 自动变量: 每次调用值都可能发生变化静态变量的声明:如:static int a=3; main()void print();int a=2,b=2; static int c=2; printf(a=%d b=%d c=%d n,a,b,c);print(a);print(a);printf(a=%d b=%d c=%d n,a,b,c);/*a,b为自动变量
15、, 只在main中有效*/*c为静态局部变量,只在main中有效*/void print(int a) int b=2; /*a,b为自动变量只在内部有效*/static int c=2; /*c为静态局部变量,只在内部有效*/a+;b+;c+;printf(a=%d b=%dc=%dn,a,b,c);a=2 b=2 c=2a=3 b=3 c=3a=3 b=3 c=4a=2 b=2 c=26.10 变量的存储类别auto:内部变量没有特别声明时register:存取速度极快,但数量有限static:外部变量为静态变量extern:可作特别说明6.11内部函数与外部函数 内部函数:仅在文件内部调
16、用用static定义。如:static func1(int a,int b) 外部函数:可在多个文件中调用用exturn定义。如:exturn func2(int x,int y)本章小结1.学会自定义函数的编写和函数的相互调用关系,是程序设计的基本技能。函数之间是通过函数名和参数来建立联系的。2.主调函数调用其它函数时提供的参数称为实在参数,被调函数中的参数称为形式参数。函数调用时,主调函数将实在参数传递给形式参数。3.当被调用的函数又调用另一个函数时,就出现了函数的嵌套调用。而当一个函数又调用自身的功能时,就出现了递归调用。 4.程序中的变量作用范围是不同的。当一个变量在几个函数中或整个程序中都有效时,就称为全局变量。当一个变量仅在一个函数内部有效时,就称为局部变量,也称为内部变量。5. auto型变量所占存储单元在退出函数时释放;static型变量所占存储单元要到程序结束才释放。6.所有函数可以构成一个源程序文件,也可以构成多个源程序文件。无论有几个源程序文件,最终都要生成一个可执行文件。