(9)--C语言课件第09章函数.ppt
《(9)--C语言课件第09章函数.ppt》由会员分享,可在线阅读,更多相关《(9)--C语言课件第09章函数.ppt(85页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第9章章函数函数人们在设计一个复杂的程序时,通常人们在设计一个复杂的程序时,通常将它分解为若干个相对独立的将它分解为若干个相对独立的程序模块程序模块(模块化程序设计,(模块化程序设计,有利于程序的调试和有利于程序的调试和维护维护)。)。在在C语言中通过语言中通过将一个程序划分为若干将一个程序划分为若干个函数个函数,来实现程序的模块化。,来实现程序的模块化。C语言函数的分类:语言函数的分类:1.按函数编写者划分按函数编写者划分库函数库函数:是由是由C语言编译系统预先定义好的函数,语言编译系统预先定义好的函数,用户可直接调用。用户可直接调用。如如printf函数、函数、sqrt函数等。函数等。用
2、户函数用户函数:是由用户自己定义的函数。是由用户自己定义的函数。如前面程序中的如前面程序中的main函数。函数。2.按函数形式划分按函数形式划分无参函数无参函数:不带参数(自变量)的函数。不带参数(自变量)的函数。如如getchar函数。函数。有参函数有参函数:带有参数(自变量)的函数。带有参数(自变量)的函数。如如printf函数、函数、sqrt函数等。函数等。库函数库函数是由是由C语言编译系统预先定义好的函语言编译系统预先定义好的函数,用户可直接调用。数,用户可直接调用。用户在程序中调用库函数时,必须用用户在程序中调用库函数时,必须用include命令命令包含相应的头文件包含相应的头文件。
3、库函数与库函数与头文件的对应关系可查表。头文件的对应关系可查表。【例例】从键盘输入一个以度为单位的角度值,求从键盘输入一个以度为单位的角度值,求其正弦值并输出。其正弦值并输出。#include#include#definePI3.14159main()floatx,y;scanf(%f,&x);y=sin(x);/调用调用库函数只须给出函数名和参数即库函数只须给出函数名和参数即可可printf(y=%fn,y);/此程序有错,你能发现吗?此程序有错,你能发现吗?【例例】从键盘输入一个以度为单位的角度值,求从键盘输入一个以度为单位的角度值,求其正弦值并输出。其正弦值并输出。#include#in
4、clude#definePI3.14159main()floatx,y;scanf(%f,&x);x=x*PI/180;/*化为弧度化为弧度*/y=sin(x);/*调用库函数只须给出函数名和参数即可调用库函数只须给出函数名和参数即可*/printf(y=%fn,y);用户函数的定义和调用用户函数的定义和调用可以将程序中可以将程序中相对独立的程序段相对独立的程序段定义为一个定义为一个函数。函数。主调函数:调用另一个函数的函数。主调函数:调用另一个函数的函数。被调函数:被另一个函数调用的函数。被调函数:被另一个函数调用的函数。无参函数的定义无参函数的定义格式:格式:类型名类型名函数名函数名()函
5、数体函数体【例例】编程序打印如下图形。编程序打印如下图形。Thefirstone:Thesecondone:首先,编写一个只有首先,编写一个只有main函数的程序以实现上述功函数的程序以实现上述功能。能。#includeint main(void)int main(void)inti,j;printf(Thefirstone:n);for(i=1;i=4;i+)for(j=1;j=i;j+)printf(*);printf(n);printf(Thesecondone:n);for(i=1;i=4;i+)for(j=1;j=i;j+)printf(*);printf(n);return 0;r
6、eturn 0;在该程序中,打印一个三角形的程序段重复在该程序中,打印一个三角形的程序段重复了两次,但是并不能简单地将它们合并为了两次,但是并不能简单地将它们合并为一个循环。一个循环。因此可以将打印三角形的程序段单独拿出来,因此可以将打印三角形的程序段单独拿出来,定义为一个被调函数,然后在主函数中调定义为一个被调函数,然后在主函数中调用它。用它。为了得到打印三角形的被调函数,只需以相应的程为了得到打印三角形的被调函数,只需以相应的程序段作为序段作为函数体函数体,并添加,并添加函数头函数头即可。即可。voidstar()inti,j;for(i=1;i=4;i+)for(j=1;j=i;j+)p
7、rintf(*);printf(n);return;无参函数无参函数的调用的调用用户定义了函数之后,就可以用户定义了函数之后,就可以像调用库函数像调用库函数那样那样调用它。调用它。无参函数的调用格式无参函数的调用格式:函数名函数名()例例2续续main()printf(Thefirstone:n);star();/*调用前面定义的函数调用前面定义的函数star*/printf(Thesecondone:n);star();/*调用前面定义的函数调用前面定义的函数star*/#include#include void star(void star()int i,j;int i,j;for(i=1
8、;i=4;i+)for(i=1;i=4;i+)for(j=1;j=i;j+)for(j=1;j=i;j+)printf(*);printf(*);printf(n);printf(n);return;return;mainmain()()printf(The first printf(The first one:n);one:n);star();star();printf(The second printf(The second one:n);one:n);star();star();无参函数的无参函数的调用调用及及返回返回过程过程有参函数有参函数的定义和调用的定义和调用首先来看一个实例。首先
9、来看一个实例。【例例9.3】已知已知m、n是正整数,编写程序是正整数,编写程序求求m中取中取n的组合数。的组合数。问题分析:问题分析:首先,我们编写一个只有首先,我们编写一个只有main函数的程序函数的程序以实现上述功能。以实现上述功能。#includemain()intm,n,i,k;longp,c,c1,c2,c3;printf(请输入请输入m与与n的值:的值:);scanf(%d%d,&m,&n);k=m;p=1;for(i=1;i=k;i+)p=p*i;c1=p;k=n;p=1;for(i=1;i=k;i+)p=p*i;c2=p;k=m-n;p=1;for(i=1;i=k;i+)p=p
10、*i;c3=p;c=c1/(c2*c3);printf(m中取中取n的组合数的组合数=%ldn,c);本程序中可以将求阶乘的程序段单独拿出来,定义本程序中可以将求阶乘的程序段单独拿出来,定义为一个为一个被调函数被调函数,然后在主函数中调用它。,然后在主函数中调用它。为了得到求阶乘的被调函数,只需为了得到求阶乘的被调函数,只需以相应的程序段以相应的程序段作为函数体作为函数体,并添加,并添加函数头函数头即可。即可。longfac()longp;inti,k;p=1;for(i=1;i=k;i+)p=p*i;return;分析该被调函数,可以发现还存在两个问题分析该被调函数,可以发现还存在两个问题没
11、有解决。没有解决。一是变量一是变量m、n的值显然应该在主调函数中输的值显然应该在主调函数中输入,如何将入,如何将m、n及及m-n的值的值传递给变量传递给变量k呢呢?二是如何将求得的阶乘(即变量二是如何将求得的阶乘(即变量p的值)的值)传传递给递给主调函数中的变量主调函数中的变量c1、c2与与c3呢?呢?为了实现主调函数与被调函数之间的数据传为了实现主调函数与被调函数之间的数据传递,递,C语言规定:语言规定:将被调函数中将被调函数中用于接受数据的变量用于接受数据的变量的定义,的定义,移到函数首部的括号中,称为移到函数首部的括号中,称为被调函数的被调函数的参数参数;将被调函数中将被调函数中用于向主
12、调函数传递数据的变用于向主调函数传递数据的变量量(或表达式或表达式)置于置于return之后,称为之后,称为被被调函数的返回值调函数的返回值。修正之后的被调函数如下:修正之后的被调函数如下:longfac(intk)longp;inti;p=1;for(i=1;i=k;i+)p=p*i;returnp;一旦定义好了求阶乘的被调函数,就可以像调用库一旦定义好了求阶乘的被调函数,就可以像调用库函数那样来调用它。函数那样来调用它。相应的主函数如下:相应的主函数如下:main()intm,n;longc,c1,c2,c3;printf(请输入请输入m与与n的值:的值:);scanf(%d%d,&m,&
13、n);c1=fac(m);c2=fac(n);c3=fac(m-n);c=c1/(c2*c3);printf(m中取中取n的组合数的组合数=%ldn,c);main()intm,n;longc;printf(请输入请输入m与与n的值的值n);scanf(%d%d,&m,&n);c=fac(m)/(fac(n)*fac(m-n);printf(组合数为组合数为%ldn,c);#include long fac(int k)long p;int i;p=1;for(i=1;i=k;i+)p=p*i;return p;完整源程序完整源程序有参函数的定义与调用格式有参函数的定义与调用格式1.有参函数有
14、参函数的定义格式的定义格式类型名类型名函数名函数名(形式参数形式参数表表)函数体函数体2.有参函数的调用格式有参函数的调用格式函数名函数名(实际参数实际参数表表)【练习练习】定义一个求定义一个求n的阶乘的函数,并在的阶乘的函数,并在主函数中调用它求主函数中调用它求1!+3!+.+19!。函数的参数函数的参数函数的参数分为两种。函数的参数分为两种。1.形式参数:形式参数:定义定义函数时所使用的参数。函数时所使用的参数。2.实际参数:实际参数:调用调用函数时所使用的参数。函数时所使用的参数。3.形参格式:形参格式:类型名类型名形参形参1,类型名类型名形参形参2,如如intmax(intx,inty
15、)4.实参格式:实参格式:实参实参1,实参,实参2,如如c=max(a,b);5.参数的传递过程参数的传递过程函数函数调用调用时,将时,将实参实参的值的值赋给赋给对应的对应的形参形参;但;但函数函数返回返回时,形参的值不能传回给实参。时,形参的值不能传回给实参。这种传递方式称为这种传递方式称为值传递值传递,即单向传递。,即单向传递。#includeintmax(intx,inty)intz;if(xy)z=x;elsez=y;return(z);main()inta,b,c;scanf(%d%d,&a,&b);c=max(a,b);printf(c=%dn,c);参数的传递过程参数的传递过程6
16、.几点说明几点说明因为参数传递时,要将因为参数传递时,要将实参实参的值的值赋给赋给对应的对应的形形参参,故要求:,故要求:形参形参只能是只能是变量变量,而实参可以是常量、变量,而实参可以是常量、变量或表达式。或表达式。实参实参与对应的与对应的形参形参应该应该类型相同类型相同或或赋值兼容赋值兼容。如整型、实型、字符型之间。如整型、实型、字符型之间。函数的返回值函数的返回值被调函数用被调函数用return语句语句传递给主调函数的传递给主调函数的值,称为被调函数的值,称为被调函数的返回值返回值(函数值)。(函数值)。return语句语句格式:格式:return表达式表达式;或或return(表表达式
17、达式);return;(可省略不写可省略不写)例如:例如:return(xy?x:y);功能:返回到主调函数,并以表达式的值功能:返回到主调函数,并以表达式的值作为被调函数的返回值。作为被调函数的返回值。#includeintmax(intx,inty)intz;if(xy)z=x;elsez=y;return(z);main()int a,b,c;scanf(%d%d,&a,&b);c=max(a,b);printf(c=%dn,c);有参函数的调用与返回有参函数的调用与返回3.几点说明几点说明一次一次函数调用函数调用至多至多有有一个一个返回值。返回值。例如:例如:intf(intx)if(
18、x=0)return1;elsereturn-1;例如:例如:intf()return3.96;其返回值为其返回值为3。函数的类型函数的类型决定决定返回值返回值的类型。的类型。若一个被调函数若一个被调函数无须返回值无须返回值,则可以将其,则可以将其函数类型定义为函数类型定义为void(空值类型),以明确(空值类型),以明确表示该函数无返回值。表示该函数无返回值。这类函数或者使用这类函数或者使用return;返回,或者直接返回,或者直接省省略略return语句。语句。例如,例例如,例9.1中的被调函数中的被调函数star就应该定义为就应该定义为void类型。类型。若在定义函数时,未明确指明该函数
19、的类型若在定义函数时,未明确指明该函数的类型,那么,那么C89标准标准会将该函数的类型视为会将该函数的类型视为int型型。不过,最好还是不过,最好还是旗帜鲜明旗帜鲜明地指明函数的类型,地指明函数的类型,以使得程序更加规范。以使得程序更加规范。例如,前面所有程序中的例如,前面所有程序中的main函数,其函数类函数,其函数类型均视为型均视为int型。型。函数的调用方式函数的调用方式函数有函数有两种两种调用方式。调用方式。1.函数调用函数调用作表达式作表达式是指将函数调用作为一个表达式的一部分。是指将函数调用作为一个表达式的一部分。例如:例如:c1=fac(m);printf(%fn,fac(m);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课件 09 函数
限制150内