C语言程序设计-用函数实现模块化程序设计.ppt_第1页
C语言程序设计-用函数实现模块化程序设计.ppt_第2页
C语言程序设计-用函数实现模块化程序设计.ppt_第3页
C语言程序设计-用函数实现模块化程序设计.ppt_第4页
C语言程序设计-用函数实现模块化程序设计.ppt_第5页
免费预览已结束,剩余68页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,第七章用函数实现模块化程序设计,C语言程序设计,北京航空航天大学交通科学与工程学院徐国艳,本章要点,函数的定义、说明与调用函数之间参数传递规则函数递归调用和嵌套调用变量的存储类型与特性,第七章用函数实现模块化程序设计,一、模块化程序结构,7.1概述,一个较大的应用程序应分为若干个程序模块,每一个模块用来实现一个特定的功能。所有的高级语言都有子程序概念,用子程序实现模块的功能。,在C语言中是利用函数来实现子程序的作用。,采用模块化程序设计的优越性:控制程序设计的复杂性提高软件的可靠性提高软件开发的效率提高软件的可维护性提高程序的重用性,C程序是函数的集合体,每个函数是一个独立的程序模块;有一个主函数,若干个子函数;所有子函数地位平等,可相互调用、自我调用;函数可集中或分散存放在一个或多个源程序文件中。,函数,二、C程序的结构,黑盒子,三、C函数的分类,数学函数(math.h)字符和字符串函数(ctype.h,string.h)I/O函数(stdio.h)动态存储分配函数(stdlib.h或malloc.h),形式,无参函数有参函数空函数,库函数,用户定义函数,详见P384附录F,四、C程序的执行顺序,一个源程序文件,由一个或多个函数以及其他有关内容组成,是一个编译单位,函数不是一个编译单位。C程序的执行总是从main函数开始,调用其它函数后回到main函数,在main函数中结束整个程序的运行;所有的子函数都是平行的,任何子函数都不属于其他函数;,voidmain()printstar();printmessage();,例7-1#include,voidprintstar()printf(“*n”);,voidprintmessage()printf(“Hello,world.n”);printstar();,这两个函数能单独执行吗?,不能,例7-2#includeintmax(intx,inty)intz;z=xy?x:y;return(z);voidmain()inta,b,c;scanf(“%d,%d”,voidprintstar()printf(“*”);,voidfunction(inta,floaty),7.2函数的定义,一、函数定义的一般形式,类型说明函数名(形式参数说明)函数体,形式参数说明方法:类型说明变量名1,类型说明变量名2,1.无参函数的定义形式,类型说明函数名()函数体,2.空函数的定义形式,类型说明函数名(形式参数说明),一般情况下,函数体由两部分组成:局部变量说明语句局部变量:函数体内定义的变量,其有效范围仅在函数内部,离开函数体无意义。,7.2函数的定义,二、函数体组成,c=max(a,b);,7.3函数参数和函数的值,一个C程序由若干个函数组成,各函数调用时经常要传递一些数据,调用函数把数据传递给被调用函数,经被调用函数使用后,一般会返回一个确定结果,在返回调用函数时,把这些结果带回调用函数。,例7-2#includeintmax(intx,inty)intz;z=xy?x:y;return(z);voidmain()inta,b,c;scanf(“%d,%d”,主调函数,intmax(intx,inty)return(z);,被调用函数,a,b,z,各函数的信息往来主要是由参数传递和返回语句实现的,一、形式参数和实际参数,7.3函数参数和函数的值,例7-2#includeintmax(intx,inty)intz;z=xy?x:y;return(z);voidmain()inta,b,c;scanf(“%d,%d”,函数参数用于函数间数据的传递,形式参数:定义函数时使用的参数,实际参数:调用函数时使用的参数,函数max有两个形式参数x和y形参x和y只在max函数中使用,a和b是主函数中定义的变量main函数调用max函数a和b是max函数的实参,23,56,Themaxis56,说明:1.定义函数时,必须说明形参类型,形参只能是变量和数组;2.函数被调用前,形参不占内存,函数调用结束后,内存也被释放;3.实参可以是常量、变量和表达式;4.实参和形参的类型必须一致,字符型和整型可以相互匹配;5.C语言中实参对形参的数据传递是“值传递”,即单向传递,仅由参数的对应位置决定,与名字无关。,一、形式参数和实际参数,7.3函数参数和函数的值,例8-2#includeintmax(intx,inty)intz;z=xy?x:y;return(z);voidmain()inta,b,c;scanf(“%d,%d”,23,56,Themaxis56,例8-2#includeintmax(intx,inty)x=xy?x:y;return(x);voidmain()inta,b,c;scanf(“%d,%d”,例7-2#includeintmax(intb,inta)intc;c=ba?b:a;return(c);voidmain()inta,b,c;scanf(“%d,%d”,一、形式参数和实际参数,7.3函数参数和函数的值,例7-3读程序,写程序结果,#includeintsum(inta,intb)intc;a=a+b;b=a+b;c=a+b;printf(“sum:%d+%d=%dn”,a,b,c);returna;voidmain()inta=1,b=3,c;c=sum(a,b);printf(“main:%d+%d=%dn”,a,b,c);,7.3函数参数和函数的值,二、函数的返回值,1.返回函数值的方法(1)函数的返回值也就是函数的值,如果一个函数有返回值,就必须用return语句;(2)一个函数中可以有多个return语句,无论执行到哪个return语句,都将结束函数调用,返回主调函数。,例8-2#includeintmax(intx,inty)intz;z=xy?x:y;return(z);voidmain()inta,b,c;scanf(“%d,%d”,例8-2#includeintmax(intx,inty)if(xy)return(x);return(z);voidmain()inta,b,c;scanf(“%d,%d”,例7-2#includeintmax(intx,inty)return(xy?x:y);voidmain()inta,b,c;scanf(“%d,%d”,(3)return语句中的括号可以省略,return后面可以是一个表达式,返回的是表达式的值。,2.函数值的类型(1)函数的类型也就是函数值的类型,函数max是int型的,函数max的值也是int型的;(2)省略了类型说明的函数是int型;(3)return语句中的表达式一般应与函数类型一致。如果不一致,需要进行类型转换,只有数值型数据可以进行自动类型转换,以函数类型为准。,例7-2#includeintmax(intx,inty)intz;z=xy?x:y;return(z);voidmain()inta,b,c;scanf(“%d,%d”,7.3函数参数和函数的值,3.不需要返回值的函数(1)如果函数中没有使用return语句,函数返回的是一个不确定的值;(2)如果一个函数不需要返回值,可以用void做类型说明;(3)如果一个函数被声明为void型的,就不允许再引用他的返回值,只能用函数语句形式调用;,7.3函数参数和函数的值,例7-1#includevoidprintstar()printf(“*”);voidprintmessage()printf(“Hello,world.n”);printstar();voidmain()printstar();printmessage();,7.4函数的调用,一.函数调用的一般形式函数名(实参表列),说明:1.如果调用无参函数,实参表列部分没有,但括号不能省略;2.实参的个数和形参个数一般相等;3.实参和形参的类型一一对应,必要时使用类型转换;4.实参变量定义在调用函数之前完成。,例7-2#includeintmax(intx,inty)intz;z=xy?x:y;return(z);voidmain()inta,b,c;scanf(“%d,%d”,二.函数调用的方式,1.函数语句,形式为:函数名(实参表列);,例如:printmessage();printf(“%d”,a);,说明:这种方式不要求函数带返回值,函数仅完成一定的操作。,2.函数表达式,函数的值参与运算,例如:m=max(a,b);m=3*max(a,b);printf(“Themaxis%d”,max(a,b);,说明:这种方式不能用于void类型。,7.4函数的调用,7.4函数的调用,三.函数调用的执行过程,1.按从右到左的顺序,计算实参各表达式的值;2.按照位置,将实参的值一一传给形参;3.执行被调用函数;4.当遇到return(表达式)语句时,计算表达式的值,并返回主调函数。,#includeintsum(intx)inti,t=0;for(i=1;i1;i-)kfactor*=i;returnkfactor;voidmain()intm,n,result;printf(m,n=n);scanf(%d,%d,/求阶乘函数定义,/阶乘函数返回值,7.5函数的嵌套调用和递归调用,一、函数的嵌套调用,main函数调用函数A;,函数A调用函数B;,函数B,调用,调用,返回,返回,voidmain()intn=3;printf(“%dn”,sub1(n);,sub1(intn)inti,a=0;for(i=n;i0;i-)a+=sub2(i);returna;,sub2(intn)returnn+1;,程序输出结果:9,函数调用可以嵌套,7.5.2函数的递归调用,1递归的基本概念,递归调用:一个函数直接或间接地调用了它本身,就称为函数的递归调用。递归函数:在函数体内调用该函数本身。,intsub(intx)inty,z;if()z=sub(y);elsereturn;,例如:,直接调用sub函数本身,2递归函数的执行过程,【例7.16】编一递归函数求n!。,思路:以求4的阶乘为例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。递归结束条件:当n=1或n=0时,n!=1。递归公式:,#includevoidmain()intn,p;printf(n=?);scanf(%d,用递归函数求n!n!=1当n=1时n!=n*(n-1)!当n1时,voidmain()p=fact(4);,fact(4)r=4*fact(3);return24,fact(3)r=3*fact(2);return6,fact(2)r=2*fact(1);return2,fact(1)r=1;return1,递归调用执行过程,递推,回推,3编制递归函数的方法,数值型问题递归函数的编程方法对于数值型问题,首先要找出解题的数学公式,这个公式必须是递归定义的,且所处理的对象要有规律地递增或递减,然后确定递归结束条件。【例8.17】编一递归函数求xn。思路:首先把xn转化成递归定义的公式,再找出递归结束条件:当n=0时,xn=1。,程序如下:,#includelongxn(intx,intn)longf=0;if(nb;若nk,认为数组abi元素个数m:ai=bi元素个数k:aibi元素个数,7.6数组作函数参数,数组名表示数组在内存中的起始地址。例如:数组a在内存中从2000地址开始存放,则a的值为2000。2000是地址值。如实参是数组名,形参应定义为数组形式,形参数组的长度可以省略,但不能省,否则就不是数组形式了。【例8.12】用冒泡法将10个存放在一维数组中的整数排序。,7.6.2一维数组名作函数参数,voidsort(intb,intn);voidprintarr(intb);voidmain()inta10=11,22,63,97,58,80,45,32,73,36;printf(Beforesort:n);printarr(a);sort(a,10);printf(Aftersort:n);printarr(a);,voidprintarr(intb10)inti;for(i=0;i10;i+)printf(%5d,bi);printf(n);,voidsort(intb,intn)inti,j,t;for(i=1;ibj+1)t=bj;bj=bj+1;bj+1=t;,图8.3调用sort函数,2000,b,形参b实际是一个可以存放地址的变量,a:2000,实参赋给形参,#includestdio.hvoidmain()voidscat(charstr1,charstr2);chars150,s250;inti,k;printf(Inputs1:);gets(s1);printf(Inputs2:);gets(s2);scat(s1,s2);printf(Outputs1:%sn,s1);printf(Outputs2:%sn,s2);,voidscat(charstr1,charstr2)inti=0,k=0;while(str1i!=0)i+;while(str2k!=0)str1i=str2k;i+;k+;str1i=0;,以二维数组为例。二维数组名作实参时,对应的形参也应该定义为一个二维数组形式。对形参数组定义时可以指定每一维的大小,也可以省略第一维的大小说明。,思路:将a00b00,a01b10,a02b20,a10b01,aijbji,。,8.6.2多维数组作函数参数,【例8.14】编程序,将矩阵

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论