《C语言函数部分.pptx》由会员分享,可在线阅读,更多相关《C语言函数部分.pptx(66页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 函数是能够完成一定任务的、相对独立的程序段,可以被看作组成一个程序的逻辑单元。函数概述(1 1)简化程序设计)简化程序设计 (2 2)便于调试和维护)便于调试和维护 什么是函数?为什么使用函数?第1页/共66页v标准函数(库函数)由系统提供的函数,用户不必自己定义,可以直接调用。用户自定义函数根据函数所要完成的功能自己定义函数的格式。函数的分类(从使用角度)5.1 函数概述函数概述第2页/共66页函数概述函数的分类(从函数开式分)无参函数函数调用时,主调函数并不将数据传送给被调函数。有参函数函数调用时,主调函数将数据传送给被调函数第3页/共66页函数的定义函数的定义形式 int i;long
2、 s;s=1;for(i=1;i=n;i+)s=s*i;返回s值 fac()函数名int n形参变量long int返回值类型函数体第4页/共66页函数的定义返回值类型符 函数名(形式参数列表)函数体类型符都可是什么?int charfloatdoublevoid函数名怎么起?标识符命名字母或下划线开头,后面是字母、数字下划线形参列表什么样?可以为空类型变量多个参数用逗号分隔函数如何返回值?return 表达式 第5页/共66页函数的定义 返回值的类型怎样确定?返回值的类型应该与函数类型一致。可以有多条return语句吗?返回值的类型为空类型(void)。可以没有return语句(或retur
3、n后的表达式为空)吗?执行到哪一条returnreturn语句,哪一条起作用。形参变量作为已知值第6页/共66页判断下述程序是否能正常编译main()int r;r=fun(4)%fun(5);double fun(int n)return n*1.0;Type mismatch in redeclaration of fundouble fun(int n);函数声明第7页/共66页函数的定义说明:(1)函数原型声明语句最后的分号不能省略,其作用是表示该语句是进行函数声明而不是函数定义。(2)在原型声明中,形式参数名可以省略。(3)如果被调用函数的定义出现在调用函数之前,可以不对被调用函数进
4、行原型声明。(4)如果被调用函数已在所有函数定义之前进行了原型声明,则在各个调用函数中不必再对该函数进行原型声明。第8页/共66页math.h文件中的部分内容int_Cdecl abs (int x);double_Cdecl cos (double x);double_Cdecl exp (double x);double_Cdecl log10(double x);double_Cdecl pow (double x,double y)double_Cdecl sin (double x);double_Cdecl sqrt (double x);第9页/共66页标准函数的函数声明#inc
5、lude void main()printf(%f,sqrt(4);第10页/共66页函数调用与参数传递有参函数调用的格式:函数名(实际参数)无参函数的调用格式:函数名()函数的调用方式main()s=max(3,5)+max(5,7);第11页/共66页说明说明:(1 1)函数总是在某个)函数总是在某个函数体中被调用函数体中被调用。(2 2)函函数数调调用用可可以以在在结结尾尾处处加加上上分分号号,单单独独作作为为一条语句一条语句。(3 3)对对于于有有返返回回值值的的函函数数,其其调调用用也也可可以以出出现现在在某条某条语句语句或或表达式表达式中。中。函数调用与参数传递函数调用与参数传递p
6、rintf(%d,fac(3);第12页/共66页5 函数调用与参数传递函数调用与参数传递函数的调用过程main()s=fac(3);long fac(int n)int i;long s;s=1;for(i=1;i=n;i+)s=s*i;return s;第13页/共66页 函数调用与参数传递参数传递long fac(int n);main()s=fac(3 );long int fac(int n )int i;long s;s=1;for(i=1;i=n;i+)s=s*i;return s;3int n第14页/共66页函数调用和参数传递C语言中的参数传递计算实参的值形参变量如果实参是变
7、量,那么当把值传给形参变量后,如果对应的形参变量值发生变化,会不会影响原实参的值?第15页/共66页参数传递。程序代码如下:#includevoid swap(int a,int b);/*声明函数原型*/void main()int x,y;x=10;y=20;swap(x,y);/*调用函数*/printf(%d,%d,x,y);void swap(int a,int b)/*定义函数*/int t;t=a;a=b;b=t;第16页/共66页 函数调用与参数传递程序输出如下:10,20 第17页/共66页 函数调用与参数传递 数组参数 一维数组参数 定义void printarray(in
8、t a).调用 printarray(b);其中b为数组名二维数组参数定义 void printarray(int a4)调用 printarray(b)第18页/共66页函数调用与参数传递 函数的嵌套调用 C语言中的函数定义是相互独立的,不允许函数的“嵌套”定义,即不允许在一个函数体内包含另一个函数的定义。但允许嵌套调用函数,即在调用一个函数的过程中,又调用另一个函数。A()B();B()C();第19页/共66页函数调用与参数传递函数的递归调用一个函数不仅可以调用其它函数,还可以直接或间接调用它本身,这种调用过程被称作递归(recursion)。A()A();第20页/共66页n!=(n-
9、1)!*n使用fac求阶乘,可表示成fac(n)=fac(n-1)*nlong int fac(int n)if(n=0)return 1;else return n*fac(n-1);第21页/共66页函数本次课小结理解模块化设计思想掌握函数的定义和调用方法掌握C语言的参数传递方法第22页/共66页函数与变量的作用域旅馆房间家房车存在时间作用范围第23页/共66页 函数与变量的作用域变量的作用域变量的存储类别第24页/共66页局部变量和全局变量一、变量的作用域一个C程序由多个函数构成,每个函数内部为一个范围。吉林北京变量的分类:局部变量全局变量地区全国第25页/共66页局部变量和全局变量二、
10、局部变量1、在一个函数内部定义的变量被称作局部变量,也叫内部变量。2、局部变量只在定义它的函数范围内有效3、不同函数内的变量可以重名,它们对应不同的存储空间,变量地址不同。4、形参变量也是局部变量5、可在复合语句内定义变量,作用域为该复合语句第26页/共66页局部变量和全局变量void main()int a,b,t=5;void swap(int,int);a=3;b=4;swap(a,b);printf(%d,%d,a,b);printf(n%d,t);void swap(int a,int b)int t;t=a;a=b;b=t;printf(%d,%d,a,b);printf(%d,t
11、);34ab5t34abt433第27页/共66页局部变量和全局变量三、全局变量1、全局变量又称为外部变量,是在函数之外定义的变量,其作用范围是从定义的位置开始到本源程序文件的结束。2、可使用全局变量获得多于一个的返回值,增强函数之间的数据联系通道。3、降低了函数的通用性(移植)第28页/共66页局部变量和全局变量int c;g1()int a;int d;g2()int b;int c;F1()int c;c=2;F2()printf(%d,c);第29页/共66页局部变量和全局变量变量的重名问题(1)不同函数内的局部变量重名互不影响(2)全局变量与局部变量重名在定义局部变量的函数内,局部变
12、量有效(3)全局变量重名第30页/共66页写出下面程序的运行结果#include void f1(),f2(int);int k;void main()int k;k=3;printf(%dn,k);f1();f2(4);void f1()printf(%dn,k);void f2(int k)printf(%dn,k);第31页/共66页 函数与变量的作用域变量的作用域变量的存储类别第32页/共66页动态与静态存储变量一、动态存储变量1、系统在运行期间根据需要对存储空间进行动态分配的变量称为动态存储变量。2、形参变量是动态存储变量3、auto 局部变量是动态存储变量auto int a in
13、t a第33页/共66页动态与静态存储变量void f1()int c;c=4;void main()int a,b;a=b=3;f1();main334f1第34页/共66页动态与静态存储变量二、静态存储变量1、系统在程序运行期间为其分配固定存储空间的变量。2、全局变量是静态存储变量3、static声明局部变量是静态存储变量static int a第35页/共66页动态与静态存储变量void f1()static int d=4;int c=3;d+;c+;void main()int a,b;a=b=3;f1();main333f14d54第36页/共66页动态与静态存储变量int fun
14、(int i)static int p=1;p=p*i;return p;void main()int i;for(i=1;i=6;i+)printf(“%dn”,fun(i);1p2 624120720void main()int i,s=0;for(i=1;i=6;i+)s=s+fun(i);printf(“%d”,s);1!+2!+3!+4!+5!+6!第37页/共66页函数应用举例1、使用函数求出所有的水仙花数分析:判断范围:100999 假如:有一个函数fun可直接判断一个数是不是水仙花数,那么怎么编?void main()int k;for(k=100;k=999;k+)if(k是
15、水仙花数)printf(“%dn”,k);fun(k)=1第38页/共66页函数应用举例void main()int k;for(k=100;k=999;k+)if(fun(k)=1)printf(“%dn”,k);fun(int n)intint a,b,c;a=n/100;b=(n-a*100)/10;c=a%10;if(a*a*a+b*b*b+c*c*c=n)return 1;else return 0;第39页/共66页函数应用举例2、编写一个函数能够实现strcmp的功能printf(%d,strcmp(aa,cc);结果为:-2 strcmp(char s1,char s2)int
16、 int i;for(i=0;s1i!=0&s2i!=0;i+)if(s1i-s2i!=0)break;return s1i-s2i;第40页/共66页 函数应用举例3、编写一个函数能够实现strlen的功能printf(%d,strlen(aa);结果为:2 strlen(char s)int int i,count=0;for(i=0;s i!=0;i+)count+;return count;第41页/共66页函数应用举例4、编写一个函数能够实现判断任意一个数是否为素数。for(I=2;I=100;I+)if(prime(I)printf(%d,I);prime(int n)int in
17、t j;for(j=2;j=n-1;j+)if(n%j=0)return 0;return 1;第42页/共66页函数应用举例函数习题课1、试编制一个求最大公约数的函数,并利用它求任意两个数的最大公约数和最小公倍数。gongyue(int a,int b)int int r;r=m%n;while(r!=0)m=n;n=r;r=m%n;return n;第43页/共66页函数应用举例void main()int a,b;scanf(%d,%d,&a,&b);printf(gongyue is:%d,gongbei is:%d,gongyue(a,b),a*b/gongyue(a,b);第44页
18、/共66页例5-17 编程处理一批数据,要求:(1)随机产生20个10,99范围内的整数;(2)以每行5个数据的形式输出这批整数;(3)对这批数据进行升序排列,并输出排序后的结果;(4)计算这批数据的平均值;(5)分别统计大于、等于和小于平均值的数据个数。分别设计5个函数进行数据的随机生成、输出、排序、计算平均值和统计。void getdata(int a)void printdata(int a,int n)void sortdata(int a)double avg(int a)void count(int a,double avg,int b)第45页/共66页void main()in
19、t a20,b3;double x;getdata(a);printdata(a,20);sort(a);printdata(a,20);x=avg(a);count(a,x,b);printdata(b,3);函数编程第46页/共66页函数编程void getdata(int a)int i;randomize();for(i=0;i20;i+)ai=random(90)+10;/*random(90)返回0N的随机整整*/第47页/共66页函数编程void printdata(int a,int n)int i;for(i=0;in;i+)if(i%5=0)printf(n);printf
20、(%d,ai);第48页/共66页函数编程void sort(int a)int i,j,k,t;for(i=0;i19;i+)k=i;for(j=i+1;jaj)k=j;t=ai;ai=ak;ak=t;第49页/共66页函数编程double avg(int a)double s;int i;s=0.0;for(i=0;in;i+)s=s+ai;return(s/n);第50页/共66页函数编程void count(int a,int n,float x,int b)int i;b0=b1=b2=0;for(i=0;ix)b0+;else if(ai=x)b1+;else b2+;第51页/共
21、66页2、选择题在C语言程序中,A、函数的定义可以嵌套,但调用不可以嵌套B、函数的定义不可以嵌套,但函数的调用可以嵌套C、函数的定义和函数的调用都不可以嵌套D、函数的定义和调用均可以嵌套嵌套定义:void A()int a,b;void B()int c;第52页/共66页在以下所列的各函数原型声明中,正确的是:A、void play(var:Integer,var b:Integer);B、void play(int a,b);C、void play(int a,int b);D、Sub play(a as integer,b as integer)第53页/共66页在函数调用语句f(a,b
22、,(c,d);中,实参个数是_。donut()函数接受一个整数,并输出若干个0,输出0的个数等于所接受整数的值。函数原型为:random函数不接收任何数据,但返回一个整数。max()函数接收一组整数,并返回一个整数void donut(int n);int random();int max(int a);char ntochar(int n);第54页/共66页程序阅读题func(int a,int b)static int m=0,I=2;I+=m+1;m=I+a+b;return m;void main()int k=4,m=1,p;p=func(k,m);printf(%d,p);p=f
23、unc(k,m);printf(%d,p);4k1mp0m2I4a1b3884a1b121717第55页/共66页程序阅读题int f(int n)if(n=0)return 1;else return f(n-1)*n;void main()printf(%d,f(6);f(6)=f(5)*6=f(4)*5*6=f(3)*4*5*6=f(2)*3*4*5*6=f(1)*2*3*4*5*6=f(0)*1*2*3*4*5*6=1*2*3*4*5*6=6!第56页/共66页程序阅读题void s(int a,int b)int t;t=a;a=b;b=t;printf(%d,%dn,a,b);vo
24、id main()int m=3,n=4;s(m,n);printf(%d,%dn,m,n);4a3b3m4n3a4b3m4n第57页/共66页程序填空题下面的程序是统计高于平均分的人数,输入成绩时,1表示输入结束。_ fun(_,int n)double sum=0,avg;int I,count=_;for(I=0;In;I+)sum+=aI;avg=_;for(I=0;Iavg scanf(%f,&x);I+;a,I第58页/共66页宏定义#define sqr(x)x*xvoid main()printf(%d,sqr(2+3);printf(%d,2+3*2+3);第59页/共66页
25、宏定义#define sqr(x)(x)*(x)void main()printf(%d,sqr(2+3)/sqr(2+3);printf(%d,(2+3)*(2+3)/(2+3)*(2+3);第60页/共66页输入10个数,输出其中与平均值之差的绝对值最小的数include _void main()float a10,s,d,x;int I;for(I=0;I10;I+)_for(I=0;I10;I+)s+=aI;s/=10;d=fabs(a0-s);_;for(I=1;I10;+)if(fabs(aI-s)d)_;x=aI;printf(%f,x);scanf(%f,&aI);S=0.0;
26、x=a0;d=fabs(aI-s);#include 第61页/共66页写出下面程序的运行结果#include main()char a8,temp;int I,j;for(I=0;I7;I+)aI=A+I;for(I=0;I3;I+)temp=a0;for(j=1;j7;j+)aj-1=aj;a6=temp;a7=0;printf(%s,a);ABCDEFGBCDEFGGBCDEFGABCDEFGACDEFGABDEFGABC第62页/共66页下列程序输入elephant后的输出结果是:#include main()int I=0,k,ch;int num5=0;char alpha=a,e
27、,i,o,u,in80;gets(in);while(inI)for(k=0;k5;k+)if(inI=alphak)numk+;break;I+;for(I=0;I5;I+)printf(%c%d,alphak,numk);第63页/共66页输入一个字符串,将字符串中的连续空格保留一个。#include#include void main()char b61;int I;gets(b);for(I=1;_;I+)If(bI-1=&bI=)_(b+I-1,b+I);I-;_;bI!=0strcpyputs(b)第64页/共66页第五章小结函数的定义、声明与调用参数传递变量的作用域和存储类别函数的应用与编程第65页/共66页感谢您的观看!第66页/共66页