版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章函数模块化程序设计基本思想:将一个大的程序按功能分割成一些小模块,特点:各模块相对独立、功能单一、结构清晰、接口简单控制了程序设计的复杂性提高元件的可靠性缩短开发周期避免程序开发的重复劳动易于维护和功能扩充开发方法:自上向下,逐步分解,分而治之函数分类从用户角度标准函数(库函数):由系统提供用户自定义函数(1)在程序中要调用某个库函数,则要用预处理命令#include将该函数所在的头文件包含到程序中(2)要正确使用一个库函数,取得预期的结果,程序设计人员需要准确理解库函数,函数的功能描述和函数原型。使用库函数应注意:1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型4、需要使用的包含文件5.2函数的定义与调用5.2.1函数定义类型说明
函数名(含类型说明的形式参数表){
说明部分
执行部分}intadd(intx,inty){
intz;z=x+y;return(z);}例5.1输入两个正整数m,n(m>n),计算从m个元素中任取n个元素的组合数。计算公式为:在该问题的求解中,需要三次计算阶乘值:如果有一个函数可以提供求阶乘的功能,调用三次就可以解决问题了。可以自行编写求阶乘的函数。函数编写如下:longfac(intx){
inti;longf=1;for(i=1;i<=x;i++)
f=f*i;return(f);}1.主调函数与被调函数main函数是一个程序的执行入口程序的执行是从main函数开始的其它函数必须由main函数调用才能得到执行。1.形式参数与实际参数形式参数:在函数定义的函数首部,函数名后的括号中说明的变量,简称形参。形参的个数可以有多个,多个形参之间用逗号隔开。实在参数:函数被调用时,在调用处给出对应的参数,简称实参,实参往往是具有明确值的常量、变量或表达式等。在编译程序时,系统并不给形参分配内存空间。在函数被调用时,形式参数才临时占有存储空间,并从对应的实在参数获得值。main(){inta=10,b=24,sum;sum=add(a,b);printf(”sum=%d\n",sum);}intadd(intx,inty){intz;z=x+y;return(z);}2.函数值的返回在函数体中,对形式参数接收的数据进行具体操作,并应该在函数体的最后将处理结果返回给主调函数。返回处理结果必须采用return语句完成。return语句的形式:
return(表达式);或
return表达式;return语句执行后,程序将退出被调函数,被调函数携带函数值返回主调函数,在主调函数中继续执行。intadd(intx,inty){intz;z=x+y;
return(z);}
1.无参函数与无返回值的函数(1)无参函数函数的定义中可以没有形式参数,称为无参函数。intprintstar(){
printf("************\n");return1;}(2)无返回值的函数函数返回值的类型应定义为void,即表示“空类型”,在函数体中,return语句可以省略。voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}例5.2设计一个函数,其功能是分解并打印出参数x的各个素数因子。如:36=1*2*2*3*3。voiddivisor(intx){
inti;
printf("%d=1",x);for(i=2;i<=x;i++)
{while(x%i==0){
printf("*%d",i);x=x/i;}}}5.2.2函数调用
函数调用是使函数实际执行的过程。格式:
函数名(实在参数表)longfac(intx);/*函数原型说明*/main(){intm,n,c;
printf("inputm,n:");
scanf("%d%d",&m,&n);if(m>n){c=fac(m)/(fac(n)*fac(m-n));
printf("c(%d,%d)=%d\n",m,n,c);}elseprintf("inputdataerror\n");}对在程序中除main之外的所有函数进行原型说明intcmn(intm,intn);longfac(intx)main()/*main函数*/{intm,n,c;┇}longfac(intx)/*fac函数*/{inti;longf=1;┇}intcmn(intm,intn);/*cmn函数*/
{┇}1.
根据函数有无返回值,可以将调用方式分为两种
(1)对于有返回值的函数的调用,通常作为表达式的一部分。定义一个max函数,其功能是返回两个值中的大数用max(a,max(b,c))这样的函数调用得到a,b,c三者中的大者。可以看到,一次函数调用能够作为另一次函数调用的实参。
(2)对于无返回值的函数,函数的调用通常作为一个语句对于例5.2所示的函数可以给出如下的main函数进行调用:voiddivisor(intx);/*函数原型说明*/main(){intn;
printf("inputn:");
scanf("%d",&n);divisor(n);}
1.
函数的调用过程函数调用过程是使函数得到执行的过程,有以下步骤:
(1)根据函数名找到被调函数,若没找到,系统将报告出错信息。
(2)计算实在参数的值。
(3)将实在参数的值传递给形式参数。
(4)中断在主调函数中的执行,转到被调函数的函数体中开始执行。
(5)遇到return语句或函数结束的花括号时,返回主调函数。(6)从主调函数的中断处继续执行1.
参数的结合问题在函数调用时,将实参值传给对应的形参注意(1)实参的个数和形参的个数应该相等(2)实参与形参的应该在顺序上一一对应,(3)实参的类型一般应该与对应形参的类型相同(4)C语言中实参与形参的结合是一种传值方式
将实参的值拷贝一份传递给对应的形参(5)如形参的值发生改变,不影响实参的值。例5.3
参数结合示例。intchange(intx,inty);main(){
inta,b,m;
printf("inputtwodata:");
scanf("%d%d",&a,&b);m=change(a,b);
printf("a=%db=%dm=%d",a,b,m);}intchange(intx,inty){x++;y--;returnx*y;}5.3变量作用域所谓变量的作用域,是指一个变量有效的范围根据变量作用范围不同,变量分为局部变量和全局变量5.3.1局部变量所谓局部变量,是指定义在一个程序块(函数)中的变量1.局部变量的定义位置及作用域①在函数体的开始处。②在复合语句的开始处它的作用范围只是定义它的程序块2.对于局部变量的补充说明(1)不同函数中的变量可以同名,它们互不影响(2)形式参数也属于局部变量(3)main函数中定义的变量也只能在main函数中有效(4)main函数中,不能引用其他函数中定义的局部变量3.局部变量的初始值与初始化自动变量定义时所分配的存储单元中原来存放的值就是该变量的初始值,是一个不确定的值变量在必要时必须先赋值,后引用。所谓变量的初始化就是在定义变量的同时,给该变量一个确定的值。如:
inti,s=0;for(i=1;i<=10;i++)s=s+i;5.3.2全局变量全局变量是指在任何函数之外定义的变量有效范围是从定义开始,直至整个程序结束定义一个全局变量的目的就是让多个函数可以共享全局变量的定义在函数外定义inta,b=3;main(){inti,j;….}charch;floatadd(floatx,floaty){…..}
1.全局变量的初始值全局变量在编译阶段分配内存,在执行阶段不释放全局变量只进行一次初始化,并且只能用常量如果程序中没有给全局变量初始化,系统自动置02.全局变量的作用增加函数间数据的联系通道以及数据共享。主要表现在:(1)
如果在一个程序的开始处定义了全局变量,则这个程序中的所有函数都能引用全局变量,在一个函数中改变了全局变量的值,其他函数中就可以访问这个改变了的变量,相当于多了一个数据传递的通道。(2)
由于函数的调用只能带回一个返回值,在需要带回两个以上的结果时,可以使用全局变量。例5.8利用函数完成交换两个变量的值。inta,b;main(){voidswap(void);
scanf("%d,%d",&a,&b);
printf("a=%d,b=%d\n",a,b);swap();
printf("a=%d,b=%d\n",a,b);}voidswap(void){intc;c=a;a=b;b=c;}5.4函数的嵌套与递归5.4.1函数的嵌套调用在C语言中,函数调用允许嵌套,所谓函数的嵌套调用是指在一个函数调用另一个函数的过程中,被调函数又调用了另一个函数。
5.4.2函数的递归调用函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。intf(intx){
inty;y=x*f(x-1);returny;}例5.10用递归法计算n!。分析:求解n的阶乘实际上有两种方法,一种是递推法,它是基于公式:
n!=1*2*3*┅*n
实现方法是用循环完成。另一种方法是递归方法,它是基于公式:1(n=1)n!=n*(n-1)!(n>1)可以看出,这是一个递归的定义。按公式可编程如下:#include<stdio.h>longfac(intn);/*求阶乘函数原型声明*/main(){intn;longy;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宇宙与星系科普
- 中国古代文学的文化精神
- 探索神舟十二号的宇航精神
- 2026年自考00637跨文化交际试题及答案
- 造价咨询进度保证体系优化方案
- 胖东来零售服务边界拓展与品质保障体系构建
- 下肢肌挛缩的护理
- 2025浙江宁波余姚市四明臻货品牌运营管理有限公司招聘4人笔试历年备考题库附带答案详解
- 2025河南资本集团投资公司招聘5人笔试历年备考题库附带答案详解
- 2025江西吉安市永新县薪火人力资源服务有限公司面向社会招聘笔试安排以及调整入闱要求笔试历年典型考点题库附带答案详解
- 《民营经济促进法》解读与案例分析课件
- 宠物疾病诊疗技术课件
- 2024年交通标志大全:课件详解
- 《监察法》教学大纲
- 意识形态分析研判制度
- 光伏板智能清扫机器人结构设计
- 2024年四川省绵阳市高考语文一诊试卷
- GB/T 43917.3-2024焊接烟尘捕集和分离设备第3部分:焊枪上烟尘吸气装置捕集效率的测定
- 建筑工程行业的建筑科技与科技创新
- 电源用导热有机硅灌封胶
- 2023年铜陵市社区工作者招聘考试真题
评论
0/150
提交评论