C语言程序设计 教学课件 ppt 作者 邵军 全书 第6章

上传人:E**** 文档编号:89351096 上传时间:2019-05-23 格式:PPT 页数:143 大小:1.79MB
返回 下载 相关 举报
C语言程序设计 教学课件 ppt 作者 邵军 全书 第6章_第1页
第1页 / 共143页
C语言程序设计 教学课件 ppt 作者 邵军 全书 第6章_第2页
第2页 / 共143页
C语言程序设计 教学课件 ppt 作者 邵军 全书 第6章_第3页
第3页 / 共143页
C语言程序设计 教学课件 ppt 作者 邵军 全书 第6章_第4页
第4页 / 共143页
C语言程序设计 教学课件 ppt 作者 邵军 全书 第6章_第5页
第5页 / 共143页
点击查看更多>>
资源描述

《C语言程序设计 教学课件 ppt 作者 邵军 全书 第6章》由会员分享,可在线阅读,更多相关《C语言程序设计 教学课件 ppt 作者 邵军 全书 第6章(143页珍藏版)》请在金锄头文库上搜索。

1、,第6章 函 数,6.1 函数的基本语法知识 6.2 函数调用 6.3 函数的嵌套调用与递归调用 6.4 函数分解 6.5 变量的存储类别与作用域 6.6 程序结构 6.7 库函数 本章小结,6.1函数的基本语法知识 在前面已经介绍过,C源程序是由函数组成的。C语言不仅提供了极为丰富的库函数(如Turbo C、MS C都提供了三百多个库函数),还允许用户定义自己的函数。用户可以把自己的算法编写成一个个相对独立的函数模块,然后用调用的方法来使用函数。可以说,C程序的全部工作都是由各式各样的函数完成的,所以也把C语言称为函数式语言。 C语言中函数的基本语法知识包括函数定义的一般形式、return语

2、句、函数调用及函数声明。,6.1.1 函数定义 虽然“函数”这个术语来自数学,但C语言中函数的概念不完全等同于数学中函数的概念。在数学领域,函数是一种关系,这种关系使一个集合里的每一个元素对应到另一个(可能相同的)集合里的唯一元素;在C语言中,函数是指能够完成特定功能的一段代码,它不一定要有参数,也不一定要有计算结果。,函数定义的一般形式为 类型说明符函数名 (形式参数表) 声明部分 语句部分 ,其中: (1) 类型说明符定义了该函数的类型,即函数执行完后其返回值的类型。它遵循以下规则:可以为除数组外的任意类型,包括基本数据类型(整型、字符型等)、组合类型(结构)和指针类型。此外,类型说明符还

3、可以为void(空)类型,表示该函数无返回值,称为无返回值函数。类型说明符也可以省略不写,缺省时默认的函数类型为整型。 (2) 函数名是一个用户自定义的标识符,其命名规则同变量名完全一样。函数名中存放的是函数的入口地址值。,(3) 形式参数简称形参,是函数接收外部数据的接口。当实际执行到该函数时,各个形参已经对应了实际数值,无需在函数体内部再对其赋值。在形参表中必须逐个说明各参数的类型,说明方式为 (类型1形参1,类型2形参2,类型n形参n) 即使几个形参具有相同的数据类型,也必须对每个形参分别进行类型说明。当没有形参时,称为无参函数,此时形参表虽然为空,但左右圆括号不能省去。,(4) 由“”

4、、“”括起来的部分称为函数体,它由声明部分和语句部分组成。声明部分主要包括在函数内部用到的变量或函数的声明语句;语句部分由若干条语句组成。对于返回类型为void的函数,其函数体可以为空。 【例6.1】 各类函数举例如表6-1所示。,通常我们将函数定义中除去函数体的其余部分称为函数头。这样,一个函数定义就包括了函数头和函数体两部分。函数头主要对函数的名字、输入量及输出量的类型进行定义,是函数与外界(程序其余部分)的接口。函数体主要用来实现本函数的功能,在函数体内部看来形参是已知量,对于有返回值的函数,其最终的计算结果必须用return语句(参见6.1.3节)带回。,在函数定义时函数头的设计尤为重

5、要。函数名最好用能反映函数功能的英文单词;函数的类型就是函数返回值(输出量)的类型;函数的形参列表包括了完成本函数功能必须已知的数据(输入量)的名字及类型。在定义函数时,定义者必须从具体问题中分析得到以上三类信息。另外,设计函数体时,首先要记住在函数体内部形参是已知量,其次,要注意返回值的类型最好与函数的类型保持一致。,【例6.2】 编写函数求n!,n0。 分析: 首先确定函数的类型,即n! 最终的计算结果应该为什么类型。显然,int型的长度不够,这里我们选择long型,根据需要也可以选择double型。然后确定形参类型及个数,完成本函数我们只需已知n即可,因此,形参为int型变量n。最后确定

6、函数名为fac。 程序如下: longfac(int n) int i; long a=1; for(i=2;i=n;i+) a*=i; return(a); ,【例6.3】 编写函数,打印边长为n的空心正方形。 程序如下: void prn(int n) int i,j; for(i=0;in;i+) for(j=0;jn;j+) if(i=0|i=n-1) printf(“*”); else if(j=0|j=n-1) printf(“*”); else printf(“ ”); printf(“n”); ,6.1.2 函数调用 一个程序的执行总是从main函数开始的,在main函数内部逐

7、条语句顺序执行,直至main函数结束,则整个程序的执行也结束。那什么时候程序才能执行到定义在主函数外部的其他函数呢?这就要求我们在主函数内部书写函数调用了。 习惯上我们将包含函数调用的函数称为主调函数,而将被调用的函数称为被调函数。 函数调用的一般形式为 函数名 (实际参数表),其中: (1) 函数名为已经定义了的被调函数的函数名。 (2) 实际参数简称实参,是主调函数传递给被调函数的数据。函数调用中的实参表与函数定义中的形参表必须在类型、顺序及个数上一一对应。实参可为常量、变量或表达式,发生调用时实参必须已经有确定的值。 函数调用语句应该出现在主调函数中的什么位置呢?根据函数有无返回值,可将

8、函数调用语句在主调函数中的使用情况分为以下两种:,(1) void函数的调用不返回任何值,其作用与执行一段代码无异,因此void函数的调用独立成语句,在函数调用后紧跟分号。 【例6.4】 对例6.1中的无返回值函数example2调用的代码段为 main( ) /*void函数的调用独立成语句*/ example2(5); ,(2) 非void函数调用会产生一个返回值,该值可以存储在变量中,还可以进行测试、显示或者用于其他用途。因此非void函数的调用与同类型(函数类型)常量的使用无异,它可以出现在同类型常量能够出现的所有位置,如表达式、输出表、实参表中等。如果不需要非void函数返回的值,也

9、可以将其丢弃。,【例6.5】 对例6.1中的带参函数example调用的代码段为 main( ) /*非void函数的调用可以出现在同类型常量能够出现的所有位置*/ printf(“n%dn“,example(5); 另外,在C语言中函数之间允许相互调用,也允许嵌套调用。函数还可以自己调用自己,称为递归调用。,6.1.3 函数返回 函数完成指定的功能后就应返回到主调函数中函数调用的下一条语句处执行,并不一定要执行完函数体中的所有语句才返回。怎样使程序在适当的时候返回到调用处继续执行呢?这就要用return语句来实现了。该语句的功能是计算表达式的值,并返回给主调函数。 return语句有下列三种

10、书写形式(第一种用于void型函数,后两种用于非void型函数): return; return(表达式); return表达式;,【例6.6】 返回值与函数类型不一致时的自动转换。 程序如下: /*求两个数中的最大数*/ int max(float x,float y) float z; z=xy?x:y; return(z);/*float类型自动转换为int类型*/ 当x=1.5,y=2.6时,虽然z的值计算后为2.6,但最终函数调用的结果会自动转换为2。 在函数定义中允许有多个return语句,但每次调用只能有一个return 语句被执行,因此只能返回一个函数值。,【例6.7】 函数定

11、义中包含多条return语句。 程序如下: /*判断奇偶数*/ int fun(int x) if(x%2= =0) return (1); /*x为偶数,返回1*/ else return (0); /*x为奇数,返回0*/ 在函数定义中也可以不包含任何返回语句。函数执行完最后一条语句会自动返回到调用处。对非void函数,返回一个与其类型相同的随机数,对void函数则不返回值。,【例6.8】 非void函数的函数定义中不包含return语句,返回同类型随机数。 程序如下: int fun(int x) /*函数体中不包含返回语句*/ if(x%2= =0) x=1; else x=0; ma

12、in( ) printf(“n%d“,fun(5); 程序运行的结果并不是我们期望中的0,而是一个随机数。,6.1.4 函数声明 函数的定义和函数的调用可能分别出现在不同的源程序文件中,即使在同一源程序文件,也可能是调用语句在先,而函数定义在后。在这种情况下,执行到函数调用时,编译器没有任何关于被调函数的信息:编译器不知道被调函数有多少形参以及形参的类型是什么,也不知道被调函数的返回值是什么类型。这使得编译器只能默认函数的类型为整型,也无法检查传递给被调函数的实参个数及类型,只能进行默认的实参提升(参见6.2.3节)并期待最好的情况发生。,为了避免定义前调用的问题,一种方法是使每个函数的定义都

13、出现在其调用之前,另一种方法是在调用前声明每个函数。函数声明使得编译器可以先对函数进行概要浏览,而函数的完整定义以后再给出。 函数声明的一般形式为 类型说明符函数名 ( 类型 形参,类型 形参, ); 也可省略形参变量名而简写为 类型说明符 被调函数名(类型,类型,);,注意:函数声明一般独立成语句,分号不可省。在C语言中也允许其与同类型的变量或函数一起声明,此时的写法如下: 类型说明符 变量名,函数名1(类型,类型,),变量名,函数名2(类型,); 例如: longa,reverse(long),max(long,long),b;,C语言中规定在以下几种情况下可以省去函数声明: (1) 如果

14、被调函数的返回值是整型或字符型,则可以不对被调函数作说明,而直接调用。这时系统将自动对被调函数返回值按整型处理。 (2) 当被调函数的函数定义出现在主调函数之前,在主调函数中也可以不对被调函数再作说明而直接调用。 (3) 如在所有函数定义之前,在函数外预先说明了各个函数的类型,则在以后的各主调函数中,可不再对被调函数作说明。,当程序中包含大量函数声明时,建议使用第三种方法。具体做法是将函数的说明和一些公用类型(如结构类型)的说明集中起来并单独放在一个头文件(.h文件)中,当需要在某个源程序文件中调用这些函数时,只需在该文件的首部用一条预处理命令#include包含该头文件即可。这种方法对函数的

15、调用者来说非常方便,而且还可以减少编译量。,注意 定义和声明是两个完全不同的概念。定义是指建立被定义的对象,而声明只是说明某个对象的存在,被声明的对象必须在其他地方定义,否则这个声明就是无效的、无意义的。两者最明显的区别就在于定义时系统会为对象分配存储空间,而声明时则不分配空间。,6.2 函 数 调 用 6.2.1函数的存储 函数是C程序的一部分,根据冯诺依曼存储程序的思想,一个程序在执行时会整个或部分被装入内存的代码段,当然函数也在其中,如图6-1(a)所示。对整个程序进行编译后,产生一张标识符与其内存地址的对应表,其中包括各函数名与其入口地址的对应记录,如图6-1(b)所示。这为之后的函数调用提供了基础。,图6-1 程序被装入内存的代码段,6.2.2函数调用的执行过程 函数调用的过程从宏观上可以用图6-2表示,在主调函数顺序执行的过程中遇到函数调用时,转去被调函数的入口地址处顺序往下执行,当执行到被调函数的最后一条语句或遇到返回语句时,返回主调函数中产生本次函数调用的地方继续顺序向下执行。 这个过程看似简单,但事实上系统在背后完成了很多用户看不到的工作。为了保证在函数调用结束后能精确返回到函数调用的下一条语句处继续执行,每次函数调用时系统都要进行保护“现场”的动作,而函数返回时又要恢复“现场”,并且必须保证这两个“现场”的一致性。为了完成上述工作,系统需

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

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

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