版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章用函数实现模块化程序设计1WL第7章用函数实现模块化程序设计程序设计的艺术结构化程序设计有两大最高级的艺术算法设计艺术结构设计艺术函数(function)是结构设计的最基本单位“一个程序应该是轻灵自由的,它的子过程就象串在一根线上的珍珠。”GeoffreyJames的《编程之道》2WL第7章用函数实现模块化程序设计模块化程序设计的核心:函数设计。
重要概念:①把解决问题的方案设计成一个个独立的模块。②程序通过调用模块功能来解决问题。③这些模块通过函数来实现,又称为函数模块。④每一个函数具有独立的功能,程序通过各模块之间的协调工作完成复杂的程序功能。3WL第7章用函数实现模块化程序设计数学函数(1)自变量因变量函数名参数函数返回值4WL第7章用函数实现模块化程序设计数学函数(2)一个自变量,一个因变量两个自变量,一个因变量5WL第7章用函数实现模块化程序设计程序设计中的函数程序设计中的函数不局限于计算计算类,如打印阶乘表的程序……判断推理类,如排序、查找……6WL第7章用函数实现模块化程序设计用函数解决问题的要点分而治之函数把较大的任务分解成若干个较小的任务,并提炼出公用任务。复用程序员可以在其他函数的基础上构造程序,而不需要从头做起。信息隐藏设计得当的函数可以把具体操作细节对程序中不需要知道它们的那些部分隐藏掉,从而使整个程序结构清楚。7WL第7章用函数实现模块化程序设计说明:一个源程序文件由一个或多个函数组成。一个C程序由一个或多个源程序文件组成。C程序的执行从main函数开始,调用其他函数后流程回到main函数,在main函数中结束整个程序运行。所有函数都是平行的,即函数定义时是互相独立的,一个函数并不从属于另一个函数。一、C语言中的函数8WL第7章用函数实现模块化程序设计一、C语言中的函数1、作用:函数是C程序的基本单位2、分类:main函数其他函数从程序角度库函数自定义函数从用户角度无参函数有参函数从表现形式举例说明9WL第7章用函数实现模块化程序设计二、函数的定义1、形式:返回值类型函数名(形式参数){声明部分语句}说明:(1)[返回值类型符]指的是函数体语句执行完成后,函数返回值的类型。如int,float,char等。若函数无返回值,则用空类型void来定义函数的返回值。默认情况为int型(有些编译器不支持默认情况)。(2)函数名由任何合法的标识符构成。
建议函数名的命名与函数内容有一定关系。
程序举例
判断正误10WL第7章用函数实现模块化程序设计例如,编写自定义函数abs_sum(),求两个任意整数的绝对值的和。intabs_sum(intm,intn){if(m<0)m=−m;if(n<0)n=−n;return(m+n);}或直接调用系统函数来实现:intabs_sum(intm,intn){return(abs(m)+abs(n));}注意:函数abs()的声明在头文件math.h。11WL第7章用函数实现模块化程序设计三、函数参数和函数的值1、形参和实参:
a、生存期:被调函数(形参)和主调函数(实参)b、类型:一致或兼容c、数据传递方式:值传递(ByVal):一般变量(形参、实参占不同内存单元)地址传递(ByRef):数组名和指针(形参、实参共用内存单元)
实例说明12WL第7章用函数实现模块化程序设计三、函数参数和函数的值2、函数的值:
a、确定的返回值:return语句b、不确定的返回值:无return语句
实例说明13WL第7章用函数实现模块化程序设计四、函数的调用1、调用形式:函数名(实参表列)
2、调用方式:函数语句、表达式
3、对函数的声明:a、库函数:#include(文件包含)命令b、自定义函数:有时需要在主调函数中声明原型
14WL第7章用函数实现模块化程序设计函数声明(函数原型)函数声明语句的形式:
[返回值类型符]函数名([形参说明表]);如:intabs_sun(intm,intn);举例说明
不需要声明的两种情况15WL第7章用函数实现模块化程序设计例1:编写程序,通过调用函数intabs_sum(inta,intb),求任意两个整数的绝对值的和。/*example6_1.c*/#include<stdio.h>intabs_sum(intm,intn);/*函数声明*/main(){intx,y,z;scanf("%d%d",&x,&y);z=abs_sum(x,y);/*函数调用*/printf("|%d|+|%d|=%d\n",x,y,z);}intabs_sum(intm,intn)/*函数定义*/{if(m<0)m=-m;if(n<0)n=-n;returnm+n;}思考:
怎样求任意3个整数的绝对值之和?
intx,y,z,sum;scanf("%d%d%d",&x,&y,&z);sum=abs_sum(abs_sum(x,y),z);printf("|%d|+|%d|+|%d|=%d\n",x,y,z,sum);16WL第7章用函数实现模块化程序设计五、函数中的变量1、按作用域分局部变量:在本函数内部有效。
全局变量:从定义位置到源程序结束均有效。2、按存储类型分静态存储变量:程序运行时有固定的存储空间,程序结束时释放内存单元。动态存储变量:根据需要动态分配和释放内存单元。17WL第7章用函数实现模块化程序设计①局部变量:在函数内部或某个控制块的内部定义的变量。局部变量的作用域:函数内部。作用:增强了函数模块的独立性。②全局变量:在函数外面定义的变量称为全局变量。全局变量的作用域:从该变量定义的位置开始,直到源文件结束。作用:在同一文件中,所有函数都可以引用全局变量。增强了各函数间数据的联系。18WL第7章用函数实现模块化程序设计局部变量和全局变量的作用域如图所示:举例说明19WL第7章用函数实现模块化程序设计
变量的存储类型变量的存储类型指的是变量的存储属性,它说明变量占用存储空间的区域。在内存中,供用户使用的存储区由程序区、静态存储区和动态存储区3部分组成。变量的存储类型:auto、register、static和extern4种。①auto型变量存储在内存的动态存储区;②register型变量保存在寄存器中;③static型和extern变量存储在静态存储器。
变量的作用域和存储类型20WL第7章用函数实现模块化程序设计局部变量的存储类型默认值为auto型。全局变量的存储类型默认值为extern型。注意:①一般情况下,常用auto型、register型定义局部变量。
②static型既可作为局部变量,又可作为全局变量。作为局部变量时,局部变量的值将被保留,若定义时没有赋初值,则系统会自动为其赋0值;作为全局变量时,其有效范围为它所在的源文件,其他源文件不能使用。21WL第7章用函数实现模块化程序设计六、数组作为函数参数1、数组元素作函参(值传递)数组元素的作用等同于简单变量。
如果实参为数组元素,则形参必须是简单变量。2、数组名作函参(地址传递)如果实参为数组名,则形参不允许为简单变量。函数中形参值的改变会引起实参值的改变。
22WL第7章用函数实现模块化程序设计数组元素作函参voidadd(intx){x+=1;}main(){inta[4]={1,2,3,4},i;for(i=0;i<4;i++)add(a[i]);for(i=0;i<4;i++)printf(“%d”,a[i]);}运行结果:123423WL第7章用函数实现模块化程序设计值传递
234a[0]11a[1]a[2]a[3]xa24WL第7章用函数实现模块化程序设计数组名作函参voidadd(intp[4]){inti,t;for(i=0;i<4;i++)p[i]=p[i]+10;}main(){inta[4]={1,2,3,4};add(a);for(i=0;i<4;i++)printf(“%d”,a[i]);}运行结果:1112131425WL第7章用函数实现模块化程序设计地址传递
234a[0]1a[1]a[2]a[3]pp[0]p[1]p[2]p[3]a26WL第7章用函数实现模块化程序设计七、函数的嵌套调用1、嵌套的形式:ABC2、程序举例:a求最小公倍数:27WL第7章用函数实现模块化程序设计八、函数的递归调用1、递归的思想:AA2、调用形式:直接或间接直接递归:在一个函数的定义中出现了对自己本身的调用。
间接递归:一个函数p的定义中包含了对函数q的调用,而q的实现过程又调用了p,即函数调用形成了一个环状调用链。28WL第7章用函数实现模块化程序设计求最小公倍数main(){inta,b;scanf(“%d,%d”,&a,&b);printf(“\n最小公倍数为%d.\n”,gongbei(a,b));}gongbei(intx,inty){return(x*y/gongyue(x,y));}gongyue(intm,intn){inttemp;while(n!=0){temp=m%n,m=n,n=temp;}returnm;}29WL第7章用函数实现模块化程序设计变量的作用范围(1)inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;returnc;}main(){inta=8;printf(“%d%d%d\n”,a,b,max(a,b));}30WL第7章用函数实现模块化程序设计例3:设计一个函数:longfac(intn),用来计算正整数的阶乘,编写程序进行测试。算法的核心思想:对于任意正整数n,如果知道(n−1)!,则n!=n×(n−1)!。可在函数中定义一个static型变量,用来保存每一次阶乘的计算结果。变量的作用范围(2)31WL第7章用函数实现模块化程序设计变量的作用范围(2)intfac(intn){staticintf=1;f=f*n;returnf;}main(){inti;for(i=1;i<=5;i++)printf(“%d!=%d\n”,i,fac(i));}32WL第7章用函数实现模块化程序设计函数的声明main(){floata=2.5,b=3.2,c;floatadd(intx,inty);c=add(a,b);printf(“c=%f\n”,c);}floatadd(intx,inty){return(x+y);}33WL第7章用函数实现模块化程序设计不需声明的两种情况(1)一、被调用函数的定义出现在使用之前floatadd(intx,inty)/*add函数的定义部分*/{return(x+y);}main(){inta=25,b=32;floatc;c=add(a,b);printf(“c=%f\n”,c);}34WL第7章用函数实现模块化程序设计不需声明的两种情况(2)二、被调用函数的声明出现在所有函数之前floatadd(intx,inty);/*add函数的声明部分*/main(){inta=25,b=32;floatc;c=add(a,b);printf(“c=%f\n”,c);}floatadd(intx,inty)/*add函数的定义部分*/{return(x+y);}35WL第7章用函数实现模块化程序设计1.按值传递例#include<stdio.h>voids);//函数声明voidmain(){ inta=3,b=4; printf(“a=%d,b=%d\n”,a,b); s); printf(“a=%d,b=%d\n”,a,b);}voidsx,inty){ intt=x; x=y; y=t;}此程序的运行结果为:a=3,b=4a=3,b=4abxy34343436WL第7章用函数实现模块化程序设计2.地址传递例#include<stdio.h>voids*,int*);//函数声明voidmain(){ inta=3,b=4; printf(“a=%d,b=%d\n”,a,b); s); printf(“a=%d,b=%d\n”,a,b);}voids*x,int*y){ intt=*x; *x=*y; *y=t;}此程序的运行结果为:a=3,b=4a=4,b=3abxy343437WL第7章用函数实现模块化程序设计形参和实参main(){inta=3,b=2;printf("\na=%d,%xb=%d,%x",a,&a,b,&b);my(a,b);}my(intx,inty){printf("\nx=%d,%xy=%d,%x",x,&x,y,&y);}a=3,ffdcb=2,ffde
x=3,ffd8y=2,ffda38WL第7章用函数实现模块化程序设计值传递
3232xyabffd8ffdaffdcffde39WL第7章用函数实现模块化程序设计函数的定义1、无参函数voidprint(){printf(“Iamastudent!”);}2、有参函数intadd(intx,inty){intz;z=x+y;returnz;}
对形参的声明:传统方式和现代方式3、空函数voidqksort(){}40WL第7章用函数实现模块化程序设计对形参的说明传统方式intadd(x,y)intx,y;{intz;z=x+y;returnz;}现代方式intadd(intx,inty)
{intz;z=x+y;returnz;}41WL第7章用函数实现模块化程序设计函数定义-----判断正误
1、doublefun(intx,inty)2、doublefun(x,y)intx,y;3、doublefun(intx;inty)
4、doublefun(intx,inty);
5、doublefun(intx,y)42WL第7章用函数实现模块化程序设计主函数和其他函数main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("max=%d",c);}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}43WL第7章用函数实现模块化程序设计库函数和自定义函数#include<stdio.h>main(){inta,b,c;
scanf("%d,%d",&a,&b);c=max(a,b);
printf("max=%d",c);}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}44WL第7章用函数实现模块化程序设计有参函数和无参函数main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b)+f1();printf("result=%d",c);}intmax(intx,inty)intf1(){intz;{return33;}if(x>y)z=x;elsez=y;return(z);}45WL第7章用函数实现模块化程序设计函数的返回值(1)main(){inta=3,b=2,c;
c=max(a,b);printf("max=%d",c);}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;
return(z);}46WL第7章用函数实现模块化程序设计函数的返回值(2)main(){intmax(int,int);inta=3,b=2,c;
c=max(a,b);printf("max=%d",c);}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;}errorC4716:'max':mustreturnavalue47WL第7章用函数实现模块化程序设计函数嵌套的形式main函数函数A函数B函数A函数B结束48WL第7章用函数实现模块化程序设计递归调用的形式(1)函数1f1(intx,inty){……
f1(m,n);调用函数1……}49WL第7章用函数实现模块化程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年山西电力职业技术学院单招《数学》能力检测试卷及答案详解【基础+提升】
- 2024-2025学年全国统考教师资格考试《教育教学知识与能力(小学)》常考点试卷【真题汇编】附答案详解
- 2024-2025学年度电工经典例题及答案详解【真题汇编】
- 2024-2025学年度法律硕士模拟试题及参考答案详解【培优A卷】
- 2024-2025学年度刑法期末考试考前冲刺练习题附完整答案详解【网校专用】
- 2024-2025学年度电梯考试测试卷含答案详解【B卷】
- 2024-2025学年云南国土资源职业学院妇产护理期末模拟试题带答案详解(考试直接用)
- 农业种植技术与绿色农业实践指南
- 2024-2025学年度专升本全真模拟模拟题附参考答案详解(轻巧夺冠)
- 2024-2025学年反射疗法师大赛理论模考模拟试题及参考答案详解(研优卷)
- 安置帮教普法培训
- 化工仪表检修与维护课件
- 学堂在线 雨课堂 学堂云 海上求生与救生 章节测试答案
- 设计艺术硕士考研复习大纲
- 2025年护理资格知识谵妄理论考试试题及答案
- 市场营销现代广告案例分析报告
- 2026届内蒙古准格尔旗中考数学模拟试题含解析
- 体育跨学科培训:融合与创新
- 次氯酸钠安全评价报告1
- 2024-2025学年高一物理下学期期末复习:圆周运动(讲义)
- T/SHPTA 028-2022硬聚氯乙烯用钙锌复合热稳定剂
评论
0/150
提交评论