欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载  

    第11章函数与文件.ppt

    • 资源ID:2120485       资源大小:214.01KB        全文页数:26页
    • 资源格式: PPT        下载积分:6
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要6
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第11章函数与文件.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函数内展开,可以将间接递归调用转换化为如下直接递归调用的形式。 void fun1(void) 操作1; 操作3; func1(); /* 调用本身 */ 操作4; 操作2; 提示:递归调用效率低,因此少使用递归调用;同时,应尽量避免使用间接递归。,11.3.3 递归调用使用举例,递归作为一种算法在程序设计语言中被广泛应用。当一个问题可以分解为多个步骤,而这些步骤的执行逻辑完全一样时,便可以使用递归方法来解决。使用递归可以大大减少程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁。 一般来说,递归需要有边界条件、递归控制段和递归返回段。当边界条件不满足时,递归控制。当边界条件满足时,递归返回。下面是三个递归的应用。,11.3.3 递归调用使用举例,1. 计算数列1到n的和 将该和序列记为:f(n) = 1 + 2 + 3 + + n。f(x)的值具有以下特点: f(n) = f(n 1) + n; f(n 1) = f(n 2) + n 1; f(1) = f(0) + 1; f(0) = 0; 总结可得:当x大于1时,f(x) = f(x 1) + 1,其中(x 1)即为递归进行;当x等于0时,f(0) = 0,此即为边界条件。,11.3.3 递归调用使用举例,2. 将输入的十进制数以二进制形式输出 本例中会用到函数值传递的特性。假定有一个输入数,其二进制形式共有有N位。若要输出第1位数,必须要先输出第2位。若要输出第2位,必须先输出第3位;依此类推,若要输出第N-1位,必须先输出第N位。总结可得:若要输出第n位数时,必须先输出后Nn+1位的数,然后再输出该位数。描述为代码如下所示。 输出二进制形式(x) 如果x的二进制位数多于一位; 输出二进制形式(x / 2); /* x / 2即为x去掉最后一位 */ 输出x二进制形式的最后一位, 对2求余即可。 否则 输出x; /* 满足边界条件,结束递归调用 */ ,11.3.3 递归调用使用举例,3. 使用折半法在升序数组中查找目标数 在一个升序数组中查找一个数,需要执行以下步骤。 (1)可以将目标数与该数组的中间数进行比较:如果目标数比中间数大,那么将查找范围缩小为从中间数到原数组末尾的范围,将这些元素作为一个新数组继续查找。如果该目标数比中间数小,那么将查找范围缩小到数组的前半部分,将这些元素作为一个新数组继续查找。如果相等,那么返回数组编号。 (2)继续在新数组内执行与第(1)步一样的操作,直到找到该目标数,或者新数组为空。,11.4 内部函数与外部函数,关键字extern和static可以用来声明函数,使用extern声明的函数为外部函数。使用static声明的函数为内部函数。本节将介绍两者的概念和区别,最后通过实例来演示内部函数和外部函数的使用。,11.4.1 外部函数,使用关键字extern声明函数的形式如下所示。 extern 返回值类型 函数名(形参列表); extern声明有以下两个作用。 在没有定义某函数的源文件里使用extern声明该函数,便可以在这个文件内使用该函数。 在函数定义的函数声明中使用关键字extern,那么该函数就允许为其他文件的函数使用。,11.4.1 外部函数,C语言中规定,所有函数默认声明为extern类别,即外部函数。也就是说在之前的所有例子中定义的函数都是外部函数。下列两种函数定义方式是等价的: int func(void); extern int func(void); 使用了extern声明函数后,就可以不用预处理命令#include。实际上两者原理是一样的,#include的功能是将其后的文件全部替代到该命令处。,11.4.2 内部函数,使用关键字static声明函数的形式如下: static 返回值类型 函数名(形参列表); 由于static声明的函数的作用域被局限于本文件,因此C语言允许多个文件内可以有同名的static内部函数,且互不干扰。static的这种优势在多人协作编程时十分有效,每个人在自己的源文件里编程时,只要将专用函数声明为内部函数,便可以不必担心所用函数名是否与其他人缩写的函数同名。 如果试图使用一个外部的static函数的做法是不允许的,编译器在链接时将报错。,11.4.3 应用举例,当存在多个源文件时,文件间函数的调用就是对外部函数的调用;同一个文件内的函数的调用就是内部函数的调用。,11.5 综合练习,1。将范例11-5的递归函数使用循环结构来实现。,11.5 综合练习,2。将加减乘除4种算法实现在一个文件中,并在另一文件中的main函数依次调用。 【提示】在文件file2.c中实现4种算法,并为其添加一个头文件file2.h以包含4种算法函数的声明;最后在file1.c中的main函数中调用各个函数。,

    注意事项

    本文(第11章函数与文件.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开