C语言程序设计第六章函数.ppt
《C语言程序设计第六章函数.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计第六章函数.ppt(110页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第六章第六章 函函 数数C6.1概述函数是一段程序,它完成特定的任务,使用它时可用简单的方法为其提供必要的数据,然后自动执行这段程序,计算完毕后能保存计算结果回到程序原来的位置继续计算。C如果把编程比做制造一台机器,函数就好比其零部件可将这些“零部件”单独设计、调试、测试好,用时拿出来装配,再总体调试这些“零部件”可以是自己设计制造/别人设计制造/现在的标准产品而且,许多“零部件”我们可以只知道需向它提供什么,它能产生什么,并不需要了解它是如何工作、如何设计制造的所谓“黑盒子”。黑箱(函数)结果(输出参数)输入参数C函数用于把较大的计算任务分解成若干个较小的任务使程序人员可以在其他函数的基础上
2、构造程序,而不需要从头做起一个设计得当的函数可以把具体操作细节对程序中不需要知道它们的那些部分隐藏掉,从而使整个程序结构清楚,减轻了因修改程序所带来的麻烦。C语言在设计函数时考虑了效率与易于使用这两个方面。一个C程序一般都由许多较小的函数组成,而不是只由几个比较大的函数组成。一个程序可以驻留在一个文件中,也可以存放在多个文件中。各个文件可以单独编译并与库中已经编译过的函数装配在一起。C编写一个测试软件显示软件封面检查密码产生题目接受回答评判计分显示结果如果要继续练习告别词Cmain()charans=y;clrscr();cover();/*调用软件封面显示函数*/password();/*调
3、用密码检查函数*/while(ans=y|ans=Y)question();/*调用产生题目函数*/answers();/*调用接受回答函数*/marks();/*调用评分函数*/results();/*调用结果显示函数*/printf(“是否继续练习?(Y/N)n”);ans=getchar();printf(“谢谢使用,再见!”);C/*定义所用函数*/cover()/*软件封面显示函数*/password()/*密码检查函数*/question()/*产生题目函数*/answers()/*接受回答函数*/marks()/*评分函数*/results()/*结果显示函数*/C在C程序设计中
4、,通常:将一个大程序分成几个子程序模块(自定义函数)将常用功能做成标准模块(标准函数)放在函数库中供其他程序调用将程序中反复使用的程序段写成函数的形式,某些只用一次的程序段往往也写成函数形式 引入函数的优点:减少重复编写程序的工作量使程序便于调试和阅读C例6.1main()/*主函数*/printstar();/*调用printstar函数画*/print_message();/*调用print_message函数写字*/printstar();/*调用printstar函数画*/printstar();/*printstar函数*/printf(“n*”);print_message();/
5、*print_message函数*/printf(“nHello!”);运行结果:*Hello!*C说明:程序的执行从main函数开始,由主函数调用其它函数,其它函数也可以相互调用,程序流程最后回到main函数,在main函数中结束整个程序的运行mainmain函数是系统定义的,只能由系统调用函数是系统定义的,只能由系统调用所有函数在定义时都是平行的,相互独立(一个函数并不从属于另一个函数),即函数不能嵌套定义,但可以相互调用一个程序可以由一个或多个源程序文件组成C一个(主调)函数可以多次调用多个(被调)函数。同一个函数也可以被一个或多个(主调)函数调用任意多次。下图说明一种调用关系:main
6、abcfdefghid函数分类使用情况库函数(标准函数):由系统提供,用户可以直接使用用户自定义函数:解决用户的专门需要函数形式无参函数:主调函数与被调函数之间没有数据传递有参函数:主调函数与被调函数之间有数据传递任务情况带返回值不带返回值C6.2函数的定义一般形式:函数类型说明符 函数名(形式参数表)变量说明部分语句部分函数体含义:类型说明符:指定函数值的类型。若该项缺省,表示函数值为 int 型。若函数没有值,应写作void.C函数的定义函数名:标识符,用于标识函数,并用其来调用函数。函数名字有值,它代表函数的入口地址。形式参数表:说明参数的个数和类型,简称形参表。一般来说,计算函数需要多
7、少原始数据,函数的形参表中就有多少个形参,每个形参存放一个数据。变量说明:说明函数中用到的除形参以外的其它变量。函数体:为了完成特定的功能而设计的一个或多个语句。C函数的定义无参函数的定义一般形式:数据类型函数名()说明部分语句现代风格是:数据类型函数名(void)说明部分语句例如:print_message()C函数的定义有参函数的定义一般形式:数据类型函数名(形参表)形参类型说明;说明部分语句现代风格是:数据类型函数名(带类型形参表)说明部分语句Cintmax(x,y)intx,y;intz;z=xy?x:y;return(z)数据类型函数名(形参表)形参类型说明;说明部分语句intmax
8、(intx,inty)intz;z=xy?x:y;return(z)/*现代风格是:函数名(带类型形参表)*/C空函数一般形式:数据类型函数名()例如:dummy()特点:调用后什么也不做用处:建立程序结构,该空函数在需要时补充C例6.2求两个整数中的大者并输出main()inta=2,b=25;intc;c=max(a,b);printf(“Maxis%dn”,c);max(intx,inty)intz;z=xy?x:y;returnz;运行输出:Maxis25C例6.3求两个实数中的大者并输出main()floata=1.5,b=2.5;intc;c=max(a,b);printf(“Ma
9、xis%dn”,c);max(floatx,floaty)floatz;z=xy?x:y;returnz;运行输出:Maxis2(编译通过,结果错误)Cmain()floata=1.5,b=2.5;floatc;c=max(a,b);printf(“Maxis%fn”,c);max(floatx,floaty)floatz;z=xy?x:y;returnz;将%d改为%f,将intc;改为floatc;运行输出:Maxis2.000000(结果仍然错误)Cmain()floata=1.5,b=2.5;floatc;c=max(a,b);printf(“Maxis%fn”,c);floatmax
10、(floatx,floaty)floatz;z=xy?x:y;returnz;将max(floatx,floaty)改为floatmax(floatx,floaty)编译出错C为什么?C6.3函数的调用函数定义制造函数函数使用声明(准备使用)调用(使用函数)通过函数调用,两个函数中的数据发生联系。C6.3.1形式参数和实际参数形式参数:定义函数时函数名后括号内的变量名称实际参数:主调函数中调用函数时,函数名后括号内的参数(变量,表达式等)C例6.4调用函数时的数据传递main()inta,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(“Maxis%dn”,c
11、);max(x,y)intx,y;intz;z=xy?x:y;returnz;实际参数形式参数abxyC说明形参在函数调用前不占用存储单元,在调用时被分配,调用后释放所占用的存储单元;形参只能是变量,而实参可以是常量、变量或表达式,但要求它们有确定的值。调用时将实参的值赋给形参。在函数中必须指定形参的类型;实参和形参个数相等,按顺序对应,一一传递,实参和形参的类型应相同或赋值兼容;语言规定,实参对形参的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。void fun(int i,int jint i,int j)int x
12、=7;printf(i=%d,j=%d,x=%dn,i,j,x);main()int i=2,x=5,j=7;fun(j,6j,6);printf(i=%d,j=%d,x=%dn,i,j,x);i=7,j=6,x=7i=2,j=7,x=5#includevoidsum(intx,inty,intz)z=x+y;main()inta=1,b=2,c=0;sum(a,b,c);printf(c=%dn,c);c=?0C6.3.2函数的返回值函数的返回值是通过函数中的return语句获得的。return语句将被调用函数中的一个确定值带回主调函数中去。return语句一般形式:return(表达式);
13、或:return表达式;或:return;若return后面带表达式,首先计算表达式的值,表达式的值就是所求的函数值。表达式的类型与函数首部说明的类型一致。intint max(int x,int y)int z;z=(xy)?x:y;return(z z);return(xy?x:yxy?x:y);一个函数可以含有多个return语句,但当执行到其中一个return语句就返回主调函数。一个函数可以没有return语句,此时当函数执行到最后一个界限符“”时返回主调函数。说明说明C函数值的类型:应当在定义函数时指定函数的类型。intintmax(intx,inty)doubledoublemin
14、(intx,inty)charcharletter(charc1,charc2)max(intx,inty)intmax(intx,inty)语言规定,凡不加类型声明的函数,自动按语言规定,凡不加类型声明的函数,自动按 intint型型处理。处理。C在定义函数时,对函数值声明的类型一般应该和return语句中的表达式类型一致;若不一致,则以函数类型为准(自动转换)。对于有返回值的函数,若return语句后面没有表达式,或没有return语句,此时带回一个不确定的返回值。为了明确表示“不带回值”,可以用void定义“无类型”(或称“空类型”)。void stars(int n)Cprintsta
15、r()printf(*);main()inta;a=printstar();printf(%d,a);例 函数带回不确定值输出:10voidprintstar()printf(*);main()inta;a=printstar();printf(%d,a);编译错误!C例 函数返回值类型转换main()floata,b;intc;scanf(%f%f,&a,&b);c=max(a,b);printf(Maxis%dn,c);max(floatx,floaty)floatz;z=xy?x:y;return(z);运行输出:1.52.5Maxis2C6.3.3函数调用的一般形式函数名(实参1,实参
16、2,实参n)执行过程:计算各个表达式,得到值v1,vn,把v1,vn赋给对应的形参。然后转去执行函数体,函数体执行结束后,即遇到return语句或执行完函数的最后一个语句,返回到函数调用处。C说明实参与形参多个实参间用逗号隔开实参与形参间个数相等,类型应一致实参与形参按顺序对应,一一传递数据实参表求值的顺序与系统有关C调用方式:函数语句:由函数调用加上分号构成,在主调函数中可作为一个独立的语句stars(20);print_message();函数表达式:函数调用作为一个运算对象出现在表达式中,此时要求函数带回一个确定的值以参加表达式的运算c=max(a,b);函数参数:函数调用作为另一个函数
17、的实参,其值作为一个实际参数传给被调函数的形参进行处理;此时也要求函数带回一个确定值m=max(a,max(b,c);C调用位置首先被调用函数必须是已存在的函数,如用户自定义函数或库函数。如果使用库函数,需要在文件的开头用#include命令将需要的库函数包含到文件中。#include调用同一源文件中的非标准函数时,必须在主调函数中对所调函数进行声明:函数声明语句(函数原型)C6.4函数原型一般形式:类型标识符 被调函数名(形参类型 形参名);功能:通知编译程序函数值是什么类型,有多少参数及它们各自的类型,为编译程序进行类型检查提供依据例如:double power(int x,int n);
18、或 double power(x,n);或 double power();C例6.5main()floatadd();floata,b,c;scanf(“%f,%f”,&a,&b);c=printf(“sumis%f”,add(a,b);floatadd(x,y)floatx,y;floatz;z=x+y;return(z);/*对被调用函数的说明*/作为表达式被调用/*定义add函数*/运行结果:3.6,5.5sumis9.100000C函数定义和函数声明的区别函数的定义是确定函数的功能,包括函数名,函数值类型,形参及类型和函数体全部内容。函数的声明只是对要被调用的函数的返回值的类型进行说明
19、,它只包括函数名、函数类型或形参类型,不包括函数体。C三种情况下可以省略声明:函数值是整型(int)或字符型(char)时系统自动按整型说明;所调函数的定义出现在主调函数之前时;文件一开头,在所有函数之前,对所用函数作了声明C无函数说明整型函数main()inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Maxis%d”,c);max(x,y)intx,y;intz;z=xy?x:y;return(z);函数值是整型(int)或字符型(char)时系统自动按整型说明C被调函数在主调函数之前主调函数在被调函数之后被调用函数出现在主调用函数之前。fl
20、oatadd(floatx,floaty)floatz;z=x+y;return(z);main()floata,b;scanf(%f,%f,&a,&b);printf(sumis%f,add(a,b);C在所有函数之前说明函数类型此处不必说明定义letter函数文件一开头,对所用函数作了声明charletter();main().charletter(c1,c2)charc1,c2;.Cmain()floata=1.5,b=2.5;floatc;c=max(a,b);printf(“Maxis%fn”,c);max(floatx,floaty)floatz;z=xy?x:y;returnz;
21、例6.3求两个实数中的大者并输出运行输出:Maxis2.000000(编译通过,结果错误)因为函数没声明!Cmain()floatmax(floatx,floaty);floata=1.5,b=2.5;floatc;c=max(a,b);printf(“Maxis%fn”,c);floatmax(floatx,floaty)floatz;z=xy?x:y;returnz;运行输出:Maxis2.500000main()floatmax(floatx,floaty);floata=1.5,b=2.5;floatc;c=max(a,b);printf(“Maxis%fn”,c);floatmax(
22、floatx,floaty)floatz;z=xy?x:y;returnz;函数原型C附:调用外部函数(其他源文件中定义的函数)时 函数说明语句 extern函数名();例文件file1.c中main()intx=80,y=90,c;externmax();/*函数说明*/c=max(x,y)+20;/*调用max函数*/printf(“Maxis%dn”,c);文件files2.c中(与file1.c同目录)externmax(inta,intb)/*extern可省略*/floatc;c=ab?a:b;returnc;C6.5函数的嵌套调用C语言允许嵌套调用函数,即在调用一个函数的过程中,
23、又调用另一个函数主函数()声明a函数调用a函数a函数()声明b函数调用b函数b函数()C6.6函数的递归调用C语言允许递归调用函数,即在调用一个函数的过程中,又直接或间接的调用该函数本身直接递归调用调用函数的过程中又调用该函数本身intf(intx)inty;y=f(x);returny;C间接递归调用调用f1函数的过程中调用f2函数,而f2中又需要调用f1。显然,以上均为无终止递归调用。为此,一般要用if语句来控制使递归过程到某一条件满足时结束。intf1(intx)inty;y=f2(x);returny;intf2(intx)inty;y=f1(x);returny;C递归法:类似于数学
24、证明中的反推法,从后一结果与前一结果的关系中寻找其规律性。归纳法可以分为:递推法 从初值出发,归纳出新值与旧值间直到最后值为止存在的关系要求通过分析得到:初值+递推公式编程:通过循环控制结构实现(循环的终值是最后值)递归法 从结果出发,归纳出后一结果与前一结果直到初值为止存在的关系要求通过分析得到:初值+递归函数C编程:设计一个函数(递归函数),这个函数不断使用下一级值调用自身,直到结果已知处选择控制结构其一般形式是:在主函数中用终值n调用递归函数,而在递归函数中:递归函数名f(参数x)if(n=初值)结果=;else结果=含f(x-1)的表达式;返回结果(return);C例6.6用递归法求
25、n!递推法0!=11!=0!12!=1!2n!=(n1)!n分析得Sn=n!的求解1(n=1,0)Sn=Sn-1n(n1)其中Sn-1先求出递归法n!=(n1)!n(n1)!=(n2)!(n1)(n2)!=(n3)!(n2)2!=1!2分析得f(n)=n!的求解f(n)=f(n1)n(n1)其中f(n1)未求出C实际上,递归程序分两个阶段执行(1)回推(调用):欲求n!先求(n-1)!(n-2)!1!若1!已知,回推结束。(2)递推(回代):知道1!2!可求出3!n!main()intn;floats;floatfac();printf(Inputn=);scanf(%d,&n);s=fac(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 第六 函数
限制150内