您好,欢迎访问三七文档
第八章函数第八章函数§8.1概述C语言是结构化程序设计语言基本思想:将复杂的程序分解为功能单一的小模块分别实现,再把所有的模块装配起来。在C语言中,函数是程序的基本单位。开发方法:自上向下,逐步分解C是模块化程序设计语言源程序文件1预编译命令说明部分执行部分函数1函数n源程序文件i源程序文件nC程序C程序结构C语言是函数式语言必须有且只能有一个名为main的主函数C程序的执行总是从main函数开始,在main中结束…例8.1函数调用的简单例子。voidmain(){voidprintstar();voidprint_message();printstar();print_message();printstar();}voidprintstar(){printf(“***********\n”);}voidprint_mesaage(){printf(“Howdoyoudo!\n”);}*************Howdoyoudo!*************函数分类从用户角度标准函数(库函数):由系统提供用户自定义函数从函数形式无参函数有参函数§8.2函数的定义一般格式合法标识符函数返回值类型无返回值void函数体函数类型函数名(形参类型说明表){说明部分语句部分}例:有参函数intmax(intx,inty){intz;z=xy?x:y;return(z);}例:有参函数intmax(intx,y){intz;z=xy?x:y;return(z);}例:空函数dummy(){}函数体为空例:无参函数voidprintstar(){printf(“**********\n”);}§8.3函数参数和函数的值8.3.1形参与实参形式参数:定义函数时函数名后面括号中的变量名实际参数:调用函数时函数名后面括号中的表达式c=max(a,b);(main函数)(max函数)max(intx,inty){intz;z=xy?x:y;return(z);}例8.2:调用函数时的参数传递。voidmain(){inta,b,c;intmax(intx,inty);scanf(%d,%d,&a,&b);c=max(a,b);printf(Maxis%d,c);}intmax(intx,inty){intz;z=xy?x:y;return(z);}形参实参说明:实参必须有确定的值形参必须指定类型形参与实参类型一致,个数相同形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放38voidmain(){inta,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(Maxis%d,c);}intmax(intx,inty){intz;z=xy?x:y;return(z);}输入:3,8输出:Maxis8main:abcmax:xyz3888§8.3.2函数的返回值函数的返回语句:形式:return(表达式);或return表达式;或return;功能:使程序控制从被调用函数返回到调用函数中,同时把返回值带给调用函数.intmax(intx,inty){intz;z=xy?x:y;return(z);}voidprintstar(){printf(“**********\n”);return;}例8.3:函数返回值类型转换。voidmain(){floata,b;intc;scanf(%f,%f,&a,&b);c=max(a,b);printf(Maxis%d\n,c);}intmax(floatx,floaty){floatz;z=xy?x:y;return(z);}§8.4函数的调用调用形式函数名(实参表);例如:max(a,b);说明:实参与形参个数相等,类型一致,按顺序一一对应函数调用方式以独立的函数语句调用:例:printstar();printf(“Hello,World!\n”);函数的调用出现在表达式中:例:m=max(a,b)*2;作为其他函数的参数:例:printf(“%d”,max(a,b));m=max(a,max(b,c));对被调用函数的声明:使用库函数:#include*.h使用用户自定义函数:函数类型说明例8.5:函数声明举例floatadd(floatx,floaty){floatz;z=x+y;return(z);}voidmain(){floata,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sumis%f,c);}被调函数出现在主调函数之前,不必函数说明#includestdio.hvoidmain(){floatadd(float,float);/*函数说明*/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);}或floatadd();§参数传递方式(包括值传递方式、地址传递方式)值传递方式当形参为简单变量时方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值711x:y:调用前:调用结束:711x:y:例:交换两个数的值。#includestdio.hvoidswap(int,int);voidmain(){intx=7,y=11;printf(x=%d,\ty=%d\n,x,y);swap(x,y);实参printf(x=%d,\ty=%d\n,x,y);}voidswap(inta,intb)形参{inttemp;temp=a;a=b;b=temp;}调用:711a:b:711x:y:swap:711x:y:117a:b:tempx=7,y=11x=7,y=11main:xy711swap:ab711值传递方式特点:值单向传递形参与实参占用不同的内存单元调用结束,形参单元被释放实参单元仍保留并维持原值711#includestdio.hlongsum(inta,intb);longfactorial(intn);voidmain(){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);}文件包含编译预处理命令函数类型说明函数定义函数调用函数调用函数返回值形参实参地址传递方式:函数调用时,将数据的存储地址作为参数传递给形参特点:形参与实参占用同样的存储单元“双向”传递实参和形参必须是地址常量或变量§8.7数组作为函数参数数组元素作函数实参——值传递#includestdio.hvoidmain(){voidswap(int,int);inta[2]={5,8};swap(a[0],a[1]);printf(“%d%d\n”,a[0],a[1]);}voidswap(inta,intb){inttemp;temp=a;a=b;b=temp;}数组名作函数参数地址传递在主调函数与被调函数分别定义数组,且类型应一致形参数组大小(多维数组第一维)可不指定形参数组名是地址变量379106754201234567892317例:将数组a中的n个整数按相反顺序存放ijijijijjivoidinverse(intx[],intn){intt,i,j;for(i=0;in/2;i++){j=n-1-i;t=x[i];x[i]=x[j];x[j]=t;}}voidmain(){inti,a[10]={3,7,9,1,0,6,7,5,4,2};inverse(a,10);for(i=0;i10;i++)printf(%d,,a[i]);printf(\n);}实参与形参均用数组605947例:编写函数,求学生的平均成绩.#includestdio.hfloataverage(intstu[10],intn);voidmain(){intscore[10],i;floatav;printf(Input10scores:\n);for(i=0;i10;i++)scanf(%d,&score[i]);av=average(score,10);printf(Averageis:%.2f,av);}floataverage(intstu[10],intn){inti;floatav,total=0;for(i=0;in;i++)total+=stu[i];av=total/n;returnav;}实参用数组名形参用数组定义,intstu[]..2109score562312….….88stu例:数组元素与数组名作函数参数的比较.12a调用前a[0]a[1]12a调用a[0]a[1]12xy21xy交换12a返回#includestdio.hvoidswap2(intx,inty){intz;z=x;x=y;y=z;}voidmain(){inta[2]={1,2};swap2(a[0],a[1]);printf(a[0]=%d\na[1]=%d\n,a[0],a[1]);}值传递12a调用前12ax调用21ax交换21a返回#includestdio.hvoidswap2(intx[]){intz;z=x[0];x[0]=x[1];x[1]=z;}main(){inta[2]={1,2};swap2(a);printf(a[0]=%d\na[1]=%d\n,a[0],a[1]);}地址传递例:数组元素与数组名作函数参数的比较。例:编写函数,求二维数组中最大元素值。intmax_value(intarray[][4]){inti,j,k,max;max=array[0][0];for(i=0;i3;i++)for(j=0;j4;j++)if(array[i][j]max)max=array[i][j];return(max);}voidmain(){inta[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};printf(maxvalueis%d\n,max_value(a));}形参是多维数组第一维维数可省略,第二维必须相同例:编写函数,求二维数组中各行元素之和。voidget_sum_row(intx[][3],introw,intcol,intresult[]){inti,j;for(i=0;irow;i++){result[i]=0;for(j=0;jcol;j++)result[i]+=x[i][j];}}voidmain(){inta[2][3]={3,6,9,1,4,7};introw_sum[2],row=2,col=3,i;get_row_sum(a,row,col,row_sum);for(i=0;irow;i++)printf(Thesumofrow[%d]=%d\n,i+1,sum_row[i]);}314679asum_rowxresult1812§8.5函数的嵌套调用嵌套调用C规定:函数定义不可嵌套,但可以嵌套调用函数.main()调用函数a结束a函数b函数调用函数b例:求三个数中最大数和最小数的差值。#includestdio.hintdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz
本文标题:xy第八章函数
链接地址:https://www.777doc.com/doc-3903857 .html