C语言程序设计(第二版)-电子教案-王伟 第6章

上传人:E**** 文档编号:89382639 上传时间:2019-05-24 格式:PPT 页数:66 大小:417KB
返回 下载 相关 举报
C语言程序设计(第二版)-电子教案-王伟 第6章_第1页
第1页 / 共66页
C语言程序设计(第二版)-电子教案-王伟 第6章_第2页
第2页 / 共66页
C语言程序设计(第二版)-电子教案-王伟 第6章_第3页
第3页 / 共66页
C语言程序设计(第二版)-电子教案-王伟 第6章_第4页
第4页 / 共66页
C语言程序设计(第二版)-电子教案-王伟 第6章_第5页
第5页 / 共66页
点击查看更多>>
资源描述

《C语言程序设计(第二版)-电子教案-王伟 第6章》由会员分享,可在线阅读,更多相关《C语言程序设计(第二版)-电子教案-王伟 第6章(66页珍藏版)》请在金锄头文库上搜索。

1、第六章 函 数,前面介绍过,源程序是由函数组成的。 本书大部分程序都只有一个主函数main()构成,而实用程序往往由多个函数组成。源程序的基本模块是函数, 通过对函数模块的调用实现某种功能。语言提供极为丰富的库函数(如Turbo C提供了三百多个库函数),也允许用户建立自己定义的函数。用户可把自己的算法编成相对独立的函数模块,通过调用来使用函数。 程序的全部工作是由各种功能的函数完成的,语言称为函数式语言。采用函数模块式的结构,语言实现了结构化程序设计,使程序的层次结构清晰,方便程序的编写、阅读、调试。,本章目录,6.1函数分类,6.2函数,6.3 函数调用,6.4函数和数组,6.5变量的作用

2、域,6.6变量的存储类别,6.7内部函数和外部函数,6.1函数分类,语言中可从不同的角度对函数分类。 1. 从函数定义的角度,函数分为库函数和用户定义函数。 (1)库函数 由系统提供,用户无须定义, 不必在程序中作类型说 明,需在程序前包含有该函数原型的头文件即可在程序中直接 调 用。如printf()、scanf()、getchar()、putchar ()等函数 均属库函数。 (2)用户定义函数 由用户按需要写的函数。用户自定义的函数在主调函数中对其 进行类型说明。,6.1函数分类,2. 语言的函数是否有返回值把函数分为有返 回值函数和无返回值两种。 (1)有返回值函数 此类函数被调用后向

3、调用者返回执行结果,称为函数返回值。如 数学函数即属于此类函数。 用户定义的函数有返回函数值,函 数的返回值是通过函数中return语句来获得的。 (2)无返回值函数 此类函数可完成某项特定的处理任务, 执行后不向调用者返回 值。用户自定义此类函数时可指定它的返回类型为“空类型”, 空类型的说明符为“void”。,6.1函数分类,3. 从主调函数和被调函数之间数据传送的角度看可分 为无参函数和有参函数两种。 (1)无参函数 函数定义、函数说明及函数调用中都不带参数。 主调函数和 被调函数之间不进行参数传送。此类函数通常用来完成指定的 功能。 (2)有参函数 在函数定义及函数说明时都有参数,称为

4、形式参数(简称为形 参)。在函数调用时也必须给出参数, 称为实际参数(简称为 实参)。 进行函数调用时,主调函数将把实参的值传送给形 参,供被调函数使用。,6.1函数分类,在语言中,所有的函数定义,包括主函数main在内,都是平行的。换言之,在一个函数的函数体内, 不能再定义另一个函数, 即不能嵌套定义。函数之间允许相互调用,也允许嵌套调用。习惯上,调用者称为主调函数。 函数可自己调用自己,称为递归调用。main 函数是主函数,它可调用其它函数,不允许被其它函数调用。 程序总是从main函数开始, 完成对其它函数的调用后再返回到main函数,最后由main函数结束整个程序。一个源程序只能有一个

5、main函数。,6.2函数,6.2.1函数的定义 函数定义一般形式 1.无参函数的一般形式 类型说明符 函数名() 类型说明 语句 类型说明符指函数返回值的类型。函数名是用户定义的标识符,函 数名后有一个空括号,其中无参数,但括号不可少。 中的内容 称为函数体。在函数体中也有类型说明, 是对函数体内部所用到 的变量的类型说明。多数情况,不要求无参函数有返回值, 此时 函数类型符可以写为void。,6.2函数,例6.1 main() hello(); void hello() printf (“Hello,world n“); 运行结果:,6.2函数,2.有参函数的一般形式 类型说明符 函数名(

6、形参表) 型式参数类型说明 类型说明 语句 有参函数比无参函数多了两个内容,分别是形参表和形参的类型说明。可以是各种类型的变量,但必须与实参类型相匹配。 各参数之间用逗号间隔。函数调用时,主调函数中实际参数的值应该是确定的值。,6.2函数,例6.2比较两个小朋友的个子,输出个子较高的。 float max(float a,float b) if(ab)return a; else return b; void main() float x,y,z; printf(“input two numbers:n“); scanf(“%f,%f“, ,6.2函数,运行结果:,main函数是主调函数,ma

7、x是被调函数。其中x,y是实参,在数据传递过程中x,y必须是确定的值。a,b是形参,用之前形参的数据类型与实参相匹配。最后通过return语句返回a,b中较大值。,6.2函数,6.2.2 函数的声明 在本章例6.2中,如果被调函数的定义在main函数的后面,那么在主函数main中需要对被调函数的进行声明。这种方式和变量相同,先定义后使用。主要目的是使编译系统知道被调函数返回值类型,以便在主调函数中对此类型的函数值作相应的处理。 函数声明的一般形式为: 类型标识符 函数名(参数类型 参数,参数类型 参数) 也可以写成 类型标识符 函数名(参数类型,参数类型) 括号内给出的是形参的类型和形参名,或

8、者只给出参数类型。便于编译系统进行检查,防止可能出现的错误 改例6.2如下:,6.2函数,main() float max(float a,float b); float x,y,z; printf(“input two numbers:n“); scanf(“%f,%f“, ,6.2函数,语言中又规定在以下几种情况时可以省去主调函数中对被调函数的函数说明。 1 .如果被调函数的返回值是整型或字符型时, 可以不对被调函数作说明,而直接调用。这时系统将自动对被调函数返回值按整型处理。 2. 当被调函数的函数定义出现在主调函数之前时, 在主调函数中也可以不对被调函数再作说明而直接调用。例6.2中,

9、函数max的定义放在main 函数之前,因此可在main函数中省去对 max函数的函数说明。 3. 如在所有函数定义之前, 在函数外预先说明了各个函数的类型,则在以后的各主调函数中,可不再对被调函数作说明。例如: char str(int a); float f(float b); main() ,6.2函数, char str(int a) float f(float b) 其中第一,第二行对str函数和f函数预先作了说明。 因此在以后各函数中无须对str和f函数再作说明就可直接调用。 4. 对库函数的调用不需要再作说明, 但必须把该函数的头文件用include命令包含在源文件前部。,6.2

10、函数,6.2.3函数的参数 函数的参数分为形参和实参两种。 在本小节中,进一步介绍形参、实参的特点和两者的关系。形参出现在函数定义中,在整个函数体内都可使用,离开该函数不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。实参和形参之间的数据传递是单项值传递,相当于实参的值复制到形参中,并且形参的任何变化不影响实参。 函数的形参和实参具有以下特点: 1.形参变量只有在被调用时才分配内存单元,在调用结束时, 便释放所分配的内存单元。因此形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。 2.实参可以是常量、变量、表达式、函数等。在进行函数调用时,实参必须具有

11、确定的值,以便把这些值传送给形参。 3.实参和形参在数量上,类型上,顺序上应一致, 否则会发生“类型不匹配”的错误。,6.2函数,4.函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。 例6.3 编写程序,求1+2+3+100的和 main() int n; printf(“input numbern“); scanf(“%d“, int s(int n) ,6.2函数,int i; for(i=n-1;i=1;i-) n=n+i; printf(“n=%dn“,n); 运行结果:,

12、6.2函数,本程序中定义了一个函数s,该函数的功能是求1+2+3+100的值。在主函数中输入n值,并作为实参,在调用时传送给s 函数的形参量n( 注意,本例的形参变量和实参变量的名字都为n,但这是两个不同的量,各自的作用域不同)。在主函数中用printf 函数输出一次n值,这个n值是实参n的值。在函数s中也用printf 函数输出了一次n值,这个n值是形参最后取得的n值5050。从运行情况看,输入n值为100。即实参n的值为100。把此值传给函数s时,形参 n 的初值也为100,在执行函数过程中,形参n的值变为5050。 返回主函数之后,输出实参n的值仍为100。可见实参的值不随形参的变化而变

13、化。,6.2函数,6.2.4函数的值 函数的值是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。对函数的值(或称函数返回值)有以下一些说明: 1.函数的值只能通过return语句返回主调函数。 return 语句的一般形式为: return 表达式; 或者为: return (表达式); 该语句的功能是表达式的值返回给主调函数。在函数中允许有多 个return语句,但每次调用只能有一个return 语句被执行,因 此只能返回一个函数值。,6.2函数,2.函数值的类型和函数定义中函数的类型应保 持一致。 如果两者 不一致,则以函数类型 为准,自动进行类型转换。 3.如函数值为

14、整型,在函数定义时可以省去类型说明。 4.不返回函数值的函数,可以明确定义为“空类型”, 类型说明 符为“void”。 一旦函数被定义为空类型后, 就不能在主调函数中使用被调函数的 函数值了。为了使程序有良好的可读性并减少出错,凡不要求返 回值的函数都应定义为空类型。,6.3 函数调用,函数调用的一般形式前面已说过,在程序中是通过对函数的调用来执行函数体。函数调用的一般形式为: 函数名(实际参数表) 对无参函数调用时,无实参表。对有参函数调用时,实参表中的参数可以是常数,变量或构造类型数据及表达式。 各实参之间用逗号分隔。,6.3 函数调用,6.3.1 函数的调用方式 在语言中,用以下几种方式

15、调用函数: 1.函数表达式 函数作表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。如例6.2中: z=max(x,y)是一个赋值表达式,把max的返回值赋予变量z。 2.函数语句 函数调用的一般形式加上分号即构成函数语句。如例6.2中:printf(“max=%fn“,z);是以函数语句的方式调用函数。 3.函数实参 函数作为另一个函数调用的实参出现。这种情况是把该函数的返回值作为实参进行传递,要求该函数必须是有返回值的。例如: printf(“%d“,max(x,y); 把max调用的返回值作为printf函数的实参使用。函数调用也应注意求值顺序。

16、求值顺序指对实参表中各量是自左至右使用,还是自右至左使用。 对此, 各系统的规定不一定相同。,6.3 函数调用,例6.3 运行程序 main() int i=8; printf(“%dn%dn%dn%dn“,+i,-i,i+,i-); 按照从右至左的顺序求值(Turbo c)。 运行结果为:,Turbo C规定是自右至左求值,所以结果为8,7,7,8。如还不理解,上机一试就明白。,6.3 函数调用,6.3.2函数的嵌套调用 函数的嵌套调用是指在执行被调函数时,被调函数又调用了其他函数。C语言规定任何函数都可以调用其他函数。除了main函数以外的函数都可以作为其他函数的被调函数。 函数不能嵌套定义,但是可以嵌套调用。 例6.4 学校统计某专业两个班的人数,学校把任务交给了辅导员,辅导员把任务给了班长 ma

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

当前位置:首页 > 高等教育 > 大学课件

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