程序设计(清华第二版)公开课第8章 函数课件

上传人:bin****86 文档编号:56103748 上传时间:2018-10-09 格式:PPT 页数:91 大小:611KB
返回 下载 相关 举报
程序设计(清华第二版)公开课第8章 函数课件_第1页
第1页 / 共91页
程序设计(清华第二版)公开课第8章 函数课件_第2页
第2页 / 共91页
程序设计(清华第二版)公开课第8章 函数课件_第3页
第3页 / 共91页
程序设计(清华第二版)公开课第8章 函数课件_第4页
第4页 / 共91页
程序设计(清华第二版)公开课第8章 函数课件_第5页
第5页 / 共91页
点击查看更多>>
资源描述

《程序设计(清华第二版)公开课第8章 函数课件》由会员分享,可在线阅读,更多相关《程序设计(清华第二版)公开课第8章 函数课件(91页珍藏版)》请在金锄头文库上搜索。

1、8.1 概述 8.2 函数定义的一般形式 8.3 函数参数和函数的值 8.4 函数的调用 8.5 函数的嵌套调用 8.6 函数的递归调用 8.7 数组作为函数参数 8.8 局部变量和全局变量 8.9 变量的存储类别 8.10 内部函数和外部函数 8.11 如何运行一个多文件的程序 习题,第8章 函 数,8.1 概述,一个较大的程序一般应分为若干个程序模块,每一个模块用来实现一个特定的功能。所有的高级语言中都有子程序这个概念,用子程序实现模块的功能。在语言中,子程序的作用是由函数完成的。一个程序可由一个主函数和若干个函数构成。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多

2、个函数调用任意多次。图8.1是一个程序中函数调用的示意图。,在程序设计中,常将一些常用的功能模块编写成函数,放在函数库中供公共选用。要善于利用函数,以减少重复编写程序段的工作量。先举一个简单的函数调用的例子。例8.1main() printstar();* 调用printstar函数 *print-message();* 调用print message */printstar(); * 调用printstar函数 * printstar() *printstar函数*,printf(* * * * * * * * * * * * * * * * * *n); print-message() *

3、 print-message函数* printf(“How do you do!n“);运行情况如下: * * * * * * * * * * * * * * * * * * How do you do! * * * * * * * * * * * * * * * * * *,图8.1,printstar和print-message都是用户定义的函数名,分别用来输出一排“*”号和一行信息。 说明: (1) 一个源程序文件由一个或多个函数组成。一个源程序文件是一个编译单位,即以源程序为单位进行编译,而不是以函数为单位进行编译。 (2) 一个程序由一个或多个源程序文件组成。对较大的程序,一般不希望

4、全放在一个文件中,而将函数和其他内容(如预定义)分别放在若干个源文件中,再由若干源文件组成一个C程序。这样可以分别编写、分别编译,提高调度效率。一个源文件可以为多个C程序公用。,(3) 程序的执行从main函数开始,调用其他函数后流程回到main函数,在main函数中结束整个程序的运行。main函数是系统定义的。 (4) 所有函数都是平行的,即在定义函数时是互相独立的,一个函数并不从属于另一函数,即函数不能嵌套定义(这是和PASCAL不同的),函数间可以互相调用,但不能调用main函数。 (5) 从用户使用的角度看,函数有两种: 标准函数,即库函数。这是由系统提供的,用户不必自己定义这些函数,

5、可以直接使用它们。应该说明,不同的C系统提供的库函数的数量和功能不同,当然有一些基本的函数是共同的。, 用户自己定义的函数。用以解决用户的专门需要。 (6) 从函数的形式看,函数分两类: 无参函数。如例8.1中的printstar和print-message就是无参函数。在调用无参函数时,主调函数并不将数据传送给被调用函数,一般用来执行指定的一组操作(例如,例8.1那样),printstar函数的作用是输出18个星号。无参函数可以带回或不带回函数值,但一般以不带回函数值的居多。 有参函数。在调用函数时,在主调函数和被调用函数之间有数据传递。也就是说,主调函数可以将数据传给被调用函数使用,被调用

6、函数中的数据也可以带回来供主调函数使用。,类型标识符 函数名() 声明部分语句 例8.1中的printstar和print-message函数都是无参函数。用“类型标识符”指定函数值的类型,即函数带回来的值的类型。无参函数一般不需要带回函数值,因此可以不写类型标识符,例8.1就如此。,8.2 函数定义的一般形式 1. 无参函数的定义形式,类型标识符函数名(形式参数表列)声明部分语句 例如: int max(int x,int y)int ;*函数体中的声明部分xy?xy;return(); ,2. 有参函数定义的一般形式,这是一个求x和y二者中大者的函数,笫1行第一个关键字int表示函数值是整

7、型的。max为函数名。括号中有两个形式参数x和y,它们都是整型的。在调用此函数时,主调函数把实际参数的值传递给被调用函数中的形式参数x和y。花括弧内是函数体,它包括声明部分和语句部分。在声明部分定义所用的变量,此外对将要调用的函数作声明(见8.4.3节)。在函数体的语句中求出的值(为x与y中大者),return(z)的作用是将的值作为函数值带回到主调函数中。return后面的括弧中的值(z)作为函数带回的值(或称函数返回值)。在函数定义时已指定max函数为整型,在函数体中定义为整型,二者是一致的,将作为函数max的值带回调用函数(见例8.2)。,如果在定义函数时不指定函数类型,系统会隐含指定函

8、数类型为int型。因此上面定义的max函数左端的int可以省写。3. 可以有“空函数” 它的形式为 类型说明符函数名( ) 例如: dummy() 调用此函数时,什么工作也不做,没有任何实际作用。在主调函数中写上“dummy();” 表明 “这里,要调用一个函数”, 而现在这个函数没有起作用, 等以后扩充函数功能时补充上。 在程序设计中往往根据需要确定若干模块, 分别由一些函数来实现。 而在第一阶段只设计最基本的模块, 其他一些次要功能或锦上添花的功能则在以后需要时陆续补上。在编写程序的开始阶段,可以在将来准备扩充功能的地方写上一个空函数(函数名取将来采用的实际函数名(如用merge()、ma

9、tproduct()、oncatenate()、shell()等,分别代表合并、矩阵相乘、字符串连接、希尔法排序等),只是这些函数未编好,先占一个位置,以后用一个编好的函数代替它。这样做,程序的结构清楚,,可读性好,以后扩充新功能方便,对程序结构影响不大。空函数在程序设计中常常是有用的。4. 对形参的声明的传统方式 在老版本C语言中,对形参类型的声明是放在函数定义的笫2行,也就是不在笫1行的括号内指定形参的类型,而在括号外单独指定,例如上面定义的max函数可以写成以下形式: int max(x,y) /* 指定形参x,y */int x,y; /* 对形参指定类型 */ int z;,z =

10、x y ? x: y;return(z); 一般把这种方法称为传统的对形参的声明方式,而把前面介绍过的方法称为现代的方式。Turbo C和目前使用的多数C版本对这两种方法都允许使用,两种用法等价,NSI新标准推荐前一种方法,即现代方式。它与PASCAL语言中所用的方法是类似的。本书中的程序采用新标准推荐的现代方式。但由于有些过去写的书籍和程序使用传统方式,因此读者应对它有所了解,以便能方便地阅读它们。,8.3.1 形式参数和实际参数 在调用函数时,大多数情况下,主调函数和被调用函数之间有数据传递关系。这就是前面提到的有参函数。前面已提到:在定义函数时函数名后面括弧中的变量名称为“形式参数”(简

11、称“形参”),在主调函数中调用一个函数时,函数名后面括弧中的参数(可以是一个表达式)称为“实际参数”(简称“实参”)。 例8.2调用函数时的数据传递。 main()int a,b,c;,8.3 函数参数和函数的值,scanf(d,d,a,b);cmax(a,b);printf(ax isd,c);max(int x,int y)定义有参函数maxint ;xy?xy;return();,运行情况如下: 7,8 ax is 8 程序中第712行是一个函数定义(注意第7行的末尾没有分号)。第7行定义了一个函数名max和指定两个形参x、y及其类型。程序第4行是一个调用函数语句,max后面括弧内的a、

12、b是实参。a和b是main函数中定义的变量,x和y是函数max中的形式参数。通过函数调用,使两个函数中的数据发生联系。见图8.2。,图8.2 关于形参与实参的说明: (1) 在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。只有在发生函数调用时,函数max中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。,(2) 实参可以是常量、变量或表达式,如: max(3,ab); 但要求它们有确定的值。在调用时将实参的值赋给形参(如果形参是数组名,则传递的是数组首地址而不是数组的值。请参阅8.7节)。 (3) 在被定义的函数中,必须指定形参的类型(见例8.2程序第

13、7行)。 (4) 实参与形参的类型应相同或赋值兼容。例8.2中实参和形参都是整型,这是合法的、正确的。如果实参为整型而形参x为实型,或者相反,则按第2章介绍的不同类型数值的赋值规则进行转换。例如实参值a为3.5,而形参x为整型,则将实数3.5转换成,整数3,然后送到形参b。但此时应将max函数放在main函数的前面或在main函数中对被调用函数max作原型声明,否则会出错。关于对函数的声明见8.4.3小节。字符型与整型可以互相通用。 (5) 语言规定,实参变量对形参变量的数据传递都是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参,这是和TN不同的。在内存中,实参单元与形参单

14、元是不同的单元。如图8.3所示。,图8.3 图8.4 在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。因此,在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数的实参的值。例如,若在执行函数过程中x和y的值变为10和15,而a和b仍为2和3,见图8.4。,8.3.2 函数的返回值 通常,希望通过函数调用使主调函数能得到一个确定的值,这就是函数的返回值。例如,例8.2中,max(2,3)的值是3,max(5,2)的值是5。赋值语句将这个函数值赋给变量c。下面对函数值作一些说明: (1) 函数的返回值是通过函数中的re

15、turn语句获得的。return语句将被调用函数中的一个确定值带回主调函数中去。见图8.2中从return语句返回的箭头。如果需要从被调用函数带回一个函数值(供主调函数使用),被调用函数中必须包含return语句。如果不需要从被调用函数带回函数值可以不要return语句。,一个函数中可以有一个以上的return语句,执行到哪一个return语句,哪一个语句起作用。 return语句后面的括弧也可以不要,如return ;它与“return();”等价。 return后面的值可以是一个表达式。例如,例8.2中的函数max可以改写如下:max(int x,int y)return(xy?xy);

16、这样的函数体更为简短,只用一个return语句就把求值和返回都解决了。,(2) 函数值的类型。既然函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型。例如: int max(float x,float y)/* 函数值为整型 */ char letter(char c1,char c2) /* 函数值为字符型 */ double min(int x,int y) /* 函数值为双精度型 */ 读者会问:例8.2中的函数定义并没有说明其类型,为什么?语言规定,凡不加类型说明的函数,一律自动按整型处理。例8.2中的max函数返回值为整型,因此可不必说明。,在定义函数时对函数值说明的类型一般应该和return语句中的表达式类型一致。例如,例8.2中用隐含方式指定max函数值为整型,而变量也被指定为整型,通过return语句把的值作为max的函数值,由max带回主调函数。的类型与max函数的类型是一致的,是正确的。 (3) 如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。对数值型数据,可以自动进行类型转换。即函数类型决定返回值的类型。 例8.3返回值类型与函数类型不同。将例8.2稍作改动(注意是变量的类型改动)。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > 其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号