程序开发流程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第5章程序组织与软件开发方法1第5章程序组织与软件开发方法学习目标1、熟悉C程序的组织结构,掌握源文件与头文件的差异;2、掌握接口的概念,理解接口是用户和库之间的界面和信息交流通道,理解接口是实现程序抽象的手段;3、了解C标准库的常用接口与常用函数,掌握通过相关接口调用库函数的方法;4、了解接口设计的一般原则,掌握库的接口定义与编码实现的方法;5、了解实体的作用域与生存期的概念,掌握在程序中定义实体的方法;6、掌握宏的定义与使用方法,了解含参宏与函数的差异;7、了解条件编译的目的与意义,能使用条件编译命令控制代码编译过程;8、了解典型的软件开发流程,能够按照软件开发流程编写实际的应用程序。第5章程序组织与软件开发方法2如果有标准输入输出库的替代品,不包含头文件“stdio.h”也是可能的。本书所有实例都需要包含“stdio.h”。5.1库与接口作为程序员,能够熟练编写程序实现某种功能固然重要,能够合理使用已有的成果也十分重要。总体而言,现代程序设计离不开库的支持。库中存在大量经过严格测试的基本功能模块,这些模块为程序员开发实际程序提供了极大的方便——当程序员需要使用库提供的某项功能时,按照其接口直接调用即可,库的存在免除了程序员从头设计所有功能的负担。5.1.1库与程序文件如前所见,C语言的函数必须保存在某个源程序文件中,main函数也同样。事实上,任何C程序都至少需要两个文件才能完成实际的计算任务。这两个文件一个是程序员编写的包含main函数的源文件,一个是进行输入输出的标准库头文件“stdio.h”。一般地,作为实际编译单位的源程序文件可以包含一个或多个函数,而一个可以实际运行的程序可以由一个或多个这样的源程序文件组成,只是其中有且仅有一个源程序文件包含了那个惟一的main函数。例如,本书中出现的大量实例都涉及三个文件,一个是保存main函数的文件——笔者习惯上将其命名为“main.c”,一个zylib库源文件“zylib.c”和对应头文件“zylib.h”。这三个文件间的关系如图5−1所示。当“main.c”文件中的main函数要调用GetIntegerFromKeyboard函数时,它只能通过zylib库的头文件“zylib.h”进行。这里,头文件“zylib.h”充当了zylib库的接口,其中包含了库向外界提供的所有函数的原型,而源文件“zylib.c”则是zylib库的具体实现,其中包含了这些函数的实现代码。a#include “zylib.h”int main(){  int n;  n = GetIntegerFromKeyboard();   ……}atypedef enum{FALSE, TRUE}  BOOL;int GetIntegerFromKeyboard();double GetRealFromKeyboard();……aint GetIntegerFromKeyboard(){   ……   return t;}…… main.c zylib.h zylib.c图5−1用户、接口与库的关系正如汽车司机可以不了解发动机的结构与原理一样,如果将使用某个库的程序称为用户,则用户关心的是库能不能提供正确实现所需功能的模第5章程序组织与软件开发方法3库代码本书给出的所有库都采用第一种方式提供。zylib库虽然是笔者实现的,但读者同样可通过包含“zylib.h”使用zylib库提供的全部功能。在此过程中并不需要查看“zylib.c”哪怕一行源代码。不过,已经有读者主动阅读“zylib.c”中的源代码了吗?你是一个好学生,好学生。握手!块,而不是模块的具体实现细节。通过库的接口使用库提供的功能,程序员不需要知道这些功能到底是谁实现的以及如何实现的,他惟一需要了解的就是按照什么样的格式调用这些函数或模块才能保证程序正确工作。接口的全部目的即在于此。作为程序抽象的一种重要途径,通过将功能的实现者(库)与使用者(用户)相互分离,隐藏功能的实现细节,接口使得用户可以在更高层次上考虑程序实现。库的设计者在库完成设计和编码后向用户提交库时有两种方式:一是提供库的头文件和源文件;二是提供库的头文件和编译好的库可执行代码(一般为“.lib”文件),这使得库的使用者看不到库的源代码,既将用户从库的实现细节中解脱了出来,也保证了库具体设计的保密性。无论采用哪种方法,库的使用者都必须在工程中项目中包含对库的引用。对于第一种方式,需要将库的头文件和源文件都包含在工程项目中;对于第二种方式,需要保证工程项目能够包含库的头文件(一般需要将库的头文件添加到工程项目中),并将库的可执行代码文件添加到工程项目中。直接将库的头文件和可执行文件拷贝到标准包含路径和库路径下是不行的——C编译器并不能自动识别和引用用户自己添加的库。5.1.2标准库标准库并不是C语言本身的组成部分。但是,几乎所有支持标准C的编译器产品都提供相应的标准库以供用户使用。通过在源程序中包含相关头文件就可以使用标准库的功能。一、标准I/O库最常用的C标准库是标准I/O库,该库的接口就是一直在用的“stdio.h”。标准I/O库中包含了很多与用户输入输出有关的函数,如表5−1所示。表5−1标准I/O库提供的常用函数函数原型函数说明STRINGgets(STRINGbuffer);从标准输入设备获取字符串,调用结束后可以通过参数访问该字符串。返回值也为该参数值,若发生错误,则返回哑字符串intprintf(CSTRINGfmt,…);按照fmt格式的规定向标准输出设备输出信息,返回输出的字符个数。若发生错误则返回某个负值intputs(CSTRINGstr);向标准输出设备输出字符串信息intscanf(CSTRINGfmt,…);按照fmt格式的规定从标准输入设备获取信息,返回已成功赋值的字段个数。若没有字段被赋值返回0;若fmt为哑字符串(不存在),则发生错误第5章程序组织与软件开发方法4第8.2节:第270页。第7.4节:第247页。表中所列仅为最常用的四个,还有部分与文件相关的常用函数将在第8.2节讨论。注意,这里CSTRING为zylib库中定义的数据类型,其具体解释见第7.4节,读者这里只需要记住它表示参数fmt和str是不可更改的字符串常量,函数内部不会也不能改变字符串的内容。标准I/O库是最常用的C标准库。二、标准数学库大部分常用的数学函数都定义在C标准库的数学库中,其头文件为“math.h”。表5−2列出了常用的数学函数。表5−2标准数学库提供的常用函数函数原型函数说明doubleacos(doublex);返回反余弦函数值。x须位于−1与1间,返回值位于0~π间,单位为弧度doubleasin(doublex);返回反正弦函数值。x须位于−1与1间,返回值位于0~π间,单位为弧度doubleatan(doublex);返回反正切函数值。返回值位于−½π~½π间,单位为弧度doublecos(doublex);返回余弦函数值。参数单位为弧度;x绝对值不小于263时损失部分精度doubleexp(doublex);返回以e为底的指数函数值,即exdoublefabs(doublex);返回x的绝对值doublefloor(doublex);返回不大于x的最大整数值,以双精度浮点数表示doublefmod(doublex,doubley);返回浮点数整除x/y后的余数,即相当于x%ydoublelog(doublex);返回以e为底的对数(自然对数)函数值,即lnxdoublelog10(doublex);返回以10为底的对数函数值,即log10xdoublepow(doublex,doubley);返回x的y次幂,即xydoublesin(doublex);返回正弦函数值。参数单位为弧度;x绝对值不小于263时损失部分精度doublesqrt(doublex);返回x的平方根。x不能小于0,否则返回值无定义doubletan(doublex);返回正切函数值。参数单位为弧度;x绝对值不小于263时损失部分精度数学库函数的使用非常简单。一般地,数学上如何使用这些函数,程序就如何使用它们。三、标准辅助函数库辅助函数库的头文件为“stdlib.h”,其中包含常用工具函数,如终止程序运行、内存动态分配和释放、字符串与数值的转换等,如表5−3所示。表5−3标准辅助函数库提供的常用函数函数原型函数说明第5章程序组织与软件开发方法5第4.5.2节:第153页。第7.5.2节:第255页。doubleatof(CSTINGstr);将字符串str转换为双精度浮点型值,str必须为合法浮点数intatoi(CSTRINGstr);将字符串str转换为整型值,str必须为合法整数longatol(CSTRINGstr);将字符串str转换为长整型值,str必须为合法整数voidexit(intstatus);终止程序,返回退出状态status给启动本程序的程序voidfree(void∗p);释放由p指向的动态分配的内存STRINGitoa(intvalue,STRINGstr,intradix);将整数转换为字符串,value为待转换整数,返回值与str保存转换后的字符串,radix表示value的进制(2~36之间),如二进制、十进制等void∗malloc(size_tsize);动态分配size字节的内存,返回其首地址。size_t相当于无符号整型intrand();返回0~RAND_MAX间(闭区间)的随机整数,RAND_MAX为预定义常数voidsrand(unsignedintseed);以seed作为随机数发生器的种子初始化随机数发生器辅助函数库中的函数都比较常用,尤其是exit、malloc、free、rand和srand。读者已经第4.5.2节学习了exit函数的使用方法,rand和srand将在下一节讨论,malloc和free函数将在第7.5.2节详细研究。头文件的包含在C程序中,包含头文件有两种手段,一是使用尖括号,二是使用双引号,例如:#includestdio.h#includezylib.h其基本原则是,凡是标准库头文件都使用尖括号,凡是用户自定义的头文件或他人提供的未与编译器和标准库一同发布的头文件都使用双引号。尖括号包含策略使得系统只检查在安装编译器时设置的标准包含路径(一般为“编译器安装目录\include”)是否存在该头文件;而双引号包含策略则首先检查包含此头文件的文件所在目录,然后检查工程项目中其它所有包含了此头文件的文件所在目录。如果没有找到该头文件,系统才会进一步检查标准包含路径。因为程序员编写的头文件几乎总是和自己的源代码一起存放的,所以大多使用双引号包含它们。即使将该头文件复制到标准头文件包含路径下(此时可使用尖括号加快头文件查找速度),也是如此。除非将该库显式包含在工程项目中,否则库的源文件或可执行文件仍然不能准确查找到。在包含头文件时列写头文件路径也是可行的。假设源文件“main.c”位于目录“D:\FOP\Examples\VC\Chap04\Eg0414”下,而头文件“zylib.h”位于目录“D:\FOP\Examples\VC\Zylib”下。此时要使用绝对路径包含头文件,则书写格式应为:#includeD:\FOP\Examples\VC\Zylib\zylib.h如果想使用相对路径包含头文件,则可以使用下述方法:#include..\..\Zylib\zylib.h这里,“..”表示进入上一级目录,第一个“..”进入“main.c”所在目录“Eg0414”的父目录“Chap04”,第二个“..”则进入“Chap04”的父目录“VC”,然后包含其子目录“Zylib”下的头文件“zylib.h”。注意,虽然C语言本身区分大小写,但头文件包含部分只与文件查找相关,如果操作系统本身不区分大小写(例如MicrosoftWindows),头文件名是否使用大小写并不影响程序编绎。此外,头文件路径分隔符并不是

1 / 26
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功