《大学计算机C语言函数函数的定义和使用课件.ppt》由会员分享,可在线阅读,更多相关《大学计算机C语言函数函数的定义和使用课件.ppt(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1关于大学计算机关于大学计算机关于大学计算机关于大学计算机C C语语语语言函数函数的定义和言函数函数的定义和言函数函数的定义和言函数函数的定义和使用使用使用使用现在学习的是第1页,共29页2一、函数的概念一、函数的概念 函数是形式上独立、功能上完整的程序段(块)。在C程序设计中常将一些常用功能模块编写成函数。函数可以完成特定的计算或操作处理功能。C程序由函数组成;函数在形式上是平行的,不允许嵌套定义;C程序只执行主函数,子函数必须通过主函数或其他子函数的调用才能被执行;子函数不能调用主函数。实质上,设计程序就是设计函数。5.1 程序设计的艺术程序设计的艺术 (略)(略)5.2 函数的定义和使用
2、函数的定义和使用现在学习的是第2页,共29页3二、函数的分类二、函数的分类(一)从用户的角度分(一)从用户的角度分1.1.标准函数,即库函数标准函数,即库函数 ANSI CANSI C预先定义的用户可直接使用的函数;预先定义的用户可直接使用的函数;使用库函数时,使用库函数时,必须用必须用#include#include把该函数所在的头文件包含进来。把该函数所在的头文件包含进来。2.2.用户自定义函数用户自定义函数 是用户为了解决各种应用问题而自行设计的函数是用户为了解决各种应用问题而自行设计的函数。用用户自定义函数必须先定义后使用户自定义函数必须先定义后使用!(二)从形式上分(二)从形式上分1
3、.1.无参函数:无参函数:即无形式参数的函数。即无形式参数的函数。如:如:getchar()getchar()2.2.有参函数有参函数 即带有形式参数的函数即带有形式参数的函数 如:如:putchar(ch)putchar(ch)、sqrt(x)sqrt(x)现在学习的是第3页,共29页4三、函数的定义三、函数的定义1、无参函数的定义无参函数的定义函数返回值类型函数返回值类型函数返回值类型函数返回值类型 函数名函数名(void)函数体函数体其中:函数返回值类型表示函数的返回结果值类型,函数只能有其中:函数返回值类型表示函数的返回结果值类型,函数只能有一个返回值,若函数无返回值即用一个返回值,若
4、函数无返回值即用void声明;返回函数值需使用:声明;返回函数值需使用:return 变量变量|表达式;表达式;函数名由用户按标识符的命名规则自行给定,但不能与标函数名由用户按标识符的命名规则自行给定,但不能与标准函数同名;准函数同名;圆括号中的关键字圆括号中的关键字void表示函数无形式参数;表示函数无形式参数;函数体是由实现函数功能必需的语句组成。函数体是由实现函数功能必需的语句组成。现在学习的是第4页,共29页5例例1:无参函数的定义。:无参函数的定义。#includevoid PrintMessage(void)printf(t*n);printf(t Programming is f
5、un.n);printf(t*n);int main(void)PrintMessage();PrintMessage();PrintMessage();return 0;现在学习的是第5页,共29页6函数返回值类型函数返回值类型函数返回值类型函数返回值类型 函数名函数名函数名函数名(数据类型数据类型数据类型数据类型 参数参数参数参数1,1,1,1,数据类型数据类型 参数参数参数参数2,2,2,2,)函数体函数体函数体函数体 说明说明说明说明:函数返回值类型、函数名、函数体的含义与无参函数相同;函数返回值类型、函数名、函数体的含义与无参函数相同;函数返回值类型、函数名、函数体的含义与无参函数相
6、同;函数返回值类型、函数名、函数体的含义与无参函数相同;形式参数的格式如:数据类型形式参数的格式如:数据类型形式参数的格式如:数据类型形式参数的格式如:数据类型 形式参数形式参数形式参数形式参数1 1 1 1 形式参数(简称形参)必须单个独立定义,形参是用来接收形式参数(简称形参)必须单个独立定义,形参是用来接收形式参数(简称形参)必须单个独立定义,形参是用来接收形式参数(简称形参)必须单个独立定义,形参是用来接收函数被调用时对应实际参数传递的值或地址的,因此形参只能是函数被调用时对应实际参数传递的值或地址的,因此形参只能是函数被调用时对应实际参数传递的值或地址的,因此形参只能是函数被调用时对
7、应实际参数传递的值或地址的,因此形参只能是变量,形参的存储空间是函数被调用时临时分配的动态空间、用变量,形参的存储空间是函数被调用时临时分配的动态空间、用变量,形参的存储空间是函数被调用时临时分配的动态空间、用变量,形参的存储空间是函数被调用时临时分配的动态空间、用完即释放(不能永久存储数据)。完即释放(不能永久存储数据)。完即释放(不能永久存储数据)。完即释放(不能永久存储数据)。2 2、有参函数的定义、有参函数的定义现在学习的是第6页,共29页7intintintint Average(Average(Average(Average(intintintint x,x,x,x,intinti
8、ntint y)y)y)y)intintintint result;result;result;result;result=(x+y)/2;result=(x+y)/2;result=(x+y)/2;result=(x+y)/2;returnreturnreturnreturn result;result;result;result;函数首部函数体函数体例例2 2:定义有参函数计算两个整数的平均。:定义有参函数计算两个整数的平均。现在学习的是第7页,共29页8#includeinclude intint Average(Average(intint x,x,intint y)y)intint
9、result;result;result=(x+y)/2;result=(x+y)/2;return return result;result;int mainint main(void)(void)intint a1=12,b1=36,a2=24,b2=46,a3=5,b3=25;a1=12,b1=36,a2=24,b2=46,a3=5,b3=25;intint ave1,ave2,ave3;ave1,ave2,ave3;ave1=Average(a1,b1);ave1=Average(a1,b1);ave2=Average(a2,b2);ave2=Average(a2,b2);ave3=A
10、verage(a3,b3);ave3=Average(a3,b3);printfprintf(Average of%d and%d is%d.n,a1,b1,ave1);(Average of%d and%d is%d.n,a1,b1,ave1);printfprintf(Average of%d and%d is%d.n,a2,b2,ave2);(Average of%d and%d is%d.n,a2,b2,ave2);printfprintf(Average of%d and%d is%d.n,a3,b3,ave3);(Average of%d and%d is%d.n,a3,b3,av
11、e3);return 0;return 0;形参为整形变量x和y变量a1和b1为实际参数现在学习的是第8页,共29页91 1 1 1、函数调用的一般形式:、函数调用的一般形式:、函数调用的一般形式:、函数调用的一般形式:函数名(实在参数表)函数名(实在参数表)函数名(实在参数表)函数名(实在参数表)其中:其中:其中:其中:形参形参形参形参(形式参数)定义函数时在函数名后括号中声明的参数;形式参数)定义函数时在函数名后括号中声明的参数;形式参数)定义函数时在函数名后括号中声明的参数;形式参数)定义函数时在函数名后括号中声明的参数;实参实参实参实参(实际参数实际参数实际参数实际参数 )在主调在主调
12、在主调在主调函数中调用函数时函数名后面括号中的参函数中调用函数时函数名后面括号中的参函数中调用函数时函数名后面括号中的参函数中调用函数时函数名后面括号中的参数数数数(或表达式或表达式或表达式或表达式);调用函数时实参的个数、顺序、类型必须与形参一一对应(赋值相调用函数时实参的个数、顺序、类型必须与形参一一对应(赋值相调用函数时实参的个数、顺序、类型必须与形参一一对应(赋值相调用函数时实参的个数、顺序、类型必须与形参一一对应(赋值相容);实参可是常量、变量、函数或表达式;容);实参可是常量、变量、函数或表达式;容);实参可是常量、变量、函数或表达式;容);实参可是常量、变量、函数或表达式;函数调
13、用时实参和形参是采用函数调用时实参和形参是采用函数调用时实参和形参是采用函数调用时实参和形参是采用单向值传递单向值传递单向值传递单向值传递形式即将实参的数值形式即将实参的数值形式即将实参的数值形式即将实参的数值或地址单向传给对应的形参。或地址单向传给对应的形参。或地址单向传给对应的形参。或地址单向传给对应的形参。四、函数的调用四、函数的调用现在学习的是第9页,共29页10有返回值时(有返回值时(即函数功能为某种计算功能即函数功能为某种计算功能)返回值返回值 =函数名函数名(实参表列实参表列););例如:以赋值语句形式调用函数例如:以赋值语句形式调用函数例如:以赋值语句形式调用函数例如:以赋值语
14、句形式调用函数如如如如 c=max(a,b);c=max(a,b);c=max(a,b);c=max(a,b);例如:作为另一个函数的参数形式调用函数例如:作为另一个函数的参数形式调用函数例如:作为另一个函数的参数形式调用函数例如:作为另一个函数的参数形式调用函数如如如如 c=max(max(a,b),c);c=max(max(a,b),c);printf(%dn,max(a,b);printf(%dn,max(a,b);无返回值时(无返回值时(即函数功能是完成某种操作或处理)即函数功能是完成某种操作或处理)例如:以表达式语句形式调用函数例如:以表达式语句形式调用函数例如:以表达式语句形式调用
15、函数例如:以表达式语句形式调用函数如如如如 display(a,b);display(a,b);函数名函数名(实参表列实参表列););2 2、具体调用形式、具体调用形式现在学习的是第10页,共29页11理解函数的调用理解函数的调用理解函数的调用理解函数的调用参数的传递参数的传递参数的传递参数的传递int mainint main(void)(void)intint a=12;a=12;intint b=24;b=24;intint ave;ave;ave=Average(a,b);ave=Average(a,b);printfprintf(Average of%d and%d is%d.nAv
16、erage of%d and%d is%d.n,a,b,ave);,a,b,ave);return 0;return 0;#include#include int Average(int x,int y)int Average(int x,int y)int result;int result;result=(x+y)/2;result=(x+y)/2;return result;return result;现在学习的是第11页,共29页12例例3:定义求:定义求n!函数,然后调用该函数求函数,然后调用该函数求sum=1!+2!+3!+m!的值。的值。#include#include doub
17、le Fac(int n)double Fac(int n)int i;int i;double p=1.0;double p=1.0;for (i=1;i n;i+)for (i=1;i n;i+)p*=i;p*=i;return p;return p;现在学习的是第12页,共29页13int main(void)int main(void)int i,m;int i,m;double sum=0;double sum=0;printf(printf(“Please input m data:Please input m data:”););scanf(scanf(“%d%d”,&m);,&
18、m);for (i=1;i=m;i+)for (i=1;i=m;i+)sum+=Fac(i);sum+=Fac(i);printf(printf(“Sum=Sum=%.0fn”,sum);%.0fn”,sum);return 0;return 0;现在学习的是第13页,共29页14#include int max(int x,int y)int z;if (x y)z=x;else z=y;return(z);int main(void)int a=45,b=78,c=99,d,e;d=max(a,b);printf(max1=%dn,d);printf(max2=%dn,max(a,b);e
19、=c-max(a,b);printf(e=%dn,e);printf(max3=%dn,max(max(a,b),c);return 0;例例例例4 4:函数定义与调用:函数定义与调用:函数定义与调用:函数定义与调用max1=78max2=78e=21max3=99该程序的输出是什么?现在学习的是第14页,共29页15例例例例5 5:定义求素数的函数,然后调用该函数求定义求素数的函数,然后调用该函数求定义求素数的函数,然后调用该函数求定义求素数的函数,然后调用该函数求定义求素数的函数,然后调用该函数求定义求素数的函数,然后调用该函数求100100100到到到到到到200200200之间的所有素
20、数。之间的所有素数。之间的所有素数。之间的所有素数。之间的所有素数。之间的所有素数。#include#include int Prim(int x)int i,j,k;k=(int)sqrt(i);for(j=2;j=k+1)return 1;else return 0;int main(void)int i;for (i=100;i=200;i+)if (Prim(i)printf(“%d,”,i);return 0;现在学习的是第16页,共29页17五、函数原型声明(五、函数原型声明(五、函数原型声明(五、函数原型声明(prototypeprototype)1 1、为什么要声明函数原型?、
21、为什么要声明函数原型?函数应该先定义,然后才能调用。但是,如果函数的调用出现在函数的定义之前,就必须对被向前调用的函数进行函数原型声明,否则就会出现函数调用错误。2 2、声明格式:、声明格式:函数类型 函数名(类型名1 形参数1,);或 函数类型 函数名(类型名1,类型名2,);注意:如果函数严格遵循先定义后调用原则就无需进行函数原型声明。现在学习的是第17页,共29页18例例6 6:函数原型声明(先调用后定义函数):函数原型声明(先调用后定义函数)#include double Fac(int n);int main(void)f1=Fac(m);double Fac(int n).函数Fa
22、c的原型声明先调用函数Fac函数Fac的定义出现在调用之后现在学习的是第18页,共29页19#includeinclude intint Average(Average(intint x,x,intint y)y)intint result;result;result=(x+y)/2;result=(x+y)/2;returnreturn result;result;int mainint main(void)(void)intint a=12;a=12;intint b=24;b=24;intint ave=Average(a,b);ave=Average(a,b);printfprintf
23、(Average of%d and%d is%d.n,a,b,ave);(Average of%d and%d is%d.n,a,b,ave);return 0;return 0;函数定义函数调用例例7:以下函数为先定义后调用,不用声明原型:以下函数为先定义后调用,不用声明原型现在学习的是第19页,共29页20#includeinclude intint AverageAverage(intint x,x,int int y);y);/*/*/*/*声明声明声明声明Average()Average()Average()Average()函数函数函数函数*/i int mainnt main(v
24、oid)(void)int int a=12;a=12;int int b=24;b=24;int int ave=Average(a,b);ave=Average(a,b);printf printf(Average of%d and%d is%d.n,a,b,ave);(Average of%d and%d is%d.n,a,b,ave);return 0;return 0;intint Average(Average(intint x,x,intint y)y)intint result;result;result=(x+y)/2;result=(x+y)/2;returnreturn
25、result;result;例例例例 8 8:函数的原型声明函数的原型声明函数的原型声明函数的原型声明(先调用后定义先调用后定义先调用后定义先调用后定义)现在学习的是第20页,共29页21int main()a();return 0;a 函数函数b();return;b函数函数return;六、函数的嵌套调用六、函数的嵌套调用六、函数的嵌套调用六、函数的嵌套调用 在调用一个函数的过程中,又调用其他的函数,称为函数的嵌套在调用一个函数的过程中,又调用其他的函数,称为函数的嵌套调用。调用。以下为函数调用与调用返回过程:以下为函数调用与调用返回过程:现在学习的是第21页,共29页22例例例例9 9
26、9 9:函数的嵌套调用:函数的嵌套调用:函数的嵌套调用:函数的嵌套调用#include#include float b(float m)float b(float m)float n;float n;n=m*10;n=m*10;return(n);return(n);float add(float x,float y)float add(float x,float y)float z;float z;z=b(x)+y;z=b(x)+y;return(z);return(z);int main(void)int main(void)float a=1.2,b=3.4,c;float a=1.2,
27、b=3.4,c;c=add(a,b);c=add(a,b);printf(“c=%fn”,c);printf(“c=%fn”,c);return 0;return 0;b函数函数main调用调用add函数函数调用调用b函数函数add函数函数 结束结束现在学习的是第22页,共29页23七、函数的递归调用七、函数的递归调用七、函数的递归调用七、函数的递归调用 在调用一个函数的过程中,出现直接或间接地调用该函数本身,在调用一个函数的过程中,出现直接或间接地调用该函数本身,称为函数的递归调用。称为函数的递归调用。int f(int x)int y,z;z=f(y);return(2*z);f函数调用f
28、函数f1函数调用f2函数f2函数调用f1函数现在学习的是第23页,共29页24例例例例10101010:函数的递归调用:函数的递归调用:函数的递归调用:函数的递归调用 有有3个人坐在一起,问第个人坐在一起,问第3个人多少岁?他说比第个人多少岁?他说比第2个人大个人大2岁。问岁。问第第2个人多少岁?他说比第个人多少岁?他说比第1个人大个人大2岁。最后问第岁。最后问第1个人,他说是个人,他说是10岁。请问第岁。请问第3个人多大?个人多大?分析:分析:age(3)=age(2)+2;age(2)=age(1)+2;age(1)=10;归纳:归纳:n=1 age(n)=10 n1 age(n)=age
29、(n-1)+2现在学习的是第24页,共29页25程序如下:程序如下:#include int age(int n)int c;if(n=1)c=10;else if(n 1)c=age(n-1)+2;return c;int main(void)printf(“%d”,age(3);return 0;程序执行过程如下:程序执行过程如下:int main(void)printf(“%d”,age(3);int age(3)int c;c=age(2)+2;return c;int age(2)int c;c=age(1)+2;return c;int age(1)int c;c=10;retur
30、n c;现在学习的是第25页,共29页26课课课课堂堂堂堂习习习习题题题题#include#include void func1(int i);void func1(int i);void func2(int i);void func2(int i);char st =hello,friend!;char st =hello,friend!;void func1(int i)void func1(int i)printf(%c,sti);printf(%c,sti);if (i 3)if (i 3)i+=2;i+=2;func2(i);func2(i);void func2(int i)voi
31、d func2(int i)printf(%c,sti);printf(%c,sti);if (i 3)if (i 3)i+=2;i+=2;func1(i);func1(i);int main(void)int main(void)int i=0;int i=0;func1(i);func1(i);return 0;return 0;A)helloA)helloB)helB)helC)hloC)hloD)hlmD)hlm1 1下列程序执行后的输出结果是(下列程序执行后的输出结果是(下列程序执行后的输出结果是(下列程序执行后的输出结果是()现在学习的是第26页,共29页272有如下程序:有如下程
32、序:#include#include int func(int a,int b)int func(int a,int b)return(a+b);return(a+b);int main(void)int main(void)int x=2,y=5,z=8,r;int x=2,y=5,z=8,r;r=func(func(x,y),z);r=func(func(x,y),z);printf(“%dn”,r);printf(“%dn”,r);return 0;return 0;该程序的输出的结果是(该程序的输出的结果是()。)。A)12A)12B)13B)13C)14C)14D)15D)15现在学习的是第27页,共29页283下面程序的输出结果是(下面程序的输出结果是()。)。#include int f(int a,int b);int main(void)int i=2,p;p=f(i,i+1);printf(“%d”,p);return 0;int f(int a,int b)int c;if (a b)c=1;else if (a=b)c=0;else c=-1;return c;A)1B)0C)1D)2现在学习的是第28页,共29页29感感谢谢大大家家观观看看现在学习的是第29页,共29页