《《C语言函数部分》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《C语言函数部分》PPT课件.ppt(66页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、函数本章目标本章目标l理解模块化设计思想理解模块化设计思想l掌握函数的定义和调用方法掌握函数的定义和调用方法l掌握掌握C语言的参数传递方法语言的参数传递方法l掌握变量的作用域和存储方式掌握变量的作用域和存储方式 函数是能够函数是能够完成一定任务完成一定任务的、的、相对相对独立独立的程序段,可以被看作组成一个的程序段,可以被看作组成一个程序的程序的逻辑单元逻辑单元。函数概述(1 1)简化程序设计)简化程序设计 (2 2)便于调试和维护)便于调试和维护 什么是函数?为什么使用函数?v标准函数(库函数)标准函数(库函数)由系统提供的函数,用户不必自己定义,由系统提供的函数,用户不必自己定义,可以可以
2、直接调用直接调用。用户自定义函数用户自定义函数根据函数所要完成的功能根据函数所要完成的功能自己定义函数自己定义函数的格式。的格式。函数的分类(从使用角度)函数的分类(从使用角度)5.1 函数概述函数概述函数概述函数的分类(从函数开式分)函数的分类(从函数开式分)无参函数无参函数函数调用时,函数调用时,主调函数主调函数并不将数据传送并不将数据传送给被调函数。给被调函数。有参函数有参函数函数调用时,函数调用时,主调函数主调函数将数据传送给被将数据传送给被调函数调函数函数的定义函数的定义形式函数的定义形式 int i;long s;s=1;for(i=1;i=n;i+)s=s*i;返回返回s值值 f
3、ac()函数名int n形参变量long int返回值类型函数体函数的定义返回值类型符返回值类型符 函数名函数名(形式参数列表形式参数列表)函数体函数体类型符都可是什么?类型符都可是什么?int charfloatdoublevoid函数名怎么起?函数名怎么起?标识符命名字母或下划线开头,后面是字母、数字下划线形参列表什么样?形参列表什么样?可以为空类型变量多个参数用逗号分隔函数如何返回值?函数如何返回值?return 表达式 函数的定义 返回值的类型怎样确定?返回值的类型怎样确定?返回值的类型应该返回值的类型应该与函数类型一致与函数类型一致。可以有多条可以有多条return语句吗?语句吗?返
4、回值的类型为返回值的类型为空类型(空类型(void)。可以没有可以没有return语句(或语句(或return后的表达式为空)后的表达式为空)吗?吗?执行到哪一条执行到哪一条returnreturn语句,哪一条起作用。语句,哪一条起作用。形参变量作为已知值形参变量作为已知值判断下述程序是否能正常编译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);函数声明函数的定义说明:说明:(1)函函数数原原型型声声明明语语句句最最后
5、后的的分分号号不不能能省省略略,其其作作用是表示该语句是进行函数声明而不是函数定义。用是表示该语句是进行函数声明而不是函数定义。(2)在原型声明中,)在原型声明中,形式参数名可以省略形式参数名可以省略。(3)如如果果被被调调用用函函数数的的定定义义出出现现在在调调用用函函数数之之前前,可以不对被调用函数进行原型声明。可以不对被调用函数进行原型声明。(4)如果被调用函数已)如果被调用函数已在所有函数定义之前在所有函数定义之前进行了进行了原型声明,则在各个调用函数中不必再对该函数进原型声明,则在各个调用函数中不必再对该函数进行原型声明。行原型声明。文件中的部分内容lint _Cdecl abs (
6、int x);ldouble _Cdecl cos (double x);ldouble _Cdecl exp (double x);ldouble _Cdecl log10(double x);ldouble _Cdecl pow (double x,double y)ldouble _Cdecl sin (double x);ldouble _Cdecl sqrt (double x);标准函数的函数声明#include void main()printf(%f,sqrt(4);函数调用与参数传递l有参函数有参函数调用的格式:调用的格式:函数名函数名(实际参数实际参数)l无参函数无参函数的
7、调用格式:的调用格式:函数名函数名()函数的调用方式函数的调用方式main()s=max(3,5)+max(5,7);说明说明:(1 1)函数总是在某个)函数总是在某个函数体中被调用函数体中被调用。(2 2)函函数数调调用用可可以以在在结结尾尾处处加加上上分分号号,单单独独作作为为一条语句一条语句。(3 3)对对于于有有返返回回值值的的函函数数,其其调调用用也也可可以以出出现现在在某条某条语句语句或或表达式表达式中。中。函数调用与参数传递函数调用与参数传递printf(%d,fac(3);5 函数调用与参数传递函数调用与参数传递函数的调用过程函数的调用过程main()s=fac(3);long
8、 fac(int n)int i;long s;s=1;for(i=1;i=n;i+)s=s*i;return s;函数调用与参数传递参数传递参数传递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函数调用和参数传递lC语言中的参数传递计算实参的值形参变量如果实参是变量,那么当把值传给形参变量后,如果对应的形参变量值发生变化,会不会影响原实参的值?l参数传递。l程序代码如下:#includevoid swap(int a,int b)
9、;/*声明函数原型声明函数原型*/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;函数调用与参数传递l程序输出如下:10,20 函数调用与参数传递 数组参数 l一维数组参数 定义void printarray(int a).调用 printarray(b);其中b为数组名l二维数组参数定义 void printarray(int a4)调用 printarray(b)函数调用与参数传递l 函数的嵌套调用
10、 lC语言中的函数定义是相互独立的,不允许函数的“嵌套”定义,即不允许在一个函数体内包含另一个函数的定义。但允许嵌套调用函数,即在调用一个函数的过程中,又调用另一个函数。A()B();B()C();函数调用与参数传递l函数的递归调用l一个函数不仅可以调用其它函数,还可以直接或间接调用它本身,这种调用过程被称作递归(recursion)。A()A();n!=(n-1)!*n使用fac求阶乘,可表示成fac(n)=fac(n-1)*nlong int fac(int n)if(n=0)return 1;else return n*fac(n-1);函数本次课小结本次课小结l理解模块化设计思想理解模
11、块化设计思想l掌握函数的定义和调用方法掌握函数的定义和调用方法l掌握掌握C语言的参数传递方法语言的参数传递方法函数与变量的作用域旅馆房间家房车存在时间作用范围 函数与变量的作用域l变量的作用域变量的作用域l变量的存储类别变量的存储类别局部变量和全局变量一、变量的作用域一个C程序由多个函数构成,每个函数内部为一个范围。吉林北京变量的分类:局部变量全局变量地区全国局部变量和全局变量二、局部变量二、局部变量1、在一个函数内部定义的变量被称作局部变量,、在一个函数内部定义的变量被称作局部变量,也叫内部变量。也叫内部变量。2、局部变量只在定义它的函数范围内有效、局部变量只在定义它的函数范围内有效3、不同
12、函数内的变量可以重名,它们对应不同的、不同函数内的变量可以重名,它们对应不同的存储空间,变量地址不同。存储空间,变量地址不同。4、形参变量也是局部变量、形参变量也是局部变量5、可在复合语句内定义变量,作用域为该复合语、可在复合语句内定义变量,作用域为该复合语句句局部变量和全局变量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,
13、t);34ab5t34abt433局部变量和全局变量三、全局变量三、全局变量1、全局变量又称为、全局变量又称为外部变量外部变量,是在,是在函数函数之外之外定义的变量,其作用范围是从定义的变量,其作用范围是从定义的位定义的位置置开始到开始到本源程序文件本源程序文件的结束。的结束。2、可使用全局变量获得、可使用全局变量获得多于一个多于一个的返回的返回值,增强函数之间的数据联系通道。值,增强函数之间的数据联系通道。3、降低了函数的通用性(移植)、降低了函数的通用性(移植)局部变量和全局变量int c;g1()int a;int d;g2()int b;int c;F1()int c;c=2;F2()
14、printf(%d,c);局部变量和全局变量变量的重名问题变量的重名问题(1)不同函数内的局部变量重名)不同函数内的局部变量重名互不影响互不影响(2)全局变量与局部变量重名)全局变量与局部变量重名在定义局部变量的函数内,局部变量在定义局部变量的函数内,局部变量有效有效(3)全局变量重名)全局变量重名写出下面程序的运行结果#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);函数与变量的作用域
15、l变量的作用域变量的作用域l变量的存储类别变量的存储类别动态与静态存储变量一、动态存储变量一、动态存储变量1、系统在运行期间根据需要对存储空间进、系统在运行期间根据需要对存储空间进行动态分配的变量称为动态存储变量。行动态分配的变量称为动态存储变量。2、形参变量是动态存储变量、形参变量是动态存储变量3、auto 局部变量是动态存储变量局部变量是动态存储变量auto int a int a动态与静态存储变量void f1()int c;c=4;void main()int a,b;a=b=3;f1();main334f1动态与静态存储变量二、静态存储变量二、静态存储变量1、系统在程序运行期间为其分
16、配固定存储、系统在程序运行期间为其分配固定存储空间的变量。空间的变量。2、全局变量是静态存储变量、全局变量是静态存储变量3、static声明局部变量是静态存储变量声明局部变量是静态存储变量static int a动态与静态存储变量void f1()static int d=4;int c=3;d+;c+;void main()int a,b;a=b=3;f1();main333f14d54动态与静态存储变量int fun(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)
17、;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!函数应用举例函数应用举例1、使用函数求出所有的水仙花数分析:判断范围:100999 假如:有一个函数fun可直接判断一个数是不是水仙花数,那么怎么编?void main()int k;for(k=100;k=999;k+)if(k是水仙花数)printf(“%dn”,k);fun(k)=1函数应用举例函数应用举例void main()int k;for(k=100;k=999;k+)if(fun(k)=1)pr
18、intf(“%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;函数应用举例函数应用举例2、编写一个函数能够实现strcmp的功能printf(%d,strcmp(aa,cc);结果为:-2 strcmp(char s1,char s2)int int i;for(i=0;s1i!=0&s2i!=0;i+)if(s1i-s2i!=0)break;return s1i-s2i;函数应用举例函数应用举例3、编写一个函数能够实现strlen
19、的功能printf(%d,strlen(aa);结果为:2 strlen(char s)int int i,count=0;for(i=0;s i!=0;i+)count+;return count;函数应用举例函数应用举例4、编写一个函数能够实现判断任意一个数是否为素数。for(I=2;I=100;I+)if(prime(I)printf(%d,I);prime(int n)int int j;for(j=2;j=n-1;j+)if(n%j=0)return 0;return 1;函数应用举例函数应用举例函数习题课1、试编制一个求最大公约数的函数,并利用它求任意两个数的最大公约数和最小公倍数
20、。gongyue(int a,int b)int int r;r=m%n;while(r!=0)m=n;n=r;r=m%n;return n;函数应用举例函数应用举例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);l例例5-17 编程处理一批数据,要求:编程处理一批数据,要求:(1)随机产生)随机产生20个个10,99范围内的整数;范围内的整数;(2)以每行)以每行5个数据的形式输出这批整数;个数据的形式输出这批整数;(3)对对这这批批数
21、数据据进进行行升升序序排排列列,并并输输出出排排序序后后的的结结果;果;(4)计算这批数据的平均值;)计算这批数据的平均值;(5)分别统计大于、等于和小于平均值的数据个数。)分别统计大于、等于和小于平均值的数据个数。l分别设计分别设计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)void main
22、()int a20,b3;double x;getdata(a);printdata(a,20);sort(a);printdata(a,20);x=avg(a);count(a,x,b);printdata(b,3);函数编程函数编程void getdata(int a)int i;randomize();for(i=0;i20;i+)ai=random(90)+10;/*random(90)返回0N的随机整整*/函数编程void printdata(int a,int n)int i;for(i=0;in;i+)if(i%5=0)printf(n);printf(%d,ai);函数编程vo
23、id 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;函数编程double avg(int a)double s;int i;s=0.0;for(i=0;in;i+)s=s+ai;return(s/n);函数编程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+;2、选择题在C语言程序中,A、函数的定义可以嵌套,但调用不可以嵌套B、函数的定义不可以嵌套,但
24、函数的调用可以嵌套C、函数的定义和函数的调用都不可以嵌套D、函数的定义和调用均可以嵌套嵌套定义:void A()int a,b;void B()int c;l在以下所列的各函数原型声明中,正确的是: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)l在函数调用语句f(a,b,(c,d);中,实参个数是_。donut()函数接受一个整数,并输出若干个0,输出0的个数等于所接受整数的值。函数原型为:rand
25、om函数不接收任何数据,但返回一个整数。max()函数接收一组整数,并返回一个整数void donut(int n);int random();int max(int a);char ntochar(int n);程序阅读题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=func(k,m);printf(%d,p);4k1mp0m2I4a1b3884a1b121717程序阅读题int f(int n)if(n=0)ret
26、urn 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!程序阅读题void s(int a,int b)int t;t=a;a=b;b=t;printf(%d,%dn,a,b);void main()int m=3,n=4;s(m,n);printf(%d,%dn,m,n);4a3b3m4n3a4b3m4n程序填空题下面的程序是统计高于平均分的人数,输入成绩时,1表
27、示输入结束。_ 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宏定义#define sqr(x)x*xvoid main()printf(%d,sqr(2+3);printf(%d,2+3*2+3);宏定义#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);输入10个数,输出其中与平均值之差的绝对值最小
28、的数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;x=a0;d=fabs(aI-s);#include 写出下面程序的运行结果#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
29、+)aj-1=aj;a6=temp;a7=0;printf(%s,a);ABCDEFGBCDEFGGBCDEFGABCDEFGACDEFGABDEFGABC下列程序输入elephant后的输出结果是:#include main()int I=0,k,ch;int num5=0;char alpha=a,e,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);输入一个字符串,将字符串中的连续空格保留一个。#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)第五章小结l函数的定义、声明与调用函数的定义、声明与调用l参数传递参数传递l变量的作用域和存储类别变量的作用域和存储类别l函数的应用与编程函数的应用与编程
限制150内