收藏 分享(赏)

第6章 模块设计.ppt

上传人:tkhy51908 文档编号:8010114 上传时间:2019-06-04 格式:PPT 页数:28 大小:2.08MB
下载 相关 举报
第6章  模块设计.ppt_第1页
第1页 / 共28页
第6章  模块设计.ppt_第2页
第2页 / 共28页
第6章  模块设计.ppt_第3页
第3页 / 共28页
第6章  模块设计.ppt_第4页
第4页 / 共28页
第6章  模块设计.ppt_第5页
第5页 / 共28页
点击查看更多>>
资源描述

1、第6章 模块设计,6.1 模块的实现函数,在C语言中,函数分为以下两种。(1)标准库函数这种函数用户不必定义,但可直接使用。例如scanf() , printf() , fabs() , sqrt() ,exp(),sin(),cos()等都是C语言中常用的库函数。(2)用户自己定义的函数这种函数用以解决用户的专门问题,一般由用户自己编写。,6.1.1 函数的概念,下面对函数作几点说明:(1)一个完整的C程序可以由若干个函数组成,其中必须有一个且只能有一个主函数main()。(2)一个完整C程序中的所有函数可以放在一个文件中,也可以放在多个文件中。 在编译命令行中键入各个函数所在的文件名(各文

2、件名之间用空格分隔)。 在主函数中用 #include 语句将各函数所在的文件包含进来。 (3)C语言中的函数没有从属关系,各函数之间互相独立,可以互相调用。,在C语言中,函数定义的一般形式为类型标识符 函数名(形参表列)形参类型说明 说明部分语句部分,6.1.2 函数的定义,在定义C函数时要注意以下几点。 (1)函数类型标识符同变量类型说明符,它表示返回的函数值类型。 (2)如果省略函数的类型标识符,则默认为是int型。 (3)C语言允许定义空函数。如 dummy() ,(4)函数中返回语句的形式为 return(表达式); 或 return 表达式; (5)如果“形参表列”中有多个形式参数

3、,则它们之间要用“,”分隔。 (6)C语言允许在形参表中直接对形参的类型进行说明。,函数调用的一般形式为 函数名(实参表列)(1)函数调用可以出现在表达式中(有函数值返回);也可以单独作为一个语句(无函数值返回)。 (2)实参表中的各实参可以是表达式,但它们的类型和个数应与函数中的形参一一对应。 (3)在调用函数中,通常要对被调用函数的返回值类型进行说明(一般在调用函数的函数体中的说明部分),包括函数类型、函数名和一对圆括号。,6.1.3 函数的调用,但C语言规定,在以下几种情况下可以不在调用函数中对被调用函数作类型说明:被调用函数的定义出现在调用函数之前。 在调用函数之前已经由别的函数(它可

4、能也要调用该被调用函数)对被调用函数作了类型说明(4)C语言虽不允许嵌套定义函数,但可以嵌套调用函数。,6.2 模块间的参数传递,1地址结合所谓地址结合,是指在一个模块调用另一个模块时,并不是将调用模块中的实参值直接传送给被调用模块中的形参,而只是将存放实参的地址传送给形参。 2数值结合所谓数值结合,是指调用模块中的实参地址与被调用模块中的形参地址是互相独立的,在一个模块调用另一个模块时,直接将实参值传送给形参被存放在形参地址中。,6.2.1 形参与实参的结合方式,1局部变量在函数内部定义的变量称为局部变量。函数内部定义的变量只在该函数范围内有效,因此,不同函数中的局部变量可以重名,互不混淆。

5、2全局变量在函数外定义的变量称为全局变量。,5.2.2 局部变量与全局变量,除非十分必要,一般不提倡使用全局变量,其原因有以下几点: 由于全局变量属于程序中的所有函数,因此,在程序的执行过程中,全局变量都需要占用存储空间,即使实际正在执行的函数中根本用不着这些全局变量,它们也要占用存储空间。 在函数中使用全局变量后,要求在所有调用该函数的调用程序中都要使用这些全局变量,从而会降低函数的通用性。 在函数中使用全局变量后,使各函数模块之间的互相影响比较大,从而使函数模块的“内聚性”差,而与其他模块的“耦合性”强。 在函数中使用全局变量后,会降低程序的清晰性,可读性差。,1用户程序的存储分配 一般来

6、说,用户程序在计算机中的存储分配如图6.1所示。,6.2.3 动态存储变量与静态存储变量,其中:程序区用于存放程序;静态存储区是在程序开始执行时就分配的固定存储单元,如全局变量;动态存储区是在函数调用过程中进行动态分配的存储单元,如函数形参、自动变量、函数调用时的现场保护和返回地址等。,2变量的存储类型 数据类型:如整型(int)、实型(float)、字符型(char)、双精度型(double)等。 数据的存储类型:分为自动类型(auto)、静态类型(static)、寄存器类型(register)、外部类型(extern)。,下面对静态存储变量作几点说明: 形参不能定义成静态类型。 对局部静态

7、变量赋初值是在编译时进行的,在调用时不再赋初值;而对自动变量赋初值是在调用时进行的,每次调用将重新赋初值。 定义局部静态变量时若不赋初值,则在编译时将自动赋初值0;但在定义自动变量时若不赋初值,则其初值为随机值。 若无多大必要,尽量不用局部静态变量。,3外部变量全局变量如果在文件开头定义,则在整个文件范围内的所有函数都可以使用该变量。一般来说,全局变量有以下几种用法: 在同一文件中,为了使全局变量定义点之前的函数中也能使用该全局变量,则应在函数中用extern加以说明。 使一个文件中的函数也能用另一个文件中的全局变量。 利用静态外部变量,使全局变量只能被本文件中的函数引用。,在C语言中,函数可

8、以分为内部函数与外部函数。只能被本文件中其他函数调用的函数称为内部函数,内部函数又称为静态函数。定义内部函数的形式如下:static 类型标识符 函数名(形参表)定义外部函数的形式如下: extern 类型标识符 函数名(形参表),6.2.4 内部函数与外部函数,人们在解决一些复杂问题时,为了降低问题的复杂程度(如问题的规模等),一般总是将问题逐层分解,最后归结为一些最简单的问题。,6.3 模块的递归调用,自己调用自己的过程称为递归调用过程。在C语言中,自己调用自己的函数称为递归函数。递归分为直接递归与间接递归两种。所谓直接递归,是指直接调用函数本身。,编译预处理功能是C语言的一个重要特点。所

9、谓编译预处理,是指C语言编译系统首先对程序模块中的编译预处理命令进行处理。C语言提供的编译预处理命令主要有以下3种:(1)宏定义;(2)文件包含命令;(3)条件编译命令。编译预处理命令一般是在函数体的外面。正确使用编译预处理命令,可以编写出易于调试、易于移植的程序模块。,6.5 编译预处理,文件包含是指一个源文件可以将另一个指定的源文件包括进来。文件包含命令的一般形式为#include 文件名 或#include “文件名“其功能是将指定文件中的全部内容读到该命令所在的位置后一起被编译。,6.5.1 文件包含命令,在使用文件包含命令时,要注意以下几个问题:(1)当#include命令指定的文件

10、中的内容改变时,包含这个文件的所有源文件都应该重新进行编译处理; (2)一个#include命令只能指定一个被包含文件,如果需要包含多个文件,则要用多个#include命令实现; (3)被包含的文件应该是源文件,不能是经编译后的目标文件; (4)文件包含可以嵌套使用,即被包含的文件中还可以使用#include命令; (5)由#include命令所指定的文件中可以有任何语言成分,因此,通常可以将经常使用的、具有公用性质的符号常量、带参数的宏定义以及外部变量等集中起来放在这种文件中,以尽量避免一些重复操作。,C语言的编译预处理程序提供了条件编译能力,以便使同一个源程序在不同的编译条件下能够产生不同

11、的目标代码文件。 1#ifdef,#else,#endif 其一般形式为#ifdef 标识符程序段1#else程序段2#endif其作用是,如果“标识符”已经定义过(一般是指用#define命令定义),则程序段1参加编译,而程序段2不参加编译;否则程序段2参加编译,而程序段1不参加编译。,6.5.2 条件编译命令,2#ifndef,#else,#endif其一般形式为#ifndef 标识符程序段1#else程序段2#endif其作用是,如果标识符没有定义过,则程序段1参加编译,而程序段2不参加编译;否则程序段2参加编译,而程序段1不参加编译。,3#if,#else,#endif其一般形式为 #if 常量表达式程序段1 #else程序段2 #endif其作用是,如果常量表达式的值为“真”(值非0),则程序段1参加编译,而程序段2不参加编译;否则程序段2参加编译,而程序段1不参加编译。,4#undef其一般形式为 #undef 标识符 其作用是,将已经定义的标识符变为未定义。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报