版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章函数7.1.1函数概念函数是完成一个特定功效程序段函数也能够是一个重复使用程序段建立函数称为“函数定义”,使用函数称为“函数调用”通常将调用其它函数函数称为“主调函数”,被调用函数称为“被调函数”在C语言中,任何函数都能够是被调函数,也能够是主调函数;而主函数只能是主调函数。任何函数都不能调用主函数第1页每一个函数都能完成一个特定任务,称为“函数功效”每次调用函数时一些待处理数据和函数运行后取得一些结果统称为“函数参数”把主调函数中加工对象带入函数,称为“函数参数输入”把函数运行一些结果带回到主调函数,称为“函数参数输出”参数间输入和输出统称为“函数间数据传递”第2页函数分类从用户角度标准函数(库函数):由系统提供用户自定义函数从函数形式无参函数有参函数使用库函数应注意:1、函数功效2、函数参数数目和次序,及各参数意义和类型3、函数返回值意义和类型4、需要使用包含文件从返回值角度有返回值函数无返回值函数从函数形式无参函数有参函数第3页7.1.2函数定义普通格式正当标识符函数返回值类型缺省int型无返回值void函数体函数类型函数名(形参类型说明表){
说明部分 语句部分}例有参函数intmax(intx,inty){intz;z=x>y?x:y;return(z);}例有参函数intmax(intx,y){intz;z=x>y?x:y;return(z);}例无参函数voidprintstar(){printf(“**********\n”);}或voidprintstar(void){printf(“**********\n”);}第4页7.1.3函数返回值返回语句形式:return(表示式);
或return表示式;
或return;功效:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数说明:函数中可有多个return语句若无return语句,遇}时,自动返回调用函数若函数类型与return语句中表示式值类型不一致,按前者为准,自动转换------函数调用转换void型函数例无返回值函数
voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}第5页例1函数返回值类型转换main(){floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}intmax(floatx,floaty){floatz;z=x>y?x:y;
return(z);}第6页7.1.4函数调用调用形式函数名(实参表);说明:实参加形参个数相等,类型一致,按次序一一对应实参表求值次序,因系统而定(TurboC自右向左)调用方式函数语句:例printstar();printf(“Hello,World!\n”);函数表示式:例m=max(a,b)*2;函数参数:例printf(“%d”,max(a,b));m=max(a,max(b,c));第7页main(){ints;
s=sum(10);
printf(“sum=%d",s);}intsum(intn){inti,s=0;for(i=1;i<=n;i++)s=s+i;return(s);}例2运行结果:sum=55函数定义是平行主函数子函数函数调用是嵌套函数表示式第8页voidprintstar(){printf(“********\n”);}main(){inti;for(i=1;i<=5;i++)
printstar();}例3运行结果:****************************************函数定义是平行子函数主函数函数调用是嵌套函数语句第9页注意:C是函数式语言必须有且只能有一个名为main主函数C程序执行总是从main函数开始,在main中结束函数不能嵌套定义,能够嵌套调用第10页7.1.5模块化程序设计基本思想:将一个大程序按功效分割成一些小模块,特点:各模块相对独立、功效单一、结构清楚、接口简单控制了程序设计复杂性提升软件可靠性缩短开发周期防止程序开发重复劳动易于维护和功效扩充开发方法:
自上向下,逐步分解,分而治之第11页C是模块化程序设计语言C程序结构C是函数式语言必须有且只能有一个名为main主函数C程序执行总是从main函数开始,在main中结束函数不能嵌套定义,能够嵌套调用第12页7.2函数调用时数据传递方法形参加实参形式参数:定义函数时函数名后面括号中变量名实际参数:调用函数时函数名后面括号中表示式c=max(a,b);(main函数)(max函数)max(intx,inty){intz;z=x>y?x:y;return(z);}例比较两个数并输出大者main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);}形参实参第13页说明:实参必须有确定值形参必须指定类型形参加实参类型一致,个数相同若形参加实参类型不一致,自动按形参类型转换———函数调用转换形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放形参加实参形式参数:定义函数时函数名后面括号中变量名实际参数:调用函数时函数名后面括号中表示式第14页例4计算x立方#include<stdio.h>floatcube(floatx){return(x*x*x);}main(){floata,c;printf("Pleaseinputvalueofa:");scanf("%f",&a);c=cube(a);printf(”Cubeof%.4fis%.4f\n",a,c);}xac××××1.21.21.728第15页7.2.1利用形参和值参传递数据值传递方式一、方式:函数调用时,为形参分配单元,并将实参值传递(复制)到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值二、特点:(1)形参加实参占用不一样内存单元(2)单向传递第16页711x:y:调用前:调用结束:711x:y:例5交换两个数#include<stdio.h>main(){intx=7,y=11;printf("x=%d,\ty=%d\n",x,y);printf("swapped:\n");
swap(x,y);printf("x=%d,\ty=%d\n",x,y);}swap(inta,intb){inttemp;temp=a;a=b;b=temp;}调用:711a:b:711x:y:swap:711x:y:117a:b:temp第17页7.2.2当形参是数组(名)时数据传递方式一、方式:函数调用时,将数组名(地址常量,数组首地址),也即存放地址作为参数传递给形参;二、特点:(1)形参加实参占用一样内存单元(2)传递方式是“地址传递方式”,是“双向”传递(3)实参必须是地址常量或变量(4)形参数组名是地址变量(5)在主调函数与被调函数分别定义数组,且类型应一致第18页例6求学生平均成绩#include<stdio.h>
floataverage(ints[10],intn);voidmain(){intscore[10],i;floatav;printf("Input10scores:\n");for(i=0;i<10;i++)scanf("%d",&score[i]);av=average(score,10);printf("Averageis:%.2f",av);}floataverage(int
s[],intn){inti;floatav,total=0;for(i=0;i<n;i++)total+=stu[i];av=total/n;returnav;}实参用数组名形参用数组定义,
ints[]..2109score562312….….88s第19页例7数组排序----简单项选择择排序voidsort(intarray[],intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i; for(j=i+1;j<n;j++) if(array[j]<array[k])k=j; if(k!=i) {t=array[i]; array[i]=array[k]; array[k]=t; }}}main(){inta[10],i;for(i=0;i<10;i++) scanf("%d",&a[i]);
sort(a,10);for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}0123456789a4968573299927137688arraykjjjkjkjjjjj949i=0第20页例7数组排序----简单项选择择排序voidsort(intarray[],intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i; for(j=i+1;j<n;j++) if(array[j]<array[k])k=j; if(k!=i) {t=array[i]; array[i]=array[k]; array[k]=t; }}}main(){inta[10],i;for(i=0;i<10;i++) scanf("%d",&a[i]);
sort(a,10);for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}kjjkjkjjjjj0123456789a4968573299927137688array949kk1368i=1第21页0123456789a9132732495768768899arrayi=8例7数组排序----简单项选择择排序voidsort(intarray[],intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i; for(j=i+1;j<n;j++) if(array[j]<array[k])k=j; if(k!=i) {t=array[i]; array[i]=array[k]; array[k]=t; }}}main(){inta[10],i;for(i=0;i<10;i++) scanf("%d",&a[i]);
sort(a,10);for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}第22页例8求二维数组中最大元素值1357246815173412ijmax=11357246815173412ijmax=31357246815173412ijmax=5j1357246815173412imax=7j1357246815173412imax=7j1357246815173412imax=34intmax_value(intarray[3][4]){inti,j,k,max;max=array[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++) if(array[i][j]>max) max=array[i][j];return(max);}main(){inta[3][4]={{1,3,5,7}, {2,4,6,8},{15,17,34,12}};printf("maxvalueis%d\n",max_value(a));}多维形参数组第一维维数可省略,第二维必须相同
intarray[][4]第23页例9求二维数组中各行元素之和get_sum_row(intx[][3],intresult[],introw,intcol){inti,j;for(i=0;i<row;i++){result[i]=0; for(j=0;j<col;j++) result[i]+=x[i][j];}}main(){inta[2][3]={3,6,9,1,4,7};intsum_row[2],row=2,col=3,i;
get_sum_row(a,sum_row,row,col);for(i=0;i<row;i++)printf("Thesumofrow[%d]=%d\n",i+1,sum_row[i]);}314679asum_rowxresult1812第24页7.2.3当形参是指针变量时数据传递方式一、方式:函数调用时,将变量地址传递给形参(指针变量);二、特点:(1)传递方式是“地址传递方式”,是“双向”传递。要注意是:其实还是属于值传递方式。(2)当形参是指针变量时,实参必须是地址表示式第25页
swap(int*p1,int*p2){intp;p=*p1;*p1=*p2;*p2=p;}main(){inta,b;scanf("%d,%d",&a,&b);printf(“a=%d,b=%d\n”,a,b);printf(“swapped:\n”);swap(&a,&b);printf(”a=%d,b=%d\n",a,b);}例10交换两个数a59b调前:a59b调swap:p1&a&bp2a95b交换:p1&a&bp2a95b返回:第26页7.2.4利用返回值数据传递方式一、方式:利用返回语句二、特点:(1)函数头中要有“数据类型”,以说明函数据返回值数据类型(2)函数体中要有return语句,其中表示式值就是函数返回值(3)函数只能返回回一个值第27页#include<stdio.h>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;i<=n;i++)rtn*=i;
return(rtn);}文件包含编译预处理命令函数定义函数调用函数调用函数返回值形参实参例11第28页7.3变量存放类型和作用域
内存…….main(){inta;a=10;printf(“%d”,a);}编译或函数调用时为其分配内存单元10程序中使用变量名对内存操作第29页变量属性数据类型:变量所持有数据性质(操作属性)存放属性存放器类型:存放器、静态存放区、动态存放区生存期:变量在某一时刻存在-------静态变量与动态变量作用域:变量在某区域内有效-------局部变量与全局变量变量存放类型auto-----自动型register-----存放器型static------静态型extern-----外部型变量定义格式:[存放类型]数据类型变量表;7.3.1变量存放类型概述变量是对程序中数据存放空间抽象如:intsum;
autointa,b,c;
registerinti;
staticfloatx,y;第30页7.3.2变量生存期和作用域1、内部变量与外部变量内部变量:在函数(或复合语句)内定义变量外部变量:在函数外定义变量2、变量生存期
变量在某一时刻存在。当变量占用内存单元时,它是活。将变量从开始分配内存单元到分配内存单元被回收期间称为“变量生存期”第31页(3)局部变量与全局变量局部变量---内部变量定义:在函数内定义,只在本函数内有效说明:main中定义变量只在main中有效不一样函数中同名变量,占不一样内存单元形参属于局部变量可定义在复合语句中有效变量局部变量可用存放类型:autoregisterstatic(默认为auto)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=%d\n",a,b);sub();printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}例复合语句中变量#defineN5main(){inti;inta[N]={1,2,3,4,5};for(i=0;i<N/2;i++)
{
inttemp; temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp;
}for(i=0;i<N;i++)printf("%d",a[i]);}运行结果:54321例复合语句中变量#defineN5main(){inti;inta[N]={1,2,3,4,5};for(i=0;i<N/2;i++)
{
inttemp; temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp;
}for(i=0;i<N;i++)printf("%d",a[i]);}例不一样函数中同名变量main(){inta,b;a=3;b=4;printf("main:a=%d,b=%d\n",a,b);sub();printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4第32页全局变量---外部变量定义:在函数外定义,可为本文件全部函数共用有效范围:从定义变量位置开始到根源文件结束,及有extern说明其它源文件应尽可能少使用全局变量,因为:全局变量在程序全部执行过程中占用存放单元降低了函数通用性、可靠性,可移植性降低程序清楚性,轻易犯错定义
说明次数:只能1次可说明屡次位置:全部函数之外函数内或函数外分配内存:分配内存,可初始化不分配内存,不可初始化外部变量说明:extern数据类型变量表;外部变量定义与外部变量说明不一样若外部变量与局部变量同名,则外部变量被屏蔽外部变量可用存放类型:缺省或static第33页例12外部变量定义与说明intmax(intx,inty){intz;z=x>y?x:y;return(z);}main(){externinta,b;printf("max=%d",max(a,b));}inta=13,b=-8;运行结果:max=13externinta,b;intmax(){intz;z=a>b?a:b;return(z);}main(){printf("max=%d",max());}inta=13,b=-8;第34页/*ch7_17.c*/inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;return(c);}main(){inta=8;printf("max=%d",max(a,b));}例13外部变量与局部变量运行结果:max=8第35页inti;main(){voidprt();for(i=0;i<5;i++)prt();}voidprt(){for(i=0;i<5;i++)printf(“%c”,’*’);printf(“\n”);}例14外部变量副作用运行结果:*****第36页4、变量作用域在变量生存期中,把变量能够使用程序区域称为变量作用域第37页floatmax,min;floataverage(floatarray[],intn){inti;floatsum=array[0];max=min=array[0];for(i=1;i<n;i++){if(array[i]>max)max=array[i];elseif(array[i]<min)min=array[i];sum+=array[i];}return(sum/n);}main(){inti;floatave,score[10];/*Input*/ave=average(score,10);printf("max=%7.2f\nmin=%7.2f\naverage=%7.2f\n",max,min,ave);}作用域maxmin第38页intp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}c1,c2作用范围p,q作用范围externcharc1,c2;externcharc1,c2;c1,c2作用范围扩展后c1,c2作用范围扩展后第39页5动态变量与静态变量存放方式静态存放:程序运行期间分配固定存放空间动态存放:程序运行期间依据需要动态分配存放空间内存用户区程序区静态存放区动态存放区全局变量、局部静态变量形参变量局部动态变量(autoregister)函数调用现场保护和返回地址等生存期静态变量:从程序开始执行到程序结束动态变量:从包含该变量定义函数开始执行至函数执行结束第40页变量存放类型静态动态存放方式程序整个运行期间函数调用开始至结束生存期编译时赋初值,只赋一次每次函数调用时赋初值自动赋初值0或空字符不确定未赋初值静态存放区动态区存放区存放器局部变量外部变量作用域定义变量函数或复合语句内本文件其它文件局部变量默认为auto型register型变量个数受限,且不能为long,double,float型局部static变量含有全局寿命和局部可见性局部static变量含有可继承性extern不是变量定义,可扩展外部变量作用域register局部staticauto外部static外部存放类别第41页例15文件file1.cinta;main(){…….…….f2;…….f1;…….}f1(){autointb;………f2;……..}f2(){staticintc;………}C作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期:第42页例16auto变量作用域main(){intx=1;voidprt(void);
{
intx=3;prt();printf(“2ndx=%d\n”,x);
}printf(“1stx=%d\n”,x);}voidprt(void){intx=5;printf(“3thx=%d\n”,x);}运行结果:3thx=52ndx=31stx=1x=1作用域x=1作用域x=3作用域x=5作用域第43页main(){voidincrement(void);increment();increment();increment();}voidincrement(void){intx=0;x++;printf(“%d\n”,x);}例17局部静态变量值含有可继承性运行结果:111main(){voidincrement(void);increment();increment();increment();}voidincrement(void){staticintx=0;x++;printf(“%d\n”,x);}运行结果:123第44页例18变量寿命与可见性#include<stdio.h>inti=1;main(){staticinta;
registerintb=-10;
intc=0;printf("-----MAIN------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);c=c+8;other();printf("-----MAIN------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);i=i+10;
other();}other(){staticinta=2;staticintb;
intc=10;a=a+2;i=i+32;c=c+5;printf("-----OTHER------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);b=a;}-------Main------i:1a:0b:-10c:0------Other------i:33a:4b:0c:15-------Main-----i:33a:0b:-10c:8-------Other-------i:75a:6b:4c:15全局i1main:a0b:-10registermain:c0静态存放区动态存放区other:a2other:b0other:c10843315443other:c10675156第45页main(){voidgx(),gy();
externintx,y;printf(“1:x=%d\ty=%d\n”,x,y);y=246;gx();gy();}voidgx(){externintx,y;x=135;printf(“2:x=%d\ty=%d\n”,x,y);}intx,y;voidgy(){printf(“3:x=%d\ty=%d\n”,x,y);}例19用extern扩展外部变量作用域运行结果:1:x=0y=02:x=135y=2463:x=135y=246第46页例20引用其它文件中外部变量intglobal;externfloatx;main(){intlocal; . . .}externintglobal;staticintnumber;func2(){ . . .}floatx;staticintnumber;func3(){externintglobal; . . .}file1.cfile2.cfile3.c第47页例21引用其它文件中变量,输出ab和am次方inta;main(){intpower(intn);intb=3,c,d,m;printf("Enterthenumberaanditspower:\n");scanf("%d,%d",&a,&m);c=a*b;printf("%d*%d=%d\n",a,b,c);d=power(m);printf("%d**%d=%d",a,m,d);}externinta;intpower(intn){inti,y=1;for(i=1;i<=n;i++) y*=a;return(y);}第48页7.4函数嵌套与递归调用7.4.1嵌套调用C要求:函数定义不可嵌套,但能够嵌套调用函数main()调用函数a结束a函数b函数调用函数b
第49页例22求三个数中最大数和最小数差值#include<stdio.h>main(){inta,b,c,d;scanf("%d%d%d",&a,&b,&c);
d=dif(a,b,c);printf("Max-Min=%d\n",d);}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}intmax(intx,inty,intz){intr;r=x>y?x:y;return(r>z?r:z);}intmin(intx,inty,intz){intr;r=x<y?x:y;return(r<z?r:z);}main()调用函数dif输出结束dif函数max函数调用函数max调用函数minmin函数第50页7.4.2递归调用定义:函数直接或间接调用本身叫函数递归调用f()调f调f2调f1f1()f2()说明C编译系统对递归函数自调用次数没有限制每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引发堆栈溢出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);}第51页例23求n阶乘
#include<stdio.h>intfac(intn){intf;if(n<0)printf("n<0,dataerror!");elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}main(){intn,y;printf("Inputaintegernumber:");scanf("%d",&n);
y=fac(n);printf("%d!=%15d",n,y);}第52页思索:求xn?1n=0Xn=x*xn-1n>0
#include<stdio.h>intpower(intx,intn){intp;if(n<0)printf("n<0,dataerror!");elseif(n==0)p=1;elsep=x*power(x,n-1);return(p);}main(){intn,x,y;scanf("%d,%d",&x,&n);
y=power(x,n);printf("%d=%d",n,y);}第53页思索:求xn?1n=0Xn=x*xn-1n>0
#include<stdio.h>intpower(intx,intn){intp=1;for(i=1;i<=n;i++)p=p*x;return(p);}main(){intn,x,y;scanf("%d,%d",&x,&n);if(n>=0)y=power(x,n);printf("%d",y);}第54页例24Hanoi问题voidmove(chargetone,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年家政服务员资格考试全真模拟试卷及答案(十三)
- 第12课 我行我秀-动画邀请卡创作教学设计小学信息技术(信息科技)第四册上粤教版
- 口腔科拔牙术后口腔护理指南
- 2025版心血管内科护理策略
- 平面外轮廓的加工教学设计中职专业课-数控铣床编程与操作-数控技术应用-装备制造大类
- 2025版痔疮常见症状及护理措施
- 儿童心理教育成长辅导手册
- 旅行攻略景点游玩最佳路线预案
- 跨境电商物流管理与风险应对策略手册
- 医疗责任积极履行承诺书5篇范文
- 2024年安徽省初中学业水平考试中考数学试卷(真题+答案)
- 广东省佛山市三水区2024年数学八年级下册期末学业水平测试试题含解析
- 22G101三维立体彩色图集
- 第九届全国大学生化学实验邀请赛笔试试题
- 水利工程施工完整危险源辨识及评价
- 高速公路改扩建工程监理实施细则
- 亚洲史越南史大南实录正编列传初集8
- 蛋白质高级结构性质及分离纯化
- 金蝶kis专业版操作手册V2.0
- 五郎河流域特性分析
- RB/T 040-2020病原微生物实验室生物安全风险管理指南
评论
0/150
提交评论