全国计算机等级考试二级C第七章 函数.ppt

上传人:仙人指路1688 文档编号:2223919 上传时间:2023-02-02 格式:PPT 页数:53 大小:475KB
返回 下载 相关 举报
全国计算机等级考试二级C第七章 函数.ppt_第1页
第1页 / 共53页
全国计算机等级考试二级C第七章 函数.ppt_第2页
第2页 / 共53页
全国计算机等级考试二级C第七章 函数.ppt_第3页
第3页 / 共53页
全国计算机等级考试二级C第七章 函数.ppt_第4页
第4页 / 共53页
全国计算机等级考试二级C第七章 函数.ppt_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《全国计算机等级考试二级C第七章 函数.ppt》由会员分享,可在线阅读,更多相关《全国计算机等级考试二级C第七章 函数.ppt(53页珍藏版)》请在三一办公上搜索。

1、全国计算机等级考试二级C,第七章 函 数,2010年10月-2011年3月,第七章 函 数,7.1 库函数7.2 函数的定义和返回值7.3 函数的调用7.4 函数的说明7.5 调用函数和被调用函数之间的数据 传递7.6 程序举例,由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。,一个较大的程序可分为若干个程序模块,每一个模块用来实现一个特定的功能。在高级语言中用子程序实现模块的功能。子程序由函数来完成。一个程序可由一个主函数和若干个其他函数构成。,函数间的调用关系,例 先举一个函数调用的简单例子,#include void main()void pri

2、ntstar();/*对printstar函数声明*/void print_message();/*对print_message函数声明*/printstar();*调用printstar函数*print_message();/*调用print_message函数*/printstar();*调用printstar函数*/,void printstar()*定义printstar函数*printf(*n);void print_message()*定义print_message函数*printf(How do you do!n);,运行情况如下:*How do you do!*,说明:(1)一

3、个程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。对较大的程序,一般不希望把所有内容全放在一个文件中,而是将他们分别放在若干个源文件中,再由若干源程序文件组成一个C程序。这样便于分别编写、分别编译,提高调试效率。一个源程序文件可以为多个C程序公用。,(2)一个源程序文件由一个或多个函数以及其他有关内容(如命令行、数据定义等)组成。一个源程序文件是一个编译单位,在程序编译时是以源程序文件为单位进行编译的,而不是以函数为单位进行编译的。,(3)程序的执行是从函数开始的,如是在函数中调用其他函数,在调用后流程返回到函数,在函数中结束整个程序的运行。,(4)所有函数都是平行的,即在定义

4、函数时是分别进行的,是互相独立的。一个函数并不从属于另一函数,即函数不能嵌套定义。函数间可以互相调用,但不能调用函数。函数是系统调用的。,(5)从用户使用的角度看,函数有两种:标准函数,即库函数。这是由系统提供的,用户不必自己定义这些函数,可以直接使用它们。应该说明,不同的C系统提供的库函数的数量和功能会有一些不同,当然许多基本的函数是共同的。用户自己定义的函数。用以解决用户的专门需要。,(6)从函数的形式看,函数分两类:无参函数。如例中的printstar和print_message就是无参函数。在调用无参函数时,主调函数不向被调用函数传递数据。无参函数一般用来执行指定的一组操作。例如,例程

5、序中的printstar函数。有参函数。在调用函数时,主调函数在调用被调用函数时,通过参数向被调用函数传递数据,一般情况下,执行被调用函数时会得到一个函数值,供主调函数使用。,特别强调:在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。但是函数之间允许相互调用,也允许嵌套调用。习惯上把调用者称为主调函数。函数还可以自己调用自己,称为递归调用。main 函数是主函数,它可以调用其它函数,而不允许被其它函数调用。因此,程序的执行总是从main函数开始,完成对其它函数的调用后再返回到main函数,最后由main函数结束整个程序。一个源程序必须有,也只能有一个主函数main。,C语言提供了丰

6、富的库函数,这些函数包括了常用的数学函数,如求正弦值的sin函数,求平方根值的sqrt函数;包括了对字符和字符串进行处理的函数,如isspace函数,getchar()函数;包括进行输入输出处理的各种函数。详见本书附录8,1.调用C语言标准库函数时要求的include命令行 例如,调用数学库函数时,要求程序在调用数学库函数前包含以下的include命令行:#include“math.h”,2.标准库函数的调用 对库函数的一般调用形式为:函数名(参数表)在C语言中,库函数的调用可以两种形式出现。(1)出现在表达式中。例如求y=x2.5+1.3,可以通过以下语句调用pow函数来求得:y=pow(x

7、,2.5)+1.3 在这里,函数的调用出现在赋值号右边的表达式中。又如:for(printf(“:”);scanf(“%d,在printf函数调用之后加一个分号,这就构成了一条独立的语句。,7.2 函数的定义和返回值,无参函数的定义一般形式,定义无参函数的一般形式为:类型标识符函数名()声明部分 语句部分,在定义函数时要用“类型标识符”指定函数值的类型,即函数带回来的值的类型。前面例中的printstar和print_message函数为void类型,表示不需要带回函数值。,其中类型标识符和函数名称为函数头。类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型。该类型标识符与前面介

8、绍的各种说明符相同。函数名是由用户定义的标识符,函数名后有一个空括号,其中无参数,但括号不可少。中的内容称为函数体。在函数体中声明部分,是对函数体内部所用到的变量的类型说明。在很多情况下都不要求无参函数有返回值,此时函数类型符可以写为void。,我们可以改写一个函数定义:void Hello()printf(Hello,world n);这里,只把main改为Hello作为函数名,其余不变。Hello函数是一个无参函数,当被其它函数调用时,输出Hello world字符串。,有参函数定义的一般形式,定义有参函数的一般形式为:类型标识符函数名(形式参数表列)声明部分 语句部分,例如:(int,i

9、nt);/*函数体中的声明部分*?;();,有参函数比无参函数多了一个内容,即形式参数表列。在形参表中给出的参数称为形式参数,它们可以是各种类型的变量,各参数之间用逗号间隔。在进行函数调用时,主调函数将赋予这些形式参数实际的值。形参既然是变量,必须在形参表中给出形参的类型说明。,例如,定义一个函数,用于求两个数中的大数,可写为:int max(int a,int b)if(ab)return a;else return b;第一行说明max函数是一个整型函数,其返回的函数值是一个整数。形参为a,b,均为整型量。a,b的具体值是由主调函数在调用时传送过来的。在中的函数体内,除形参外没有使用其它变

10、量,因此只有语句而没有声明部分。在max函数体中的return语句是把a(或b)的值作为函数的值返回给主调函数。有返回值函数中至少应有一个return语句。,在程序中,一个函数的定义可以放在任意位置,既可放在主函数main之前,也可放在main之后。例如:可把max 函数置在main之后,也可以把它放在main之前。修改后的程序如下所示。,int max(int a,int b)if(ab)return a;else return b;main()int max(int a,int b);int x,y,z;printf(input two numbers:n);scanf(%d%d,空函数,

11、定义空函数的一般形式为:类型标识符函数名()例如:(),调用此函数时,什么工作也不做,没有任何实际作用。在主调函数中写上“();”表明“这里要调用一个函数”,而现在这个函数没有起作用,等以后扩充函数功能时补充上。,形式参数和实际参数,在前面提到的有参函数中,在定义函数时函数名后面括弧中的变量名称为“形式参数”(简称“形参”),在主调函数中调用一个函数时,函数名后面括弧中的参数(可以是一个表达式)称为“实际参数”(简称“实参”)。return后面的括弧中的值()作为函数带回的值(称函数返回值)。,#include void()int max(int,int);/*对函数的声明*/int,;sca

12、nf(,);(,);printf(,);,调用函数时的数据传递,int max(int,int)*定义有参函数max*int;?;return();,运行情况如下:,,通过函数调用,使两个函数中的数据发生联系,关于形参与实参的说明:,(1)在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。只有在发生函数调用时,函数中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。,(2)实参可以是常量、变量或表达式,如:(,);但要求它们有确定的值。在调用时将实参的值赋给形参。,(3)在被定义的函数中,必须指定形参的类型(上例程序中的“(,);”)。,(4)实参与形参的

13、类型应相同或赋值兼容。上例中实参和形参都是整型。如果实参为整型而形参x为实型,或者相反,则按第2章介绍的不同类型数值的赋值规则进行转换。,例如实参值a为3.5,而形参x为整型,则将实数3.5转换成整数3,然后送到形参b。字符型与整型可以互相通用。,(5)在语言中,实参向对形参的数据传递是“值传递”,单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。,在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。因此,在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数的实参的值。例如

14、,若在执行函数过程中和的值变为和,而和仍为和。,7.2.2函数的返回值,通常,希望通过函数调用使主调函数能得到一个确定的值,这就是函数的返回值。例如,前例中,(,)的值是,(,)的值是5。赋值语句将这个函数值赋给变量。,关于函数返回值的一些说明:,(1)函数的返回值是通过函数中的return语句获得的。,return语句将被调用函数中的一个确定值带回主调函数中去。,如果需要从被调用函数带回一个函数值供主调函数使用,被调用函数中必须包含return语句。如果不需要从被调用函数带回函数值可以不要return语句。,一个函数中可以有一个以上的return语句,执行到哪一个return语句,哪一个语句

15、起作用。return语句后面的括弧也可以不要,如:“return;”等价于“return();”,return后面的值可以是一个表达式。例如,前面例中的函数可以改写成:,(int,int)(?);,(2)函数的返回值应当属于某一个确定的类型,在定义函数时指定函数返回值的类型。,例如:下面是3个函数的首行:int max(float,float)/*函数值为整型*/char letter(char c1,char c2)/*函数值为字符型*/double min(int,int)/*函数值为双精度型*/,在语言中,凡不加类型说明的函数,自动按整型处理。前例中的函数首行的函数类型int可以省写,用

16、Turbo C 2.0编译程序时能通过,但用Turbo C 3.0编译程序时不能通过,因为C+要求所有函数都必须指定函数类型。因此,建议在定义时对所有函数都指定函数类型。,(3)在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致。,如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。对数值型数据,可以自动进行类型转换。即函数类型决定返回值的类型。,(4)对于不带回值的函数,应当用“void”定义函数为“无类型”(或称“空类型”)。这样,系统就保证不使函数带回任何值,即禁止在调用函数中使用被调用函数的返回值。此时在函数体中不得出现return语句。,返回值

17、类型与函数类型不同,#include void main()int(float,float);float,;int;scanf(,);(,);printf(,);int max(float,float)float;/*z为实型变量*/?;return();,运行情况如下:,Max is,7.3函数的调用,7.3.函数调用的一般形式,函数调用的一般形式为:函数名(实参表列),如果是调用无参函数,则“实参表列”可以没有,但括弧不能省略。,如果实参表列包含多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,类型应匹配。实参与形参按顺序对应,一一传递数据。,如果实参表列包括多个实参,对实参求值的顺

18、序并不是确定的,有的系统按自左至右顺序求实参的值,有的系统则按自右至左顺序。许多版本是按自右而左的顺序求值,例如Tubro+。,例:实参求值的顺序,#include void main()int f(int a,int b);/*函数声明*/int i=2,p;p=f(i,+i);/*函数调用*/printf(%dn,p);,int f(int a,int b)/*函数定义*/int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);,对于函数调用 int i=2,p;p=f(i,+i);,如果按自左至右顺序求实参的值,则函数调用相当于(,),如果

19、按自右至左顺序求实参的值,则函数调用相当于(3,),按函数在程序中出现的位置来分,可以有以下三种函数调用方式:,函数语句把函数调用作为一个语句。如例中的printstar(),这时不要求函数带回值,只要求函数完成一定的操作。,函数表达式函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如:*(,);,函数参数函数调用作为一个函数的实参。例如:m=max(a,max(b,c);其中max(b,c)是一次函数调用,它的值作为max另一次调用的实参。m的值是a、b、c三者中的最大者。又如:printf(%d,max(a,b);也是把max(a,b)作

20、为printf函数的一个参数。函数调用作为函数的参数,实质上也是函数表达式形式调用的一种,因为函数的参数本来就要求是表达式形式。,7.3.2 函数调用时语法要求,P79-80(1)(4),7.4对被调用函数的声明和函数原型,在一个函数中调用另一函数(即被调用函数)需要具备哪些条件呢?,(1)首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。但光有这一条件还不够。,(2)如果使用库函数,还应该在本文件开头用命令将调用有关库函数时所需用到的信息“包含”到本文件中来。,(3)如果使用用户自己定义的函数,而该函数的位置在调用它的函数(即主调函数)的后面(在同一个文件中),应该在主调

21、函数中对被调用的函数作声明。,函数原型的一般形式为(1)函数类型 函数名(参数类型1,参数类型2);(2)函数类型 函数名(参数类型1,参数名1,参数类型2,参数名2);,“声明”一词的原文是delaration,过去在许多书中把它译为“说明”。声明的作用是把函数名、函数参数的个数和参数类型等信息通知编译系统,以便在遇到函数调用时,编译系统能正确识别函数并检查调用是否合法。(例如函数名是否正确,实参与形参的类型和个数是否一致)。,注意:函数的“定义”和“声明”不是一回事。函数的定义是指对函数功能的确立,包括指定函数名,函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。而函数的

22、声明的作用则是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查。,#include void main()float add(float x,float y);*对被调用函数add的声明*float a,b,c;scanf(f,f,a,b);cadd(a,b);printf(sum is f n,c);float add(float,float)*函数首部*float;/*函数体*/z;return(z);,对被调用的函数作声明,如果 被调用函数的定义出现在主调函数之前,可以不必加以声明。因为编译系统已经先知道了已定义函数的有关情况,会根据函

23、数首部提供的信息对函数的调用作正确性检查。,#include float add(float,float)*函数首部*float;/*函数体*/z;return(z);void main()float a,b,c;scanf(f,f,a,b);cadd(a,b);printf(sum is f n,c);,改写上例,7.4.2函数说明的位置,当在所有函数的外部、被调用之前说明函数时,在对函数进行说明的语句后面所有位置上都可以对该函数进行调用。,函数说明也可以放在调用函数内的说明部分,如在main函数内部说明,则在main函数内部才能识别该函数。,7.5 调用函数和被调用函数之间的数据传递,大多数情况下,主调函数和被调用函数之间有数据传递的关系。,在不同的函数之间传递数据,可以使用的方法:参数:通过形式参数和实际参数返回值:用return语句返回计算结果全局变量:外部变量,例7.2 7.3,7.6 程序举例,例:7.4 7.5 7.6 7.8 7.9 7.10,课后习题,P87-90 习题,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号