收藏 分销(赏)

一个较大的程序一般要划分成多个程序模块.ppt

上传人:s4****5z 文档编号:14027376 上传时间:2026-06-09 格式:PPT 页数:60 大小:338KB 下载积分:10 金币
下载 相关 举报
一个较大的程序一般要划分成多个程序模块.ppt_第1页
第1页 / 共60页
一个较大的程序一般要划分成多个程序模块.ppt_第2页
第2页 / 共60页


点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,第,8,章 函 数,8.1,概述,一个较大的程序一般要划分成多个程序模块,或把多次重复执行的一段程序独立编写一个模块,这些模块称为函数,一个,C,程序就是由一个主函数和若干函数构成的。,main(),a,b,c,d,e,h,g,f,i,j,主,函,数,函数,1,函数,2,函数,2,1,第,8,章 函 数,例,8.1,main(),printstar,();,print_message,();,printstar,();,printstar,(),printf,(*n);,print_message,(),printf,(*How do you do!*n);,主函数,调用打印星号函数,调用打印信息函数,再调用打印星号函数,打印星号函数,打印信息函数,2,关于函数说明:,一个源程序由若干函数组成,源文件为编译单位,即一次全部编译完。,2.,一个,C,程序可由一个或若干个源文件组成,可,别编辑、编译。经连接生成可执行文件。,3.,一个,C,程序从,main,函数开始,在,main,函数中结束。,main();,。,4.,所有函数都是平行的,即相互独立,互不从属。,5.,从用户角度,函数分为:,(,1,)标准函数(如,:,数学计算,字符处理),(,2,)用户定义的函数:解决专门问题。,3,6,、从函数形式上,分为:,(,1,)有参函数:主调用函数和被调函数之间,有参数传递。,主调用函数,(,实参,),被调函数,(,形参,),(,2,)无参函数:主调函数和被调函数之间无 参数传递,一般被调函数也 不带回返回值。,传送,4,8.2,函数定义的一般形式,1,、无参函数的定义形式:,类型标识符 函数名(),说明部分 语句,无参函数无返回值,可省略类型标识符符。,如:,printstar,(),printf,(“*n”);,5,2,、,有参函数定义的一般形式:,类型标识符 函数名,(,形式参数列表,),声明部分 语句,例,:,int,max(x,y),int,x,y;,int,z;,z=xy?x:y;,return(z,);,声明部分,声明部分,定义整型函数,max(),函数,max,的返回值,6,3,、,允许有空函数的存在,形式为,:,类型表示符 函数名,(),如:,int,max(a,b),int,a,b;,int,max(),函数,max,的返回值,一般是待编函数,7,8.3,函数参数和函数的值,8.3.1,形式参数和实际参数,形式参数:在定义函数时函数名后面括号中的,变量名称形式参数,简称,形参,。,实际参数:在调用函数时函数名后面括弧中的,表达式称实际参数,简称,实参,。,举例说明:,main(),主函数调用前面定义的,max,函数,:,8,main(),int,a,b,c,;,scanf(%d,%d,&a,c=,max(a,b,);,printf(Max,is%,d,c,);,max(int,x,int,y),int,z;,z=x,y?x:y,;,return(z);,实参,形参,形参声明,给返回参数赋值,返回,max,的值,9,关于形参和实参的说明:,1,、形参在函数没被调用时,不分配内存单元;,只有被调用时才分配,调用结束后释放。,2,、实参可以是常量、变量或表达式,但要有确,定值。形参如果是数组名,则将数组的首地,址传递给对应的形参。,3,、在被定义的函数中,必须指定形参类型。,如:,max(,int,x,int,y);,4,、形参与实参对应的类型和个数必须一致。,如,:,max(a,b,)max(,int,x,int,y);,10,关于形参和实参的说明:,5,、实参对形参变量的数据传递是,“,值传递,”,,形参值的改变并不会改变主调函数实参值。,6,、,ANSIC,允许在列出形参列表时同时定义类型。,int,max(int,x,int,y),等价于:,int,max(x,y),int,x,int,y ,11,8,.3.2,函数的返回值,主函数调用函数得到返回值。对返回值说明,:,1,、,函数返回值通过,return,语句获得,:,一个函数中可以包含,多个,return,语句,但只,能有一个起作用。以下,retutrn,形式都可以:,return z;,或,return(z,);,或,return(x,y?x:y,);,2,、定义函数类型必须与返回值类型一致。,int,max(float,x,float,y),int,z;return z,char,letter(char,c1,char c2)char creturn c,double,min(int,x,int,y)double z;return z,12,8,.3.2,函数的返回值,主函数调用函数得到返回值。对返回值说明,:,3、,函数返回值类型不同于函数类型时,自动转,换为函数类型。,max(float,x,float,y);,float z;return(z),4、如果函数中不使用,return,语句,函数将带回,一不确定的值。,5、为了明确表示“不带回值”可用,void,定义函数,为无类型(空类型)。,因,max,是整型所以,z,转换为整型,13,main(),float a,b;,int,c;,scanf(%f,%f,&a,&b,);,c=,max(a,b,);,printf(Max,is%,d,c,);,max(x,y,),float,x,y,;,float z;,z=x,y?x:y,;,return(z);,定义为实型,默认为整型,输出整型数,14,main(),float a,b;,int,c;,scanf(%f,%f,&a,&b,);,c=,max(a,b,);,printf(Max,is%,d,c,);,max(x,y,),float,x,y,;,x,y?x:y,;,无返回语句,值不定,15,void,printstar,(),printf,(*,*n);,void,print_message,(),printf,(*How do you do!*n);,main(),printstar,();,print_message,();,printstar,();,定义空类型函数,定义空类型函数,调用函数语句不变,16,8.4,函数的调用,8.4.1,函数调用的一般形式:,函数名(实参列表);,Turbo C,传递实参自右向左。,8.4.2,函数调用的方式:,按函数出现的位置分三种调用方式:,1,、函数语句:把函数作为一个语句。,printstar,();,2,、,函数表达式:把函数作为一个表达式,c=a+max(a,b);,3,、,函数参数:函数调用作为另一个函数的实参。,d=max(c,max(a,b);,17,main(),int,i=2,p;,p=,f(i,+i,);,printf(%d,p,);,int,f(int,a,int,b),int,c;,if(a,b)c,=1;,else,if(a,=,b)c,=0;,else c=-1;,return(c,);,先计算,+i,结果?,修改为后计算,+i,18,8.4.3,对被调函数的说明,一个函数调用另一个函数须具备条件:,1,、被调用函数必须存在。,2,、如果被调函数是库函数,则需在文件开头用,#,inlcude,形式包含所在库文件。,比如用到:,sqrt,则,需包含,math.h,strcpy,(),则需包含,string.h,getchar,(),则需包含,stdio.h,3,、,调用自定义的函数,一般应在主调函数内对 调用函数的返回值类型作说明。,一般形式:,类型说明符 被调用函数的函数名,(),19,main(),float a,b,c;,float add();,scanf(%f,%f,&a,&b,);,c=,add(a,b,);,printf(sum,is%,f,c,);,float,add(x,y,),float,x,y,;,float z;,z=,x+y,;,return(z);,对被调用的函数进行说明,否则出错,被调用的函数,20,C,规定,以下情况调用函数前不用说明:,1,、函数返回整型或字符型。,2,、被调函数在主调函数之前定义(举上例)。,3,、在函数开头或函数外部已说明了函数类型。,如:,float add();main().,folat,add(float x,float y),再函数外部说明,21,8.5,函数的嵌套调用,C,规定,:,函数不能嵌套定义,但能嵌套调用。,嵌套调用的示意,:,main,函数,a,函数,b,函数,调用,a,函数 调用,b,函数,结束,调用,返回,22,main(),int,n;,scanf(%d,&n,);,printf(%d,sum(n,);,sum(int,m),int,i,s,;,s=0;,for(i,=1;i1),递归结束,递归调用,调用递归函数,age(5)=age(4)+2,age(4)=age(3)+2,age(3)=age(2)+2,age(2)=age(1)+2,27,递归函数调用执行过程,main,age(5)=18,age(4)=16,age(3)=14,age(2)=12,age(1)=10,age(3)+2,age(2)+2,age(1)+2,age(4)+2,10,输出,age(5),age(5),age,函数,n=5,n=4,n=3,n=2,n=1,28,8.8,用递归方法求,n!,一般方法:,main(),int,i,sum=1,n;,scanf(%d,&n,);,for(i,=1;i1,main(),int,n;,scanf(%d,&n,);,printf(%d,fac(n,);,float,fac(n,),int,c;,if(n,=1|n=0)c=1;,else c=n*fac(n-1);,return(c,);,递归结束,递归调用,31,计算实型数,(,大数的阶乘,),修改如下,:,main(),int,n;,float,fac,();,scanf(%d,&n,);,printf(%f,fac(n,);,float,fac(int,n),float c;,if(n,=1|n=0)c=1;,else c=n*fac(n-1);,return(c,);,32,Hanoi(,汉诺)塔问题,相传古代印度“布拉玛庙”的僧侣们玩的一,种游戏,游戏的装置是一块铜板上有三根针,,最左针上由大到小串有,64,个金盘,游戏的规,则是将,64,个金盘移到最右针上,每次移动一,个金盘且始终保持小盘在大盘上面。,计算移动的次数:,2,64,-1=18,446,744,073,709,511,615,次,计算机计算每微秒移动,1,次需,100,万年,如果人每秒移动,1,次需,5800,亿年,33,Hanoi,(,汉诺)塔问题,这是一个只有用递归方法才能解决的问题,。,AC,,,AB,,,CB,,,AC,,,BA,,,BC,,,AC,将,n-1,个盘子从一根针上移到另一根针上,将,1,个盘子从一根针上移到另一根针上,A,B,C,小,中,小,大,小,中,小,(2,3,1=7,次,),34,Hanoi(,汉诺)塔问题,老和尚的做法,:,如果有一个和尚能将,63,个盘,子从一个针移到另一个针就可以了,老和尚只需做,:,(1),命令第,2,个和尚将,63,个盘子从,A,针移到,B,针,;,(2),自己最后的一个盘子从,A,针移到,C,针,;,(3),再命令第,2,个和尚将,63,个盘子从,B,针移到,C,针,;,实际问题并没解决,第,2,个和尚又找第,3,个和尚,第,1,人,=,第,2,人,=,第,3,人,=,第,64,人,63,个,盘,62,个,盘,1,个,盘,35,问题分析归纳,:,将,N,个盘子从,A,针移到针可分为,3,步:,(1),将,A,针,上,n-1,个盘子借助,C,针,移到,B,针,;,(2),把,A,针上剩下的一个盘子移到,C,针,;,(3),将,B,针,上,n-1,个盘子借助,A,针,移到,C,针,;,第,1,步和第,3,步都是移动,n-1,盘子,只是针不同,归纳,:,“,将,one,针上,n-1,个盘子移到,two,针借助,three,针”,只是,(1),和,(3)one,two,three,和,A,B,C,的对应关系不同,第,1,步对应关系,:one A,two-B,three C,第,3,步对应关系,:one B,two-C,three A,可把上面,3,个步骤化成,2,步,:,1,移动,n-1,个盘子,(,小和尚任务层层下放,递归完成,);,2,由大和尚将一个盘子从一个针移到另一个针,.,36,void,move(char,x,char,y),printf(%c,-%,cn,x,y,);,void,hanoi(int,n,char,one,char,two,char,three),if(n,=1),move(one,three,);,else,hanoi(n-1,one,three,two);,move(one,three,);,hanoi(n-1,two,one,three);,main(),int,m;,printf(input,the number of,diskes,:);,scanf(%d,&m,);,printf(The,step to moving%3d,diskes:n,m,);,hanoi(m,A,B,C,);,从,X,移到,Y,从,1,针移到,3,针,从,1,针移到,3,针,从,1,针借助,3,针移到,2,针,从,2,针借助,1,针移到,3,针,37,8.7,数组作为函数的参数,1,、数组元素作为函数的实参:,例如:比较两个数的最大值,max(x,y,),return(x,y?x:y,);,main(),int,a2,max_num,;,scanf(%d,%d,max_num,=max(a0,a1);,printf(%dn,max_num,);,38,2,、数组名作为函数的参数,即:实参和形参都使用数组名作为参数,例,8.11,有一个一维数组,score,存放,10,个学生成绩,,求平均成绩。,float,average(float,array10),int,i;float,aver,sum,=array0;,for(i,=1;i5;i+),sum=,sum+arrayi,;,aver=sum/5;,return(aver,);,累加总分,计算平均分,回带结果,累加单元赋初值,39,主函数,:,实现数据输入,函数调用,数据输出,main(),float score10,aver;,int,i;,for(i,=0;i5;i+),scanf(%f,&scorei,);,aver=,average(score,);,printf(average,score is%5.2f,aver);,调用函数,注意格式符,40,说明:,1,、应在主函数和被调函数之间分别定义数组,;,2,、实参和形参类型应一致,;,3,、形参数组大小可以不指定,可由另一参数传递。,float,averge(array,n,)float array;,int,n;.,4,、,数组名作为函数参数,实现,“,地址传递,”,传递地址值。(实参,形参共用同一地址),修改上例查看结果,array1,score1,array2 score2,(内存单元),41,例,8.13,用将数组中,10,个数由小到大排序。,“冒泡法”:是一边比较一边交换。,“选择法”:是比较一轮交换一次。,数据排序前,1,与,a0,交换,3,与,a1,交换,4,与,a2,交换,6,与,a3,交换,选择法:,a0 a1 a2 a3 a4,3 6 1 9 4,1 6 3 9 4,1 3 6 9 4,1 3 4 9 6,1 3 4 6 9,42,void,sort(int,a,int,n),选择法排序,int,i,j,k,t,;,for(i,=0;i,n;i,+),k=i;,for(j,=i+1;j,n;j,+),if(aj,ak)k,=j;,t=,ak;ak,=,ai;ai,=t;,main(),int,b10,i;,for(i,=0;i10;i+),scanf(%d,&bi,);,sort(b,10);,for(i,=0;i10;i+),printf(%6d,bi);,记住小数的下标,每轮第一个数的下标,将小数交换到前面,43,8.8,局部变量和全局变量,8.8.1,局部变量,在函数内定义的变量,只在本函数内有效,,称为局部变量。,例如:,add(int,a,int,b),a=,a+b,;,return(a,);,main(),int,a,b,;,a=10;b=20;,printf(add,=%,d,add(a,b,);,printf(main,=%,d,a,);,a,b,局部于,add,函数,a,b,局部于,main,函数,结果?,加,c,后结果?,main(),int,a,b,c,=0;,a=10;b=20;,int,c;,c=,a+b,;,printf(c,=%,d,c,);,printf(add,=%,d,add(a,b,);,printf(main,=%,d,%d,a,c,);,getch,();,44,局部变量说明:,1,、主函数内定义的变量,也只在本函数内有效。,2,、不同函数可以使用相同名字的变量,但表示,不同的变量。,3,、形参也是局部变量。,4,、复合语句定义的变量,只在该语句中有效。,main(),int,a,b,;,:,int,c;,c=,a+b,;,:,:,a,b,c,的有效范围,a,b,的有效范围,45,8.8.2,全局变量,在函数外定义的变量,为外部变量,(,全局变量,),。,int,p=1,q=5;,(,外部变量),float f1(a),int,a;,int,b,c,;,:,char c1,c2;,(,外部变量),char f2(int,x,int,y),int,i,j,;,:,main(),int,m,n,:,c1,c2,的,作,用,范,围,p,q,的,作,用,范,围,46,float,max,min,;,float,fun(float,a,int,n),int,i;float,av,sum,=a0;,max=min=a0;,for(i,=1;i,max)max,=,ai,;,if(ai,min)min,=,ai,;,sum=,sum+ai,;,av,=sum/10;,return(av,);,main(),float s10;,int,i;,for(i,=0;i10;i+),scanf(%f,&si,);,printf(%f,%f,%f,max,min,fun(s,10),);,输入,10,个学生成绩到数组,打印最高,最低和平均分,定义全局变量,回带,3,个值,47,关于全局变量说明:,1,、增加函数间数据联系的渠道,返回多个值。,2,、建议少使用全局变量,因降低通用性。,3,、如果外部变量和局部变量重名,则在局部变量的范围内,外部变量被“屏蔽”。,int,a,b,;,add(a,),a=,a+a,;,b=2*a;,return(a,);,main(),int,a;,a=10;,printf(add,=%,d,add(a,);,printf(main,=%,d,%d,a,b,);,a,被屏蔽,结果?,48,8.9,变量的存储类别,全局变量,局部变量,静态存储变量 动态存储变量,静态存储方式,:,在程序运行期间分配,固定,存储空间,动态存储方式,:,在程序运行期间根据需要,动态,分配,存储空间,从变量的作用域区分,从变量值存在时间区分,49,内存中供用户使用的空间,在,C,语言中一个变量和函数有两个属性,即:,数据类型:,int,float,char,等,自动的(,auto),静态的,(static),寄存器的,(register),外部的(,extern),存放全局变量,存放局部变量,形参,保留地址,程 序 区,静态存储区,动态存储区,用户区,存储类别:,下面分别,介绍,50,8.9.2,用,auto,声明局部自动变量,前面函数中的局部变量都属于自动变量,自动,变量说明可以省略。,int,f(inta,)auto,int,b,c=3;,auto,int,b,c,=3;,int,b,c,=3;,定义,b,c,为自动变量,两个语句等价,51,8.9.3,用,static,声明局部静态变量,如果在调用函数时,希望上次调用时的数据,不消失,可定义为局部静态变量,如:,f(int,a),auto b=0;,static c=3;,b=b+1;,c=c+1;,return(a+b+c,);,main(),int,a=2,i;,for(i,=0;i3;i+),printf(%d,f(a,);,定义,c,为静态变量,结果?,52,8.9.3,用,static,声明局部静态变量,例,8.18,打印,1,到,5,的阶乘。,int,fac(int,n),static,int,p=1;,p=p*n;,return(p,);,main(),int,i;,for(i,=1;i,y?x:y,;,return(z,);,main(),extern A,B;,printf(%d,max(A,B,);,int,A=13,B=-8;,2,再声明,A,B,为全局变量,3,所以此处可用,1,因为在函数后声明,55,8.9.5,用,extern,声明全局变量,2,、,如果在一个文件中引用另外一个文件中定义的全局变量,则用,extern,来进行说明,:,例,8.21,给定,b,的值,输入,a,和,m,求,ab,和,a,m,的值。,文件,:f1.c,文件,:f2.c,int,A;,main(),int,p(int,);,int,b=3,c,d,m;,scanf(,%,d,%,d,&A,&m,);,c=A*b;,printf(,%,d,*,%,d=,%,dn,A,b,c,);,d=,p(m,);,printf(,%,d,*,%,d=%,d,A,m,d,);,extern A;,p(int,n),int,i,y,=1;,for(i,=1;i=,n;i,+),y=y*A;,return(y,);,声明,A,为全局变量,56,8.11,如何运行一个多文件的程序,一个源程序可以由多文件组成,运行一个多文件,的程序的方法如下(,如文件,f1.c,和,f2.c,),:,Turbo c,环境,(,1,)先分别输入和编辑文件,以不同的文件名,存盘,(f1.c,和,f2.c),。,(,2,)在,Turbo c,编辑环境下建立“项目文件”:,f1.c f2.c,,以扩展名,.,prj,存盘,如,:,f.prj,。,(,3,)选中“,Project”,中的“,Project name”,回车,,输入,F.PRJ,。,(,4,)对,f.prj,行编译连接,生成可执行文件,f.exe,。,(,5,)运行执行文件,f.exe,。,57,8.10,内部函数和外部函数,内部函数和外部函数的定义,决定是否可供其它源文件调用。,8.10.1,内部函数,(,静态函数),如果在一个函数只能被本文件中的其它函数调用,就称为内部函数。内部函数的定义:,static,类型标识符 函数名,(,形参表,),如:,static,int,fun(int,a,int,b),8.10.2,外部函数,(1),如果希望函数可被其它文件调用,可用,extern,来说明,(extern,可省略,前面定义的都是外部函数,),。,如:,extern,int,fun(int,a,int,b),(2),在需要此函数的文件中,用,extern,来说明。,58,例,8.22,一个字符串中有若干个字符,输入一,个字符,在字符串中删除该字符。,main(),char a20,c;,int,i,j,;,gets(a,);,scanf(%c,&c,);,for(i,=j=0;ai!=0;i+),if(ai,!=c),aj,+=,ai,;,aj,=0;,printf(%s,a,);,a,b,c,d,e,f,g,c,a,b,d,e,f,g,删除字母,c,存放在,aj,中,指向下一元素或跳过,59,8.10,内部函数和外部函数,内部函数和外部函数的定义,决定是否可供其它源文件调用。,8.10.1,内部函数,(,静态函数),如果在一个函数只能被本文件中的其它函数调用,就称为内部函数。内部函数的定义:,static,类型标识符 函数名,(,形参表,),如:,static,int,fun(int,a,int,b),8.10.2,外部函数,(1),如果希望函数可被其它文件调用,可用,extern,来说明,(extern,可省略,前面定义的都是外部函数,),。,如:,extern,int,fun(int,a,int,b),(2),在需要此函数的文件中,用,extern,来说明。,60,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服