第11章函数与文件-Read.ppt

  1. 1、本文档共26页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第11章函数与文件-Read.ppt

第11章 函数与文件 在本章的学习中,要重点掌握以下内容: 理解文件和函数的关系; 头文件和源文件的关系; 如何组织多文件工程,并学会在至少一种环境下开发多文件工程; 递归函数的使用; 内部函数和外部函数的使用。 11.1 多文件的程序 使用文件来组织程序可以提高程序的结构性,使各个功能的模块更为清晰。本章将先讨论源文件和头文件的关系,再介绍一个完整的C工程是如何组织的,最后通过一个实例来演示多文件的C工程的使用。 11.1.1 源文件和头文件 C文件可以分为.c文件和.h文件两类,其中.c文件是后缀名为“.c”的文件,也称为源文件。.h文件是后缀名为“.h”的文件,也称为头文件。一个程序经常含有多个源文件,编译时每一个源文件都会作为单独的编译单元,生成对象文件。通常情况下,每一个源文件都会有对应的头文件,作为源文件之间的接口。 11.1.1 源文件和头文件 头文件原则上只存放可能被外部使用的内容,一般包含以下部分。 类型声明,例如: typedef int int32_t; 函数声明,例如: void hello_world(void); 常量定义,包括具名常量和const常量,例如: #define ARRAY_SIZE 50 const int MAX 256 11.1.2 C工程的组织结构 当程序规模继续扩大,程序任务十分浩大的时候,函数会变得很多,只使用多函数的方式也不足以保证程序的结构清晰。这时就需要使用多个源文件,把相关性强的函数归类,每一类作为一个集合放在一个单独的源文件中。同时还应适当地使用头文件,将其作为源文件的接口描述,以提高程序的可维护行和结构组织的合理性。当程序规模继续扩大时,会导致出现有很多的文件,那么把太多的文件放在一个目录下也会略显混乱,这时就需要将文件归类,分别放到不同的文件夹下。 11.1.2 C工程的组织结构 当程序规模较大时,一般会称程序为“工程”。在本书的论述中,工程也就是一个完整的C程序,可以只有一个C文件,也可以有成百上千个C文件。如下图就是C工程的组织结构图。 11.1.3 一个简单的多文件工程 本节将展示一个简单的多文件工程:该工程包含6个文件,其中3个为头文件,3个为源文件,如范例11-1所示。在11.1.4节中将围绕本工程详细介绍如何在各种开发环境中开发多文件工程。 11.2 创建和运行多文件工程 在11.1节中已经介绍了含多个文件的C工程,由其可看出,该工程中文件繁多,如果使用第2章中介绍的方法来创建和运行这个工程是行不通的。本节将以范例11-1为例,来演示如何在两种不同的编译环境中创建和运行多文件工程。 11.3 函数的调用 前面的内容中已经讨论了在main函数中调用函数的方法,此外也可以在函数中调用函数。本节将讨论如何在其他函数中调用函数,包括嵌套调用和递归调用。同时,将通过几个范例来演示递归调用的使用。最后,将分析递归调用的利弊,并讨论如何实现递归与循环的转化。 11.3.1 嵌套调用 由于C语言规定函数不能定义在函数体内,即不能嵌套定义。但是可以通过在函数中调用函数来实现函数的嵌套,即嵌套调用。实际上,在main函数中调用函数就是函数的嵌套调用,因为main函数也是函数。在其他函数内调用函数的方法和执行与在main函数中调用函数完全一样。 11.3.2 递归调用 上一小节讨论的是使用函数调用其他函数,本节将讨论如何调用函数本身,即函数的递归调用。函数的递归调用有两种形式:直接递归调用和间接递归调用。 1. 直接递归调用 直接递归调用就是在函数内部调用函数本身。例如: void func(void) { 操作1; func(); /* 调用本身 */ 操作2; } 11.3.2 递归调用 在逻辑上,对自身的调用,也可以视为一般的调用其他函数。以func函数为例,可以假定函数中有很多个定义了很多个func函数。直接递归调用的执行顺序可描述如下图所示。 11.3.2 递归调用 2. 间接递归调用 当一个函数A调用另一个函数B,而B函数中又调用了C函数,而C函数中又调用了D函数……直到某一个函数又重新调用了函数A,构成一个循环调用的结构。这种情况就是函数的间接递归调用。例如: void fun1(void) { 操作1; func2(); /* 调用func2函数 */ 操作2; } void fun2(void) { 操作3; func1(); /* 调用func1函数 */ 操作4; } 11.3.2 递归调用 这两个函数彼此相互调用,语句执行顺序如下图所示。 11.3.2 递归调用 实际上,间接递归调用在逻辑上可以分为直接递归调用。例如,将上述的func_2函数在func_1函数内展开,可以将

文档评论(0)

wendang_12 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档