第四章程序编码 复习要求 1.了解什么是结构化程序设计,以及结构化程序设计的原则 2.了解程序设计风格4个方面的要求。 3.了解提高程序效率的方法。 4.了解程序设计语言的分类和特点。 5.掌握度量程序复杂性的 McCabe方法和 Halstead方法 二、内容提要 1.结构化程序设计 结构化程序设计技术是60年代中期提出来的,它主要包括两个方面: 在编写程序时,强调使用几种基本控制结构,通过组合嵌套,形成程序的控制结构 尽可能避免使用会使程序质量受到影响的GOTO语句 在程序设计过程中,尽量采用自顶向下和逐步细化的原则,由粗到细,一步步展开 (1)结构化程序设计的原则 使用语言中的顺序、选择、重复等有限的基本控制结构表示程序逻辑 选用的控制结构只准许有一个入口和一个出口。 程序语句组成容易识别的块,每块只有一个入口和一个出口 ■复杂结构应该用基本控制结构进行组合嵌套来实现。 语言中没有的控制结构,可用一段等价的程序段模拟,但要求该程序段在整个系统中 应前后一致。 严格控制GOTO语句,仅在用一个非结构化的程序设计语言去实现一个结构化的构 造,或者在某种可以改善而不是损害程序可读性的情况下才可以使用GOTO语句。 大量采用GOIO语句实现控制路径,会使程序路径变得复杂而且混乱,因此要控制 GOIO语句的使用。但有时完全不用GOIO语句进行程序编码,比用GOIO语句编出的程 序可读性差。例如,在査找结束时,文件访问结束时,出现错误情况要从循环中转出时,使 用布尔变量和条件结构来实现就不如用GOIO语句来得简洁易懂 对于常用的高级程序设计语言,一般都具备前述的几种基本控制结构。即使不具备等同 的结构,也可以采用仿真来实现。下面以 FORTRAN77为例进行说明,参看图41 用 FORTRAN77模拟基本控制结构 判断语句 IF(P)THEN if(p)Sl; else $2; ELSE ENDIE 先判断型循环语句
1 第四章 程序编码 一、复习要求 1. 了解什么是结构化程序设计,以及结构化程序设计的原则。 2. 了解程序设计风格 4 个方面的要求。 3. 了解提高程序效率的方法。 4. 了解程序设计语言的分类和特点。 5. 掌握度量程序复杂性的 McCabe 方法和 Halstead 方法。 二、内容提要 1. 结构化程序设计 结构化程序设计技术是 60 年代中期提出来的,它主要包括两个方面: ▪ 在编写程序时,强调使用几种基本控制结构,通过组合嵌套,形成程序的控制结构。 尽可能避免使用会使程序质量受到影响的 GOTO 语句。 ▪ 在程序设计过程中,尽量采用自顶向下和逐步细化的原则,由粗到细,一步步展开。 (1) 结构化程序设计的原则 ▪ 使用语言中的顺序、选择、重复等有限的基本控制结构表示程序逻辑。 ▪ 选用的控制结构只准许有一个入口和一个出口。 ▪ 程序语句组成容易识别的块,每块只有一个入口和一个出口。 ▪ 复杂结构应该用基本控制结构进行组合嵌套来实现。 ▪ 语言中没有的控制结构,可用一段等价的程序段模拟,但要求该程序段在整个系统中 应前后一致。 ▪ 严格控制 GOTO 语句,仅在用一个非结构化的程序设计语言去实现一个结构化的构 造,或者在某种可以改善而不是损害程序可读性的情况下才可以使用 GOTO 语句。 大量采用 GOTO 语句实现控制路径,会使程序路径变得复杂而且混乱,因此要控制 GOTO 语句的使用。但有时完全不用 GOTO 语句进行程序编码,比用 GOTO 语句编出的程 序可读性差。例如,在查找结束时,文件访问结束时,出现错误情况要从循环中转出时,使 用布尔变量和条件结构来实现就不如用 GOTO 语句来得简洁易懂。 对于常用的高级程序设计语言,一般都具备前述的几种基本控制结构。即使不具备等同 的结构,也可以采用仿真来实现。下面以 FORTRAN77 为例进行说明,参看图 4.1。 基本控制结构 用 FORTRAN77 模拟基本控制结构 判断语句 if ( p ) S1; else S2; IF ( p ) THEN S1 ELSE S2 ENDIF 先判断型循环语句 100 CONTINUE
while(p) IF(P)THEN GOTO 100 END 后判断型循环语句 100 CONTINUE do S; while(p); D)GOTO 100 图41用 FORTRAN77语句实现基本控制结构 (2)程序设计自顶向下,逐步求精 在详细设计和编码阶段,应当采取自顶向下,逐步求精的方法,把一个模块的功能逐步 分解,细化为一系列具体的步骤,进而翻译成一系列用某种程序设计语言写成的程序。 例如,要求用筛选法求100以内的素数。所谓筛选法,就是从2到100中去掉2,3,…,9,10 的倍数,剩下的就是100以内的素数。为了解决这个问题,可先按程序功能写出一个框架 ImaIl (){ 建立2到100的数组A[],其中A[=i 建立2到10的素数表B],其中存放2到10以内的素数 若A=i是B]中任一数的倍数,则剔除A[ 输出A[]中所有没有被剔除的数 上述框架中每一个加工语句都可进一步细化成一个循环语句 main(t 建立2到100的数组A[],其中A[=* A[= /建立2到10的素数表B],其中存放2到10以内的素数喇 B[]=2:B12]=3:B[3]=5:B[4]=7 /若A[=i是BL]中任一数的倍数,则剔除A[ 检查A[j所有的数能否被B整除并将能被整除的数从A中剔除: -3.1 输出A[]中所有没有被剔除的数中- for(i=2:i<=100:i++) 若A[没有被剔除,则输出之 继续对3.1和4.1细化下去,直到最后每一个语句都能直接用程序设计语言来表示为止。 for(i=2;i<=100:计++)A=i B[]=2:B[2]=3:B[3]=5:B[4]=7 /若A[=i是B中任一数的倍数,则剔除A* *检查A[]所有的数能否被B整除并将能被整除的数从A[]中剔除* if (A[/BUBU==AO)A[=0 输出A中所有没有被剔除的数 for(i=2:i<=100:i++) 若A没有被剔除,则输出之
2 while ( p ) S; IF ( p ) THEN S GOTO 100 ENDIF 后判断型循环语句 do S; while ( p ); 100 CONTINUE S IF ( p ) GOTO 100 图 4.1 用 FORTRAN77 语句实现基本控制结构 (2) 程序设计自顶向下,逐步求精 在详细设计和编码阶段,应当采取自顶向下,逐步求精的方法,把一个模块的功能逐步 分解,细化为一系列具体的步骤,进而翻译成一系列用某种程序设计语言写成的程序。 例如,要求用筛选法求 100 以内的素数。所谓筛选法,就是从 2 到 100 中去掉 2,3,…,9,10 的倍数,剩下的就是 100 以内的素数。为了解决这个问题,可先按程序功能写出一个框架。 main ( ) { 建立 2 到 100 的数组 A[ ],其中 A[i]=i; - - - - - - - - - - - - -- - - - - - - - - - - - 1 建立 2 到 10 的素数表 B[ ],其中存放 2 到 10 以内的素数;- - - - - - - - - - - - 2 若 A[i]=i 是 B[ ]中任一数的倍数,则剔除 A[i];- - - - - - - - - - - - - - - - - - - - 3 输出 A[ ]中所有没有被剔除的数;- - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - 4 } 上述框架中每一个加工语句都可进一步细化成一个循环语句。 main ( ) { /*建立 2 到 100 的数组 A[ ],其中 A[i]=i*/ - - - - - - - - - - - - - - - - - - - - - - - - 1 for (i = 2;i <= 100;i++)A[i] = i; /* 建立 2 到 10 的素数表 B[ ],其中存放 2 到 10 以内的素数*/ - - - - - - - - - - - 2 B[1] =2; B[2] = 3; B[3] = 5; B[4] = 7; /*若 A[i]=i 是 B[ ]中任一数的倍数,则剔除 A[i]*/ - - - - - - - - - - - - - - - - - - - - 3 for (j = 1; j <= 4; j++) 检查 A[ ]所有的数能否被 B[j]整除并将能被整除的数从 A[]中剔除;- - - - - - - - 3.1 /*输出 A[ ]中所有没有被剔除的数*/ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -4 for (i = 2; i <= 100; i++) 若 A[i]没有被剔除,则输出之;- - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - -4.1 } 继续对 3.1 和 4.1 细化下去,直到最后每一个语句都能直接用程序设计语言来表示为止。 main ( ) { for (i = 2;i <= 100;i++)A[i] = i; B[1] =2; B[2] = 3; B[3] = 5; B[4] = 7; /*若 A[i]=i 是 B[ ]中任一数的倍数,则剔除 A[i]*/ for (j = 1; j <= 4; j++) /*检查 A[ ]所有的数能否被 B[j]整除并将能被整除的数从 A[ ]中剔除*/ for (i = 2; i <= 100; i++) if (A[i]/B[j]*B[j] == A[i])A[i] = 0; /*输出 A[]中所有没有被剔除的数*/ for (i = 2; i <= 100; i++) /*若 A[i]没有被剔除,则输出之*/
f(A]=0) printf(“A[%d=%dn”,i,A[) 自顶向下,逐步求精方法的优点: ①自顶向下,逐步求精方法符合人们解决复杂问题的普遍规律。可提高软件开发的成 功率和生产率 ②用先全局后局部,先整体后细节,先抽象后具体的逐步求精的过程开发出来的程序 具有清晰的层次结构,因此程序容易阅读和理解; ③程序自顶向下,逐步细化,分解成一个树形结构(如图42所示)。在同一层的结点 上做的细化工作相互独立。在任何一步发生错 误,一般只影响它下层的结点,同一层其它结 点不受影响。在以后的测试中,也可以先独立 地一个结点一个结点地做,最后再集成。 ④程序清晰和模块化,使得在修改和重° 逐步细化 新设计一个软件时,可复用的代码量最大 ⑤每一步工作仅在上层结点的基础上做 不多的设计扩展,便于检查 ⑥有利于设计的分工和组织工作 图42程序的树形结构 (3)数据结构的合理化 HMl指出,结构化程序设计主要是想从程序的控制结构入手,消除不适应的、容易引 起混乱的GOTO语句。这只是问题的一个方面,而问题的另一方面,过去没有注意到的是数 据结构的合理化问题,即数据结构访问的规范化,标准化问题。 假如数据结构中常使用数组、指针等数据类型,则对它们必须采取随机访问,这样势必 生访问上的混乱。例如,要访问数组元素A[I,必须先对下标i,j访问,造成访问忽前 忽后,这与GOTO语句造成的混乱类似,同样是有害的。 H Mills指出,解决这一问题的办 法是用栈和队列去代替数组和指针。栈与队列分别是按后进先出(LIFO)和先进先出(FIFO) 的原则进行存取的。在程序中用栈和队列代替数组和指针,用合理的规范的顺序存取代替随 机存取,将克服随机存取带来的麻烦。而且有人做了证明,所有使用数组和指针的程序,都 可以使用栈和队列的程序等价替换 2.程序设计风格 在软件生存期中,人们经常要阅读程序。特别是在软件测试阶段和维护阶段,编写程序 的人与参与测试、维护的人都要阅读程序。因此,阅读程序是软件开发和维护过程中的一个 重要组成部分,而且读程序的时间比写程序的时间还要多。70年代初,有人提出在编写程序 时,应使程序具有良好的风格。 程序设计风格包括4个方面:源程序文档化,数据说明,语句结构和输入/输出方法, 力图从编码原则的角度提高程序的可读性,改善程序质量 (1)源程序文档化 ①符号名的命名 符号名即标识符,包括模块名、变量名、常量名、子程序名、数据区名、缓冲区名等。 这些名字应能反映它所代表的实际东西,应有一定实际意义 名字不是越长越好,过长的名字会使程序的逻辑流程变得模糊,给修改带来困难。所 以应当选择精炼的意义明确的名字,改善对程序功能的理解。 必要时可使用缩写名字,但缩写规则要一致,并且要给每一个名字加注释
3 图 4.2 程序的树形结构 if (A[i] != 0) printf(“A[%d]=%d\n”,i,A[i]); } 自顶向下,逐步求精方法的优点: ① 自顶向下,逐步求精方法符合人们解决复杂问题的普遍规律。可提高软件开发的成 功率和生产率; ② 用先全局后局部,先整体后细节,先抽象后具体的逐步求精的过程开发出来的程序 具有清晰的层次结构,因此程序容易阅读和理解; ③ 程序自顶向下,逐步细化,分解成一个树形结构(如图 4.2 所示)。在同一层的结点 上做的细化工作相互独立。在任何一步发生错 误,一般只影响它下层的结点,同一层其它结 点不受影响。在以后的测试中,也可以先独立 地一个结点一个结点地做,最后再集成。 ④ 程序清晰和模块化,使得在修改和重 新设计一个软件时,可复用的代码量最大; ⑤ 每一步工作仅在上层结点的基础上做 不多的设计扩展,便于检查; ⑥ 有利于设计的分工和组织工作。 (3) 数据结构的合理化 H.Mills 指出,结构化程序设计主要是想从程序的控制结构入手,消除不适应的、容易引 起混乱的 GOTO 语句。这只是问题的一个方面,而问题的另一方面,过去没有注意到的是数 据结构的合理化问题,即数据结构访问的规范化,标准化问题。 假如数据结构中常使用数组、指针等数据类型,则对它们必须采取随机访问,这样势必 产生访问上的混乱。例如,要访问数组元素 A[i][j],必须先对下标 i,j 访问,造成访问忽前 忽后,这与 GOTO 语句造成的混乱类似,同样是有害的。H.Mills 指出,解决这一问题的办 法是用栈和队列去代替数组和指针。栈与队列分别是按后进先出(LIFO)和先进先出(FIFO) 的原则进行存取的。在程序中用栈和队列代替数组和指针,用合理的规范的顺序存取代替随 机存取,将克服随机存取带来的麻烦。而且有人做了证明,所有使用数组和指针的程序,都 可以使用栈和队列的程序等价替换。 2.程序设计风格 在软件生存期中,人们经常要阅读程序。特别是在软件测试阶段和维护阶段,编写程序 的人与参与测试、维护的人都要阅读程序。因此,阅读程序是软件开发和维护过程中的一个 重要组成部分,而且读程序的时间比写程序的时间还要多。70 年代初,有人提出在编写程序 时,应使程序具有良好的风格。 程序设计风格包括 4 个方面:源程序文档化,数据说明,语句结构和输入/输出方法, 力图从编码原则的角度提高程序的可读性,改善程序质量。 (1) 源程序文档化 ① 符号名的命名 符号名即标识符,包括模块名、变量名、常量名、子程序名、数据区名、缓冲区名等。 ▪ 这些名字应能反映它所代表的实际东西,应有一定实际意义。 ▪ 名字不是越长越好,过长的名字会使程序的逻辑流程变得模糊,给修改带来困难。所 以应当选择精炼的意义明确的名字,改善对程序功能的理解。 ▪ 必要时可使用缩写名字,但缩写规则要一致,并且要给每一个名字加注释
在一个程序中,一个变量只应用于一种用途。就是说,在同一个程序中一个变量不能 身兼几种工作 ②程序的注释 夹在程序中的注释是程序员与日后的程序读者之间通信的重要手段。正确的注释能够帮 助读者理解程序,可为后续阶段进行测试和维护,提供明确的指导。因此,注释决不是可有 可无的,大多数程序设计语言允许使用自然语言来写注释,这就给阅读程序带来很大的方便 一些正规的程序文本中,注释行的数量占到整个源程序的1/3到1/2,甚至更多 序言性注释:通常置于每个程序模块的开头部分,它应当给出程序的整体说明,对 于理解程序本身具有引导作用。有些软件开发部门对序言性注释做了明确而严格的规定,要 求程序编制者逐项列出的有关项目包括:程序标题、有关本模块功能和目的的说明、主要算 法、接口说明、有关数据描述、模块位置、开发简历等。 功能性注释:嵌在源程序体中,用以描述其后的语句或程序段是在做什么工作,不 要解释下面怎么做,因为解释怎么做常常是与程序本身重复的,并且对于阅读者理解程序没 有什么帮助 书写功能性注释,要注意:·用于描述一段程序,而不是每一个语句:·用缩进和空行, 使程序与注释容易区别;·注释要正确 ③视觉组织 利用空格、空行和移行,提高程序的可视化程度。 恰当地利用空格,可以突出运算的优先性,避免发生运算的错误。 自然的程序段之间可用空行隔开 对于选择语句和循环语句,把其中的程序段语句向右做阶梯式移行。这样可使程序的 逻辑结构更加清晰,层次更加分明。 (2)数据说明 在编写程序时,需注意数据说明的风格。为了使程序中数据说明更易于理解和维护, 须注意以下几点。 数据说明的次序应当规范化,使数据属性容易查找。 当多个变量名用一个语句说明时,应当对这些变量按字母的顺序排列 如果设计了一个复杂的数据结构,应当使用注释来说明在程序实现时这个数据结构的 固有特点。 (3)语句结构 在设计阶段确定了软件的逻辑流结构,但构造单个语句则是编码阶段的任务。语句构造 力求简单,直接,不能为了片面追求效率而使语句复杂化 在一行内只写一条语句,并且采取适当的移行格式,使程序的逻辑和功能变得更加明 ■程序编写首先应当考虑清晰性,不要刻意追求技巧性,使程序编写得过于紧凑 程序编写得要简单,写清楚,直截了当地说明程序员的用意。 除非对效率有特殊的要求,程序编写要做到清晰第一,效率第二。不要为了追求效率 而丧失了清晰性。事实上,程序效率的提高主要应通过选择高效的算法来实现 ■首先要保证程序正确,然后才要求提高速度。反过来说,在使程序高速运行时,首先 要保证它是正确的 让编译程序做简单的优化 尽可能使用库函数 避免使用临时变量而使可读性下降。 尽量用公共过程或子程序去代替重复的功能代码段
4 ▪ 在一个程序中,一个变量只应用于一种用途。就是说,在同一个程序中一个变量不能 身兼几种工作。 ② 程序的注释 夹在程序中的注释是程序员与日后的程序读者之间通信的重要手段。正确的注释能够帮 助读者理解程序,可为后续阶段进行测试和维护,提供明确的指导。因此,注释决不是可有 可无的,大多数程序设计语言允许使用自然语言来写注释,这就给阅读程序带来很大的方便。 一些正规的程序文本中,注释行的数量占到整个源程序的 1/3 到 1/2,甚至更多。 ▪ 序言性注释 :通常置于每个程序模块的开头部分,它应当给出程序的整体说明,对 于理解程序本身具有引导作用。有些软件开发部门对序言性注释做了明确而严格的规定,要 求程序编制者逐项列出的有关项目包括:程序标题、有关本模块功能和目的的说明、主要算 法、接口说明、有关数据描述、模块位置、开发简历等。 ▪ 功能性注释 :嵌在源程序体中,用以描述其后的语句或程序段是在做什么工作,不 要解释下面怎么做,因为解释怎么做常常是与程序本身重复的,并且对于阅读者理解程序没 有什么帮助。 书写功能性注释,要注意:·用于描述一段程序,而不是每一个语句;·用缩进和空行, 使程序与注释容易区别;·注释要正确。 ③ 视觉组织 利用空格、空行和移行,提高程序的可视化程度。 ▪ 恰当地利用空格,可以突出运算的优先性,避免发生运算的错误。 ▪ 自然的程序段之间可用空行隔开; ▪ 对于选择语句和循环语句,把其中的程序段语句向右做阶梯式移行。这样可使程序的 逻辑结构更加清晰,层次更加分明。 (2) 数据说明 在编写程序时,需注意数据说明的风格。为了使程序中数据说明更易于理解和维护,必 须注意以下几点。 ▪ 数据说明的次序应当规范化,使数据属性容易查找。 ▪ 当多个变量名用一个语句说明时,应当对这些变量按字母的顺序排列。 ▪ 如果设计了一个复杂的数据结构,应当使用注释来说明在程序实现时这个数据结构的 固有特点。 (3) 语句结构 在设计阶段确定了软件的逻辑流结构,但构造单个语句则是编码阶段的任务。语句构造 力求简单,直接,不能为了片面追求效率而使语句复杂化。 ▪ 在一行内只写一条语句,并且采取适当的移行格式,使程序的逻辑和功能变得更加明 确。 ▪ 程序编写首先应当考虑清晰性,不要刻意追求技巧性,使程序编写得过于紧凑。 ▪ 程序编写得要简单,写清楚,直截了当地说明程序员的用意。 ▪ 除非对效率有特殊的要求,程序编写要做到清晰第一,效率第二。不要为了追求效率 而丧失了清晰性。事实上,程序效率的提高主要应通过选择高效的算法来实现。 ▪ 首先要保证程序正确,然后才要求提高速度。反过来说,在使程序高速运行时,首先 要保证它是正确的。 ▪ 让编译程序做简单的优化。 ▪ 尽可能使用库函数。 ▪ 避免使用临时变量而使可读性下降。 ▪ 尽量用公共过程或子程序去代替重复的功能代码段
用调用公共函数去代替重复使用的表达式。 使用括号来清晰地表达算术表达式和逻辑表达式的运算顺序 避免不必要的转移。同时如果能保持程序的可读性,则不必用GOIO语句。 尽量只采用三种基本的控制结构来编写程序。 用逻辑表达式代替分支嵌套 避免使用空的ELSE语句和IF… THEN IE…的语句 避免使用 ELSE GOTO和 ELSE RETURN结构 使与判定相联系的动作尽可能地紧跟着判定 避免采用过于复杂的条件测试 ■尽量减少使用“否定”条件的条件语句。不要让读者绕弯子想。 避免过多的循环嵌套和条件嵌套 不要使GOTO语句相互交叉 避免循环的多个出口。 使用数组,以避免重复的控制序列。 尽可能用通俗易懂的伪码来描述程序的流程,然后再翻译成必须使用的语言 数据结构要有利于程序的简化。 ■要模块化,使模块功能尽可能单一化,模块间的耦合能够清淸晰可见 利用信息隐蔽,确保每一个模块的独立性。 从数据出发去构造程序。 不要修补不好的程序,要重新编写。也不要一味地追求代码的复用,要重新组织 对太大的程序,要分块编写、测试,然后再集成 对递归定义的数据结构尽量使用递归过程 注意计算机浮点数运算的特点,例如,浮点数运算10.0*0.通常不等于1.0。 不要单独进行浮点数的比较。用它们做比较,其结果常常发生异常情况。 避免不恰当地追求程序效率,在改进效率前,要做出有关效率的定量估计。 在程序中应有出错处理功能,一旦出现故障时不要让机器进行干预,导致停工。 此外,对于程序中的变量,标号,注释等,还需要给予一些注意。例如, 变量名中尽量不用数字。 显式说明所有的变量。 确保所有变量在使用前都被初始化。 确保注释与代码完全一致 不仅对代码做注释,而且对每条注释都加以编号。 不注释不好的代码,要重新编写 程序格式的安排应有助于读者理解程序 注释不要过于繁琐。 遵循国家标准 经常反躬自省:“如果我不是编码的人,我能看懂它吗?”考虑它的可理解性达到什 么程度 (4)输入和输出(I/O 输入和输出信息是与用户的使用直接相关的。输入和输出的方式和格式应当尽可能方便 用户的使用。因此,在软件需求分析阶段和设计阶段,就应基本确定输入和输出的风格。系 统能否被用户接受,有时就取决于输入和输出的风格 不论是批处理的输入/输出方式,还是交互式的输入/输出方式,在设计和程序编码时 都应考虑下列原则
5 ▪ 用调用公共函数去代替重复使用的表达式。 ▪ 使用括号来清晰地表达算术表达式和逻辑表达式的运算顺序。 ▪ 避免不必要的转移。同时如果能保持程序的可读性,则不必用 GOTO 语句。 ▪ 尽量只采用三种基本的控制结构来编写程序。 ▪ 用逻辑表达式代替分支嵌套。 ▪ 避免使用空的 ELSE 语句和 IF…THEN IF…的语句。 ▪ 避免使用 ELSE GOTO 和 ELSE RETURN 结构。 ▪ 使与判定相联系的动作尽可能地紧跟着判定。 ▪ 避免采用过于复杂的条件测试。 ▪ 尽量减少使用“否定”条件的条件语句。不要让读者绕弯子想。 ▪ 避免过多的循环嵌套和条件嵌套; ▪ 不要使 GOTO 语句相互交叉。 ▪ 避免循环的多个出口。 ▪ 使用数组,以避免重复的控制序列。 ▪ 尽可能用通俗易懂的伪码来描述程序的流程,然后再翻译成必须使用的语言。 ▪ 数据结构要有利于程序的简化。 ▪ 要模块化,使模块功能尽可能单一化,模块间的耦合能够清晰可见。 ▪ 利用信息隐蔽,确保每一个模块的独立性。 ▪ 从数据出发去构造程序。 ▪ 不要修补不好的程序,要重新编写。也不要一味地追求代码的复用,要重新组织。 ▪ 对太大的程序,要分块编写、测试,然后再集成。 ▪ 对递归定义的数据结构尽量使用递归过程。 ▪ 注意计算机浮点数运算的特点,例如,浮点数运算 10.0*0.1 通常不等于 1.0 。 ▪ 不要单独进行浮点数的比较。用它们做比较,其结果常常发生异常情况。 ▪ 避免不恰当地追求程序效率,在改进效率前,要做出有关效率的定量估计。 ▪ 在程序中应有出错处理功能,一旦出现故障时不要让机器进行干预,导致停工。 此外,对于程序中的变量,标号,注释等,还需要给予一些注意。例如, ▪ 变量名中尽量不用数字。 ▪ 显式说明所有的变量。 ▪ 确保所有变量在使用前都被初始化。 ▪ 确保注释与代码完全一致。 ▪ 不仅对代码做注释,而且对每条注释都加以编号。 ▪ 不注释不好的代码,要重新编写。 ▪ 程序格式的安排应有助于读者理解程序。 ▪ 注释不要过于繁琐。 ▪ 遵循国家标准。 ▪ 经常反躬自省:“如果我不是编码的人,我能看懂它吗?”考虑它的可理解性达到什 么程度。 (4) 输入和输出 (I / O) 输入和输出信息是与用户的使用直接相关的。输入和输出的方式和格式应当尽可能方便 用户的使用。因此,在软件需求分析阶段和设计阶段,就应基本确定输入和输出的风格。系 统能否被用户接受,有时就取决于输入和输出的风格。 不论是批处理的输入/输出方式,还是交互式的输入/输出方式,在设计和程序编码时 都应考虑下列原则: