收藏 分销(赏)

谭浩强C语言教程函数.ppt

上传人:精*** 文档编号:12293589 上传时间:2025-10-07 格式:PPT 页数:82 大小:735KB 下载积分:18 金币
下载 相关 举报
谭浩强C语言教程函数.ppt_第1页
第1页 / 共82页
谭浩强C语言教程函数.ppt_第2页
第2页 / 共82页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,谭浩强C语言教程 函数,一、C,程序模块,一个C,程序可由一个main()函数和多个其它函数构成。,5.1 C,程序模块,其它函数指的是:,系统函数,由系统提供,放在头文件中,自编函数,由程序设计人员编写,二、函数的调用,如:,main,funa,funb,func,fund,funx,funy,所有的函数都 具有两种特征:,返回值,参数,(返回值和参数都是可缺省的),5.2 库函数,一、库函数简介,系统自带的标标准库函数根据不同的功能作用放在不同的头文件中。,如:,stdio.h,用于标准输入/输出,math.h,用于数学计算,ctype.h,用于字符处理,string.h,用于字串处理,time.h,用于时间/日期的处理,dir.h,用于控制目录和路径,graphics.h,用于图形操作,dos.h,bios.h,用于接口处理,二、库函数的作用,使程序更具有“独立性”和“可移植”性。,使用时只需在程序的开头加上一条语句:,#include “”,根据使用的函数来确定,使程序具有“模块化”。,例:,求两个浮点型数值x/y,的余数。,(注意:不能写成3.6%1.7 =2.0),#include,#include,main(),float x,y,z;,scanf(%f%f,z=fmod(x,y);,printf(z=%f,z);,例:函数的结构,main(),printstar();,print_message();,printstar();,printstar(),printf(“*”);,print_message(),printf(“how do you do!n”);,对函数的理解:,一个源程序由一个或多个函数组成。,一个,c,程序由一个或多个源程序组成。,c,程序的执行顺序从,main(),开始,调用其他函数后,流程回到,main(),函数。,c,程序的所有的函数都是平行的,不存在函数的嵌套定义。,从用户的角度对函数的分类:,(1)标准库函数:由系统提供。,(2)用户自定义函数:解决用户的专门需要。,从函数的形参对函数的分类:,(1)有参数函数:用于执行指定的一组操作,可以带回或不带回函数值。,(2)无参数函数:主调函数可以将数据传给被调函数使用,被调函数中的数据也可以带回给主调函数使用。,5.3 自定义函数,一、自定义函数的作用,使程序具有“积木”功能。(模块化),使程序具有“重构”功能。,1、含义:函数是完成一个独立功能的程序代码。,2、C程序的基本结构(如图):,1、函数的返回值是通过函数中的return语句来完成的,return语句一次只能返回一个值;,2、由return语句返回的数据类型应与函数定义时的类型一致。,例:,3、当在函数的定义时,未指出函数的类型,c语言默认的类型为整型.,4、函数没有return语句并不表明函数没有返回值,只是这个返回值对于调用者来说可能是没有用的,这个返回值随函数的不同它的值也不尽相同.,5、如果我们明确表示函数不能返回值,在函数的定义时用“void”加以说明,这样可以确保函数不带回返回值.,return z 等价 return(z),return(xy?x:y);,6、例:,函数的返回值,例:对函数返回值的理解:,main(),int a,b,c;,a=printstar();,b=print_message();,c=printstar();,printf(“%d,%d,%dn”,a,b,c);,若不需要函数带回任何值,可使用:,void printstar(),void print_message(),例:函数返回值的类型与其定义的类型不符时:,main(),float a,b;,int c;,scanf(“%f,%f”,c=max(a,b);,printf(“max is%dn”,c);,max(float x,float y),输入:1.5,2.5,float z;输出:max is 2,z=xy?x:y;return(z);,/*return(xy?x:y)等价*/,函数的一般调用,1、函数调用的一般形式:,函数名(实参表列);,如:add(int x,int y)的调用为add(2,3),2、函数调用的规则:,实参与形参在个数与类型上必须保持一致。,当函数无参数时,实参表列就为空,但括号不能少。,实参表列中的各个参数之间用逗号隔开。,实参与形参是一一对应的关系(函数调用的过程)。,对于实参表的求值顺序各个系统是不一致的。,1.函数语句:,功能:将函数调用作为一个语句。,如:printf(“book”);,要点:,不要求函数带回值,只要求完成一定的操作。,2.函数表达式:,功能:将函数作为表达式的一部分。,如:c=2*max(a,b);,要点:,要求函数带回一个确定的值,以参加表达式的运算。,3.一个函数作为另一个函数的参数:,功能:将函数的调用作为一个函数的实参。,如:m=,max(a,max(b,c)),;,要点:其实质也是函数表达式的调用。,函数调用的方式,1.被调用函数必须是一个已经存在的函数.,2.如果使用库函数应在文件头加上#include命令,以便将有关的库函数包含到本源文件中来.,3.对于用户自定义函数,函数的定义部分应出现在该函数被调用之前.不然的话,在调用函数之前应作提前说明.,4.引用性说明的方法:,一般形式:,函数类型 函数名(形参类型 形参名,.);,或,函数类型 函数名();,作用:告诉编译系统函数类型、参数个数及类型,以便检验,返回值类型 函数名(),如:int add();,函数的引用性说明,例1:,求二个数中的最大值,int max(x,y),int x,y;,int z;,z=xy?x:y;,return(z);,用return,语句,返回函数的值。,或:,int max(int x,int y),int z;,z=xy?x:y;,return(z);,四、举例,通过函数调用求二个数中的最大值:,#include,int max(int,int);/*,函数原型*/,main(),int a,b,t;,scanf(%d%d,t=max(a,b);/*,函数调用*/,printf(value of maximize is:t=%d,t);,int max(int x,int y)/*,函数定义*/,int z;,z=xy?x:y;,return(z);,#include,float add();,/*函数说明*/,main()float a,b,c;scanf(,%f,%f,c=add(a,b);,/*函数调用*/,printf(,sum=%f,;,c);,float add(float x,float y,);,/*函数定义*/,float z;,z=x+y;,return z;,求二实数之和,规则:若函数的定义放在main(),函数之前可省略函数说明。,第五章 函数,#include,float add(float x,float y,);/*函数定义*/,float z;z=x+y;return z;,main()float a,b,c;scanf(,“,%f,%f,”,c=add(a,b);,/*函数调用*/,printf(,sum=%f,;,c);,求二实数之和,(将例1程序改写如下:),第五章 函数,1.形参与实参,调用时:,实参值,单向,传递,形参。,函数被调用时,临时分配单元给形参,调用完毕,这些单元被释放。,实参:,出现在调用函数中,,形参,:出现被调用函数中。,五、自定义函数中的几个重要特征,实参可为表达式,只传递表达式的值。,实参、形参类型一致。,可在形参表列中对形参说明。,注:,!?,2.函数返回,或 return,变量的值;,通过 return,语句将流程返回主调函数。,return;,函数无返回值,return,表达式的值;,3.函数名,要选择一个简洁的有意义的名字作为函数名。,从函数名可以反映出函数的功能。,六、传值调用和传引用(传址),调用,1.传值调用,方式:,函数的实参和形参的类型均为简单变量。,当实参,传递,形参时,系统会建立一份实参的拷贝给形参。,当函数调用完毕,这份实参的拷贝消失。,特点:,传值调用不会影响实参的值。,形参与实参,形式参数:定义函数时函数名后面括号中的变量名,实际参数:调用函数时函数名后面括号中的表达式,c=max(a,b);,(main 函数),(max 函数),max(int x,int y),int z;,z=xy?x:y;,return(z);,例 比较两个数并输出大者,main(),int a,b,c;,scanf(%d,%d,c=,max(a,b);,printf(Max is%d,c);,max(,int x,int y,),int z;,z=xy?x:y;,return(z);,形参,实参,2.传引用(传址)调用,把实参,形参后,传递,形参变量和实参变量共同内存地址。,地址传递:数组名和指针(共用内存单元),特点:,形参变量的值的变化会影响实参的值的改变。,5.4 函数的存储类型,一、标识符的属性,一个标识符的属性除了前面已讲过的基本属性外,还具有一些其它的属性:,存储类别,存储期,函数中的变量,1、按作用域分,局部变量:在本函数内部有效,全局变量:从定义位置到源程序结束均有效,2、按存储类型分,静态存储变量:程序运行时有固定的存储空间,,结束时释放内存单元,动态存储变量:根据需要动态分配和释放内存单元,举例说明,二、存储类别,1.存储类型和存储期,自动型(auto),寄存器型(register),外部型(extern),静态型(static),自动存储期,静态存储期,2.存储期的性质,自动存储:只有变量才具有自动存储期,如函数中的变量说明:,auto float x,y;,auto int m,n;,作用:,进入到函数块中,该变量存在,退出函数块后该变量消失。程序中大部分变量都具有自动存储期。,静态存储:可用于变量和函数,如:,static int;,作用:,从程序开始执行起就一直存在,始终占据内存单元,直到程序结束运行。,对静态存储变量,若定义时赋初值,则程序运行中仅在第一次调用时赋初值,下一次调用不再赋初值,而是使用上一次调用的值。,特别提醒:,对静态存储变量,若定义时不赋初值,则系统置初值0,而动态变量不赋初值则值不确定。,#include,int fac(n),/*函数定义*/,int n;static int f=1;f=f,n;return(f);,main()int i;for(i=1;ib?a:b;,return(c);,main(),int a=8;,printf(max=%d,max(a,b);,运行结果:max=8,例 外部变量与局部变量,全局变量,1、含义:在所有的函数之外定义的变量称为外部变量(或叫做全局变量).其作用范围是从变量定义的位置开始,直到本源文件的结束。如:,2、,要点:,3、,举例:,int p=1,q=1;/*定义全局变量p,q*/,float f1(a)/*定义函数f1*/,int a;,int b,c;,char c1,c2;/*定义外部变量c1,c2*/,char f2(int x,int y)/*定义函数f2*/,int i,j;,main()int m,n;,全局,变量p,q的有,效范围,全局,变量c1,c2的有,效范围,(,1)一个源文件可以包含一个或几个函数.,(2)全局变量可以被本源文件的所有函数共享.,(3)全局变量的设置增强了函数间数据的联系.一个函数对全局变量的值的改变将会影响到其他的函数中.例:(用于返回多个函数值),(4)建议在只有必要时才设置全局变量.,(5)全局变量在文件的开头定义,则它的有效范围是整个源文件,但如果全局变量不是在开头定义的,则它有效范围是从定义点到源文件的结束.如果想在全局变量的定义点之前引用时,需要用关键字“extern”作提前引用说明.,(6)当全局变量名与局部变量名相同时,则在局部变量的有效范围内全局变量不起作用.,例:写一个函数,找出100-200之间的全部素数。,#include“stdio.h”,#include“math.h”,int isprime(int d);,int i,s;,s=sqrt(d);,for(i=2;i=s;i+),if(d%i=0)return 0;,return 1;,main(),int m,n=0;,for(m=100;m=200;m+),if(isprime(m),if(n%10=0)printf(“n”);n+;printf(“%d”,m);,例:有一个一维数组,内放10个学生成绩,写一个函数,求出平均分、最高分和最低分。,略,float max=0,min=0;main(),float average(array,n)float ave,score10;,float array;int n;int i;,int i;for(i=0;i10;i+),float aver,sum=array0;scanf(“%f”,max=min=array0;ave=average(score,10);,for(i=0;imax)max=arrayi;max,min,ave);,else if(arrayiy?x:y;,return z;,f2(int x,int y),int z;,z=xy?+x:+y;,return z;,main()extern int a,b;,printf(“%d,%d,%dn”,a,b,f1(a,b);,printf(“%d,%d,%dn”,a,b,f2(a,b);,int a=20,b=-15;,20,-15,20/20,-15,21,例,输入长方体的长(l)、宽(w)、高(h),求长方体体积及正、侧、顶三个面的面积。,/*功能:利用全局变量计算长方体的体积及三个面的面积*/,int s1,s2,s3;,int vs(int a,int b,int c),int v;,v=a*b*c;s1=a*b;s2=b*c;s3=a*c;,return v;,main(),int v,l,w,h;,clrscr();,printf(n input length,width and height:);,scanf(%d%d%d,v=vs(l,w,h);,printf(v=%d s1=%d s2=%d s3=%dn,v,s1,s2,s3);,getch();,程序演示,#include,int i=1;,main(),static int a;,register int b=-10;,int c=0;,printf(-MAIN-n);,printf(i:%d a:%d ,b:%d c:%dn,i,a,b,c);,c=c+8;,other();,printf(-MAIN-n);,printf(i:%d a:%d ,b:%d c:%dn,i,a,b,c);,i=i+10;,other();,other(),static int a=2;,static int b;,int c=10;,a=a+2;i=i+32;c=c+5;,printf(-OTHER-n);,printf(i:%d a:%d ,b:%d c:%dn,i,a,b,c);,b=a;,-Main-,i:1 a:0 b:-10 c:0,-Other-,i:33 a:4 b:0 c:15,-Main-,i:33 a:0 b:-10 c:8,-Other-,i:75 a:6 b:4 c:15,全局i,1,main:a,0,b:-10,register,main:c,0,静态,存储区,动态,存储区,other:a,2,other:b,0,other:c,10,8,4,33,15,4,43,other:c,10,6,75,15,6,例 变量的寿命与可见性,例:,f(a),int a;,auto int b=0;,static int c=3;,b+=1;c+=1;,return(a+b+c);,main(),int a=2,i;,for(i=0;i3;i+),printf(“%3d”,f(a);,运行结果:789,例:,int fac(int n),register int i,f=1;,for(i=1;i=n;i+)f=f*i;,return f;,main(),int i;,for(i=1;iy?x:y;,return(rz?r:z);,int min(int x,int y,int z),int r;,r=xy?x:y;,return(r1),当条件成立,调用递归,否则结束。,例:,求n!,1.,从数学上定义,#include long fac(int n),/*函数定义,计算n!*/,long f;,if,(n1),age(n)=,递归调用的过程,age(5)=,age(4)+,2,age(4)=,age(3)+,2,age(3)=,age(2)+,2,age(2)=,age(1)+,2,age(1)=,10,age(2)=,10+,2,age(3)=,12+,2,age(4)=,14+,2,age(5)=,16+,2,程序代码:,age(int n),int c;,if(n=1)c=10;,else c=age(n-1)+2;,printf(“No%d age is%dn”,n,c);,return c;,main(),age(5);,运行结果为:1 age is 10,2 age is 12,3 age is 14,4 age is 16,5 age is 18,例:求下面程序的输出结果。,fun(int k),if(k=0)return 3;,return(fun(k-1)*3);,main()int w=10;,printf(“%dn”,fun(5)*w);,运行结果为:7290,作业1,编程计算组合C,n,m,的函数,C,n,m,=_,m!,_,n!(m-n)!,作业2,利用递归算法求:,M!+M+M,N,利用递归算法求:,M!+M+M,N,main(),int m,n;,scanf(%d,%d,printf(%d,f(m)+g(m)+k(m,n);,利用递归算法求:,M!+M+M,N,int f(m),int m;,if(m=1),return 1;,else,return m*f(m-1);,利用递归算法求:,M!+M+M,N,int g(m),int m;,if(m=1),return 1;,else,return m+g(m-1);,利用递归算法求:,M!+M+M,N,int k(m,n),int m,n;,if(n=1),return m;,else,return m*k(m,n-1);,利用递归算法求:,M!+M+M,N,int f(m),int m;,if(m=1)return 1;,else return m*f(m-1);,int g(m),int m;,if(m=1)return 1;,else return m+g(m-1);,int k(m,n),int m,n;,if(n=1)return m;,else return m*k(m,n-1);,main(),int m,n;,scanf(%d,%d,printf(%d,f(m)+g(m)+k(m,n);,
展开阅读全文

开通  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 

客服