




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章函数8.1概述模块化程序设计若只有main函数,则程序太长、太复杂,导致跟踪、调试、维护困难基本思想:将一个大的程序按功能分割成一些小模块,各部分独立编码、调试、再集成。特点:各模块相对独立、功能单一、结构清晰、接口简单控制了程序设计的复杂性易理解易于维护和功能扩充开发方法:自上向下,逐步分解,分而治之C程序设计第八章函数C程序结构…C是函数式语言必须有且只能有一个名为main的主函数C程序的执行总是从main函数开始,在main中结束函数不能嵌套定义,可以嵌套调用…C程序设计第八章函数函数分类从用户角度标准函数(库函数):由系统提供用户自定义函数从函数形式无参函数有参函数使用库函数的一般方法:1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型4、需要使用的包含文件C程序设计第八章函数8.2自定义函数多函数程序#include"stdio.h"main(){voidprintstar();printstar();printf("ThisisaexampleofuseCfunction\n");printstar();}voidprintstar(){printf("*****************************\n");}函数控制流函数与变量的对比函数名和变量名均以标识符体现函数和变量均有对应的类型,如int函数和变量一样,均要prototypeC程序设计第八章函数函数定义格式函数体合法标识符函数返回值类型缺省int型无返回值void函数类型函数名(形参类型说明表){
说明部分 语句部分
return语句}以上红色的为函数的6个元素C程序设计第八章函数函数类型函数名(形参表)形参类型说明{
说明部分 语句部分}传统风格:例有参函数(传统风格)
intmax(x,y)
intx,y;{intz;z=x>y?x:y;return(z);}C程序设计第八章函数函数类型voidprintstar(){printf("*****************************");}voidsx,inty){inttemp;temp=x;x=y;y=temp;}floatsqure(floatx){return(x*x);}intget_number(void){inttemp=1;returntemp;}intmathoperation(inta,intb,int*s){……}返回多个数据C程序设计第八章函数
返回语句形式:return(表达式);
或
return表达式;
或
return;功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数例无返回值函数
voidsx,inty){inttemp;temp=x;x=y;y=temp;return;}函数中可有多个return语句若无return语句,遇}时,自动返回调用函数若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换——函数调用转换void型函数C程序设计第八章函数函数的调用调用形式函数名(实参表);C程序设计第八章函数例比较两个数并输出大者main(){floata,b;intt;scanf("%f,%f",&a,&b);t=max(a,b);//函数调用
printf("Maxis%d\n",t);}max(floatx,floaty)//函数定义{floatz;z=x>y?x:y;
return(z);}三个数最大值的问题:
t=max(a,max(b,c));C程序设计第八章函数函数调用机制(参数及其传递方式)实际参数:调用函数时函数名后面括号中的表达式形式参数:定义函数时函数名后面括号中的变量名c=max(a,b);(main函数)(max函数)max(intx,inty){intz;z=x>y?x:y;return(z);}main(){inta,b,t;intmax(int,int);scanf("%d,%d",&a,&b);t=max(a,b);printf("Maxis%d",t);}max(intx,inty){intz;z=x>y?x:y;return(z);}形参实参C程序设计第八章函数实参必须有确定的值形参必须指定类型形参与实参类型一致,个数相同若形参与实参类型不一致,自动按形参类型转换——函数调用转换形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放,实参单元仍保留并维持原值。也就是说,形参与实参占用不同的内存单元——单向传递/值传递C程序设计第八章函数例计算x的立方#include<stdio.h>floatcube(floatx){return(x*x*x);}main(){floata,product;printf("Pleaseinputvalueofa:");scanf("%f",&a);product=cube(a);printf(”Cubeof%.4fis%.4f\n",a,product);}xaproduct××××1.21.21.728C程序设计第八章函数printstar(){printf("**********");}main(){inta;a=printstar();printf("%d\n",a);}例函数带回不确定值输出:10voidprintstar(){printf("**********");}main(){inta;a=printstar();printf("%d\n",a);}编译错误!C程序设计第八章函数#include"stdio.h"intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}main(){inti=2,p;p=f(i,++i);printf("%d\n",p);}例参数求值顺序#include"stdio.h"intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}main(){inti=2,p;p=f(i,i++);printf("%d\n",p);}运行结果:0运行结果:1C程序设计第八章函数对被调用函数要求:必须是已存在的函数库函数:#include<*.h>用户自定义函数:函数类型说明要求使用函数之前做函数说明一般形式:函数类型函数名(形参类型[形参名],…..);作用:告诉编译系统函数类型、参数个数及类型,以便检验函数说明位置:程序的数据说明部分(函数内或外)下列情况下,可不作函数说明若函数返值是char或int型,系统自动按int型处理被调用函数定义出现在主调函数之前C程序设计第八章函数例函数说明举例main(){floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);}int型函数可不作函数说明(VC++不行)/**/floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}被调函数出现在主调函数之前,不必函数说明main(){floatadd(float,float);/*functiondeclaration*/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();C程序设计第八章函数711x:y:调用前:调用结束:711x:y:例值传递举例:交换两个数/*swapapairnumber*/#include<stdio.h>main(){intx=7,y=11;
ints,int);printf("x=%d,\ty=%d\n",x,y);printf("s:\n");
s);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:tempC程序设计第八章函数/*callbyaddress*/s*p1,int*p2){intp;p=*p1;*p1=*p2;*p2=p;}main(){inta,b;ints*,int*);scanf("%d,%d",&a,&b);printf(“a=%d,b=%d\n”,a,b);printf(“s:\n”);s);printf(”a=%d,b=%d\n",a,b);}例交换两个数a59b调前:a59b调swap:p1&a&bp2a95b交换:p1&a&bp2a95b返回:C程序设计第八章函数传递数组给函数数组元素作函数实参——值传递例两个数组大小比较432105a562312107688432105b212343986654n=0m=0k=0in=0m=0k=1in=0m=1k=1in=1m=1k=1in=1m=1k=2in=2m=1k=2in=3m=1k=2a和b为有10个元素的整型数组比较两数组对应元素变量n,m,k记录a[i]>b[i],a[i]==b[i],a[i]<b[i]的个数最后若n>k,认为数组a>b
若n<k,认为数组a<b
若n==k,认为数组a==b#include<stdio.h>main(){inta[10],b[10],i,n=0,m=0,k=0;
intlarge(int,int);printf("Enterarraya:\n");for(i=0;i<10;i++) scanf("%d",&a[i]);printf("Enterarrayb:\n");for(i=0;i<10;i++) scanf("%d",&b[i]);for(i=0;i<10;i++){if(large(a[i],b[i])==1)n=n+1;elseif(large(a[i],b[i])==0)m=m+1;elsek=k+1;}/*ThenOutput*/}intlarge(intx,inty){intflag;if(x>y)flag=1;elseif(x<y)flag=-1;elseflag=0;return(flag);}C程序设计第八章函数数组名作函数参数地址传递形参数组大小(多维数组第一维)可不指定。常用方法是用另一参数传递数组长度形参数组名是地址变量C程序设计第八章函数例求学生的平均成绩#include<stdio.h>
floataverage(int[],int);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
stu[10],intn){inti;floatav,total=0;for(i=0;i<n;i++)total+=stu[i];av=total/n;returnav;}实参用数组名形参用数组定义,
intstu[]..2109score562312….….88stuC程序设计第八章函数例数组元素与数组名作函数参数比较12a调用前a[0]a[1]12a调用a[0]a[1]12xy21xy交换12a返回#include<stdio.h>voidswap2(intx,inty){intz;z=x;x=y;y=z;}main(){inta[2]={1,2};
voidswap2(int,int);
swap2(a[0],a[1]);printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);}值传递C程序设计第八章函数12a调用前12ax调用21ax交换21a返回#include<stdio.h>voidswap2(intx[]){intz;z=x[0];x[0]=x[1];x[1]=z;}main(){inta[2]={1,2};voidswap2(int[]);
swap2(a);printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);}数组首地址传递例数组元素与数组名作函数参数比较C程序设计第八章函数例数组排序----简单选择排序0123456789a4968573299927137688arraykjjjkjkjjjjj949i=0C程序设计第八章函数例数组排序----简单选择排序kjjkjkjjjjj0123456789a4968573299927137688array949kk1368i=1C程序设计第八章函数0123456789a9132732495768768899arrayi=8例数组排序----简单选择排序#include"stdio.h"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;voidsort(int[],int);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");}C程序设计第八章函数例求二维数组中最大元素值1357246815173412ijmax=11357246815173412ijmax=31357246815173412ijmax=5j1357246815173412imax=7j1357246815173412imax=7j1357246815173412imax=34#include"stdio.h"intmax_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}};intmax_value(int[][4]);printf("maxvalueis%d\n",max_value(a));}按ANSIC,多维形参数组第一维维数可省略,第二维必须相同
intarray[][4]在VC++中,要求用二级指针C程序设计第八章函数例求二维数组中各行元素之和#include"stdio.h"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_rowxresult1812C程序设计第八章函数8.3函数的嵌套与递归调用嵌套调用p271C规定:函数定义不可嵌套,但可以嵌套调用函数main()调用函数a结束a函数b函数调用函数b
C程序设计第八章函数例求三个数中最大数和最小数的差值#include<stdio.h>voidmain(){inta,b,c,d;intdif(int,int,int);scanf("%d%d%d",&a,&b,&c);
d=dif(a,b,c);printf("Max-Min=%d\n",d);}intdif(intx,inty,intz){intmax(int,int,int);intmin(int,int,int);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函数C程序设计第八章函数例用弦截法求方程根xyf(x)0x1x2xf(x1)f(x2)C程序设计第八章函数求f(x1)与f(x2)连线与x轴的交点x输入x1,x2,求f(x1),f(x2)直到f(x1)与f(x2)异号y=f(x),y1=f(x1)y与y1同号真假x1=xx2=x直到
|y|<
root=x输出
rootroot函数//输入x1,x2,使f(x1)与f(x2)异号floatx1,x2,f1=1,f2=1;for(;f1*f2>=0;){printf("Inputx1,x2:\n");scanf("%f%f",&x1,&x2);f1=f(x1);f2=f(x2);}C程序设计第八章函数运行情况:Inputx1,x2:26
Arootofequationis5.0000main()调用函数root输出根x结束root函数xpoint函数调用函数xpoint调用函数ff函数//直线与x轴的交点xfloatxpoint(floatx1,floatx2){floaty;y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));return(y);}(x,y)令y=0,即得与x轴的交点xC程序设计第八章函数递归调用p272定义:函数直接或间接的调用自身叫函数的递归调用f()调f调f2调f1f1()f2()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);}C程序设计第八章函数例求n的阶乘/*factorial*/#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);}C程序设计第八章函数例Hanoi问题#include"stdio.h"voidmove(chargetone,charputone){printf("%c--->%c\n",getone,putone);}voidhanoi(intn,charone,chartwo,charthree){if(n==1)move(one,three);else{hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three);}}main(){intm;printf("Inputthenumberofdisks:");scanf("%d",&m);printf("Thestepstomoving%3ddisks:\n",m);hanoi(m,'A','B','C');}ABCC程序设计第八章函数C编译系统对递归函数的自调用次数没有限制每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出C程序设计第八章函数6.4变量的存储属性p279概述变量是对程序中数据的存储空间的抽象main(){inta;a=10;printf(“%d”,a);}编译或函数调用时为其分配内存单元…….10C程序设计第八章函数局部变量局部变量---内部变量规则:在函数内定义,只在本函数内有效不同函数中同名变量,占不同内存单元。形参属于局部变量#include"stdio.h"main(){inta,b;intsub();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);}局部变量可用存储类型:
auto(默认)registerstatic可定义在复合语句中有效的变量#include"stdio.h"#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]);}C程序设计第八章函数#include<stdio.h>main(){voidincrement(void);increment();increment();increment();}voidincrement(void){intx=0;x++;printf(“%d\n”,x);}例观察局部静态变量运行结果:111#include<stdio.h>main(){voidincrement(void);increment();increment();increment();}voidincrement(void){staticintx=0;x++;printf(“%d\n”,x);}运行结果:123C程序设计第八章函数全局变量/外部变量规则:在函数外定义,可为本文件所有函数共用。可用存储类型:
缺省或static有效范围:从定义变量的位置开始到本源文件结束,及有extern声明的其它源文件当外部变量与局部变量同名时,外部变量被屏蔽C程序设计第八章函数#include"stdio.h"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=%6.2f\nmin=%6.2f\naverage=%6.2f\n",max,min,ave);}作用域maxminC程序设计第八章函数例外部变量定义及其声明intmax(intx,inty){intz;z=x>y?x:y;return(z);}#include"stdio.h"main(){externinta,b;
intmax(int,int);printf("max=%d\n",max(a,b));}inta=13,b=-8;externinta,b;intmax(){intz;z=a>b?a:b;return(z);}#include"stdio.h"main(){printf("max=%d",max());}inta=13,b=-8;C程序设计第八章函数
定义
声明次数:只能1次可说明多次位置:所有函数之外函数内或函数外内存:分配内存不分配内存
可初始化
不可初始化外部变量定义与声明的区别:应尽量少使用全局变量C程序设计第八章函数#include"stdio.h"inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;return(c);}main(){inta=8;printf("max=%d\n",max(a,b));}例外部变量被局部变量屏蔽C程序设计第八章函数
回顾第四章求定积分的例题,其算法如下:例p292Onemethodofcalculatingtheareaunderacurveistodividetotheareaintoanumberoftrapezoidsofsamewidthandsumminguptheareaofindividualtrapezoids.Theareaofatrapezoidisgivenbyarea=0.5*(h1+h2)*b;f(x)isthefunctionofcurve,h1=f(x1);h2=f(x2);
现在我们把算法分为两个模块:初始化a,b,梯形个数;求梯形面积总和0yxaa+ha+iha+(i+1)hbf(x)C程序设计第八章函数存储方式和生存期存储方式静态存储:程序运行期间分配固定存储空间动态存储:运行期间根据需要动态分配存储空间内存区程序区静态存储区动态存储区全局变量、局部静态变量形参变量局部动态变量(autoregister)函数调用现场保护和返回地址等生存期静态变量:从程序开始执行到程序结束动态变量:从包含该变量定义的函数/复合语句至函数/复合语句结束C程序设计第八章函数变量存储类型静态动态
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 吉林水利电力职业学院《仪表自动化》2023-2024学年第二学期期末试卷
- 山东协和学院《中级朝鲜语》2023-2024学年第一学期期末试卷
- 吉林省白城市2024-2025学年初三下学期开学考试语文试题含解析
- 物流是物品从供应地向接受地的实体流动过程
- 城市配送与物流配送环节的快速响应考核试卷
- 矿用设备智能制造关键技术考核试卷
- 外汇市场新闻事件的解读与风险管理考核试卷
- 气候变化适应与减缓咨询考核试卷
- 残疾人康复护理培训考核试卷
- 水泥生产过程质量控制考核试卷
- 湖北省武汉市武昌区七校2023-2024学年九年级下学期期中数学试题
- 特种设备使用管理新版规则
- 集中供热老旧管网改造工程施工方案及技术措施
- 军事科技现状及未来发展趋势分析
- 人教版数学五年级下册分数比较大小练习100题及答案
- DB21-T 3031-2018北方寒区闸坝混凝土病害诊断、修补与防护技术规程
- JJF(新) 116-2023 微机盐含量测定仪校准规范
- 创伤性硬膜下出血的健康教育
- 光电编码器课件
- 马原演讲之谁是历史的创造者
- 《人类征服的故事》读后感
评论
0/150
提交评论