版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章函数教学目标:1.领会函数在C语言程序中的作用;2.会运用函数调用的原则和参数传递方式;3.会运用简单的递归算法;4.能够分析C语言程序中变量的作用域和生存期。
第6章函数教学目标:1本章结构概述函数的定义函数的参数和返回值函数的调用数组作为函数参数函数的嵌套调用函数的递归调用外部变量与内部变量静态变量与自动变量变量的存储类别多文件程序的编译与连接本章结构概述26.1概述◆C语言程序是一种独特的模块结构,
每个模块都是一个函数◆有且只能有一个名为main的主函数◆main可以调用其他函数,但其他函数不能调用主函数6.1概述3自定义函数的作用自定义函数的作用4函数分类:
从用户角度主函数:名为main的函数标准函数(库函数):由系统提供用户自定义函数从函数形式无参函数有参函数函数分类:
从用户角度5[类型标识符]函数名(形参列表)/*函数头*/{ 说明部分/*函数体*/ 语句部分}例intmax(intx,inty){intz;z=x>y?x:y;return(z);}例无参函数printstar(){printf(“**********\n”);}6.2函数定义的一般形式[类型标识符]函数名(形参列表)/*函数头*/例例66.3函数参数和返回值6.3.1形式参数与实际参数max(intx,inty){intz;Z=x>y?x:y;return(z);}main(){inta,b;a=2;b=3;Printf(“%d”,max(a,b));}实际参数形式参数6.3函数参数和返回值6.3.1形式参数与实际参数max7返回语句形式:return(表达式);
或
return表达式;
或
return;功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数说明:函数中可有多个return语句若无return语句,遇}时,自动返回调用函数6.3.2函数的返回值floatarea(floata,floatb){floats;s=a*b;return(s);}返回语句6.3.2函数的返回值floatarea(flo86.4.1函数调用的一般形式6.4函数的调用函数名(实参表)6.4.1函数调用的一般形式6.4函数的调用函数名(实参9函数语句:例printstar();printf(“Hello,World!\n”);函数表达式:例m=max(a,b)*2;函数参数:例printf(“%d”,max(a,b));m=max(a,max(b,c));函数的调用方式函数语句:函数的调用方式10对被调用函数要求:必须是已存在的函数库函数:#include<*.h>用户自定义函数:函数类型说明函数说明一般形式:函数类型函数名(形参类型[形参名],…..);
或函数类型
函数名();作用:告诉编译系统函数类型、参数个数及类型,以便检验函数定义与函数说明不同函数说明位置:程序的数据说明部分(函数内或外)下列情况下,可不作函数说明若函数返值是char或int型,系统自动按int型处理函数说明对被调用函数要求:函数说明11实参必须有确定的值形参必须指定类型形参与实参类型一致,个数相同若形参与实参类型不一致,自动按形参
类型转换———函数调用转换形参在函数被调用前不占内存;函数调用
时为形参分配内存;调用结束,内存
释放函数参数说明实参必须有确定的值函数参数说明12(1)值传递:函数调用时,为形参分配存储单元,并将实参的值传送到形参中;调用结束时,形参单元释放,实参单元仍保留并维持原值特点:①形参和实参占用不同的内存单元②单向传递参数传递方式(2)地址传递:函数调用时,将数据的存储地址作为参数传递给形参特点:①形参与实参占用同样的存储单元②实现了数据的“双向”传递③实参和形参必须是地址(1)值传递:函数调用时,为形参分配存储单元,并将实参的值传13利用自定义函数计算: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);}}利用自定义函数计算:1!+2!+…5!fact(n)/14music(hz,t){inti;sound(hz);/*演奏音阶*/for(i=0;i<=t;i++)/*以延时形成节拍*/delay(2000000000);nosound();}模拟电子琴键盘music(hz,t)模拟电子琴键盘15#include<stdio.h>#include<dos.h>#include<conio.h>#include<stdlib.h>main(){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);}}
#include<stdio.h>;break;1669xy:调用前:调用结束:#include<stdio.h>swap(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=969xy:调用前:调用结束:#include<stdio.176.5数组作为参数数组作为参数时:实参数组的首地址传给形参sort(intb[])/*形参b长度不定*/{┇}{inta[11];┇
sort(a);/*实参a长度11*/┇
}首地址6.5数组作为参数数组作为参数时:sort(intb[]18例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-9调用自定义排序函数对数组排序main()/*输出已196.6函数的嵌套主函数main()子函数fun1()子函数fun2()6.6函数的嵌套主函数子函数子函数20#include<stdio.h>main(){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('-');}#include<stdio.h>voidoutput(i216.7函数的递归调用实质:子函数自身的调用main(){longfact(int),y;intn;printf("Entern(n>0):");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.7函数的递归调用实质:子函数自身的调用main()l226.8外部变量与内部变量内部变量(局部变量):在一个函数内部起作用外部变量(全局变量):从定义开始处直到程序结束6.8外部变量与内部变量内部变量(局部变量):外部变量(全236.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.1外部变量的定义(1)在整个函数之前定义。如:(2246.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.8.2外部变量的作用范围intx=2;运行结果:/*256.9静态变量和自动变量静态变量:
赋值后一直保留到程序结束。
自动变量:每次调用值都可能发生变化外部变量时静态变量;内部变量如果没有特殊说明都是自动变量6.9静态变量和自动变量外部变量时静态变量;26静态变量的声明:如:staticinta=3;
static类型名变量名;静态变量的声明:static类型名变量名;27main(){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=2main()/*a,b为自动变量,只在main中有效*//286.10变量的存储类别auto:内部变量没有特别声明时register:存取速度极快,但数量有限static:外部变量为静态变量extern:可作特别说明6.10变量的存储类别296.11内部函数与外部函数内部函数:仅在文件内部调用用static定义。如:staticfunc1(inta,intb){}外部函数:可在多个文件中调用用exturn定义。如:exturnfunc2(intx,inty){}6.11内部函数与外部函数内部函数:外部函数:30本章小结1.学会自定义函数的编写和函数的相互调用关系,是程序设计的基本技能。函数之间是通过函数名和参数来建立联系的。2.主调函数调用其它函数时提供的参数称为实在参数,被调函数中的参数称为形式参数。函数调用时,主调函数将实在参数传递给形式参数。3.当被调用的函数又调用另一个函数时,就出现了函数的嵌套调用。而当一个函数又调用自身的功能时,就出现了递归调用。本章小结1.学会自定义函数的编写和函数的相互调用关系,是程序31
4.程序中的变量作用范围是不同的。当一个变量在几个函数中或整个程序中都有效时,就称为全局变量。当一个变量仅在一个函数内部有效时,就称为局部变量,也称为内部变量。5.auto型变量所占存储单元在退出函数时释放;static型变量所占存储单元要到程序结束才释放。6.所有函数可以构成一个源程序文件,也可以构成多个源程序文件。无论有几个源程序文件,最终都要生成一个可执行文件。4.程序中的变量作用范围是不同的。当一个变量在几个函数中32第6章函数教学目标:1.领会函数在C语言程序中的作用;2.会运用函数调用的原则和参数传递方式;3.会运用简单的递归算法;4.能够分析C语言程序中变量的作用域和生存期。
第6章函数教学目标:33本章结构概述函数的定义函数的参数和返回值函数的调用数组作为函数参数函数的嵌套调用函数的递归调用外部变量与内部变量静态变量与自动变量变量的存储类别多文件程序的编译与连接本章结构概述346.1概述◆C语言程序是一种独特的模块结构,
每个模块都是一个函数◆有且只能有一个名为main的主函数◆main可以调用其他函数,但其他函数不能调用主函数6.1概述35自定义函数的作用自定义函数的作用36函数分类:
从用户角度主函数:名为main的函数标准函数(库函数):由系统提供用户自定义函数从函数形式无参函数有参函数函数分类:
从用户角度37[类型标识符]函数名(形参列表)/*函数头*/{ 说明部分/*函数体*/ 语句部分}例intmax(intx,inty){intz;z=x>y?x:y;return(z);}例无参函数printstar(){printf(“**********\n”);}6.2函数定义的一般形式[类型标识符]函数名(形参列表)/*函数头*/例例386.3函数参数和返回值6.3.1形式参数与实际参数max(intx,inty){intz;Z=x>y?x:y;return(z);}main(){inta,b;a=2;b=3;Printf(“%d”,max(a,b));}实际参数形式参数6.3函数参数和返回值6.3.1形式参数与实际参数max39返回语句形式:return(表达式);
或
return表达式;
或
return;功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数说明:函数中可有多个return语句若无return语句,遇}时,自动返回调用函数6.3.2函数的返回值floatarea(floata,floatb){floats;s=a*b;return(s);}返回语句6.3.2函数的返回值floatarea(flo406.4.1函数调用的一般形式6.4函数的调用函数名(实参表)6.4.1函数调用的一般形式6.4函数的调用函数名(实参41函数语句:例printstar();printf(“Hello,World!\n”);函数表达式:例m=max(a,b)*2;函数参数:例printf(“%d”,max(a,b));m=max(a,max(b,c));函数的调用方式函数语句:函数的调用方式42对被调用函数要求:必须是已存在的函数库函数:#include<*.h>用户自定义函数:函数类型说明函数说明一般形式:函数类型函数名(形参类型[形参名],…..);
或函数类型
函数名();作用:告诉编译系统函数类型、参数个数及类型,以便检验函数定义与函数说明不同函数说明位置:程序的数据说明部分(函数内或外)下列情况下,可不作函数说明若函数返值是char或int型,系统自动按int型处理函数说明对被调用函数要求:函数说明43实参必须有确定的值形参必须指定类型形参与实参类型一致,个数相同若形参与实参类型不一致,自动按形参
类型转换———函数调用转换形参在函数被调用前不占内存;函数调用
时为形参分配内存;调用结束,内存
释放函数参数说明实参必须有确定的值函数参数说明44(1)值传递:函数调用时,为形参分配存储单元,并将实参的值传送到形参中;调用结束时,形参单元释放,实参单元仍保留并维持原值特点:①形参和实参占用不同的内存单元②单向传递参数传递方式(2)地址传递:函数调用时,将数据的存储地址作为参数传递给形参特点:①形参与实参占用同样的存储单元②实现了数据的“双向”传递③实参和形参必须是地址(1)值传递:函数调用时,为形参分配存储单元,并将实参的值传45利用自定义函数计算: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);}}利用自定义函数计算:1!+2!+…5!fact(n)/46music(hz,t){inti;sound(hz);/*演奏音阶*/for(i=0;i<=t;i++)/*以延时形成节拍*/delay(2000000000);nosound();}模拟电子琴键盘music(hz,t)模拟电子琴键盘47#include<stdio.h>#include<dos.h>#include<conio.h>#include<stdlib.h>main(){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);}}
#include<stdio.h>;break;4869xy:调用前:调用结束:#include<stdio.h>swap(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=969xy:调用前:调用结束:#include<stdio.496.5数组作为参数数组作为参数时:实参数组的首地址传给形参sort(intb[])/*形参b长度不定*/{┇}{inta[11];┇
sort(a);/*实参a长度11*/┇
}首地址6.5数组作为参数数组作为参数时:sort(intb[]50例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-9调用自定义排序函数对数组排序main()/*输出已516.6函数的嵌套主函数main()子函数fun1()子函数fun2()6.6函数的嵌套主函数子函数子函数52#include<stdio.h>main(){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('-');}#include<stdio.h>voidoutput(i536.7函数的递归调用实质:子函数自身的调用main(){longfact(int),y;intn;printf("Entern(n>0):");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.7函数的递归调用实质:子函数自身的调用main()l546.8外部变量与内部变量内部变量(局部变量):在一个函数内部起作用外部变量(全局变量):从定义开始处直到程序结束6.8外部变量与内部变量内部变量(局部变量):外部变量(全556.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.1外部变量的定义(1)在整个函数之前定义。如:(2566.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.8.2外部变
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论