1、结构程序设计结构程序设计: 一种设计程序的技术,它采用自顶向一种设计程序的技术,它采用自顶向下逐步求精的设计方法和单入口单出口下逐步求精的设计方法和单入口单出口的控制结构。的控制结构。使用结构程序设计技术的好处使用结构程序设计技术的好处:1)提高软件开发工程的成功率和生产率;)提高软件开发工程的成功率和生产率;2)系统有清晰的层次结构,容易阅读理解;)系统有清晰的层次结构,容易阅读理解;3)单入口单出口的控制结构,容易诊断纠正;)单入口单出口的控制结构,容易诊断纠正;4)模块化可以使得软件可以重用;)模块化可以使得软件可以重用;5)程序逻辑结构清晰,有利于程序正确性证明。)程序逻辑结构清晰,有
2、利于程序正确性证明。经典的结构程序设计经典的结构程序设计:只允许使用顺序、:只允许使用顺序、IF_THEN_ELSE选择和选择和DO_WHILE循环;循环;扩展的结构程序设计扩展的结构程序设计:除了三种基本控制结构,:除了三种基本控制结构,还使用还使用DO_CASE和和DO_UNTIL循环;循环;修正的结构程序设计修正的结构程序设计:除了三种基本控制结构:除了三种基本控制结构和两种扩充结构,还使用和两种扩充结构,还使用BREAK等结构。等结构。 流程图通常由三种结点组成:流程图通常由三种结点组成:1)函数结点函数结点 如果一个结点有一个入口线和如果一个结点有一个入口线和一个出口线,则称为函数结
3、点。一个出口线,则称为函数结点。 由于函数结点一般对应于赋值由于函数结点一般对应于赋值语句,所以语句,所以 F 也表示了这一个结点也表示了这一个结点对应的函数关系。对应的函数关系。 F函数结点函数结点6.1.1 结构化程序结构化程序6.1.1.1 控制结构控制结构2)谓词结点谓词结点 如果一个结点有一个入口线和两个出口线,如果一个结点有一个入口线和两个出口线,而且它不改变程序的数据项的值,则称为谓词而且它不改变程序的数据项的值,则称为谓词结点。结点。 P是一个谓词,根据是一个谓词,根据P的逻辑值(的逻辑值(T或或F),),结点有不同的出口。结点有不同的出口。 P谓词结点谓词结点3)汇点汇点 如
4、果一个结点有两个或多个入口线和一个出如果一个结点有两个或多个入口线和一个出口线,而且它不执行任何运算,则称为汇点口线,而且它不执行任何运算,则称为汇点 。汇点汇点 汇点的简略表示汇点的简略表示1)顺序结构顺序结构:相当于:相当于“A、B” 2. 三种基本控制结构三种基本控制结构AB(a)顺序结构顺序结构2)选择结构选择结构 相当于相当于“If exp then A else B endif ” ABexp(b)选择结构选择结构3)循环结构循环结构:相当于:相当于“While exp do A” A(c)循环结构循环结构exp1)多分支结构多分支结构 相当于相当于“Case I of I=1:C
5、1; I=2:C2; I=3:C3; ; I=n:Cn” 3. 扩充两种控制结构扩充两种控制结构 CnC3C1C2( (d)d)多分支结构多分支结构I=?2)UNTIL循环结构循环结构 相当于相当于“Repeat A Until exp” A(e)UNTIL循环循环exp6.1.1.2 正规程序正规程序 定义定义1:一个流程图程序如果满足下面两个:一个流程图程序如果满足下面两个条件,称为正规程序:条件,称为正规程序: 1)具有一个入口线和一个出口线;)具有一个入口线和一个出口线; 2)对每一个结点,都有一条从入口线到出)对每一个结点,都有一条从入口线到出口线的通路通过该结点。口线的通路通过该结
6、点。 由于正规程序有一个入口线和一个出口线,因由于正规程序有一个入口线和一个出口线,因而一个正规程序总可以抽象为一个而一个正规程序总可以抽象为一个函数结点函数结点。 F函数结点函数结点定义定义2:如果一个正规程序的某个部分仍然:如果一个正规程序的某个部分仍然是正规程序,那么称它为该正规程序的正是正规程序,那么称它为该正规程序的正规子程序。规子程序。 先给出一个概念:先给出一个概念:封闭结构封闭结构定义定义3:流程图中,两个结点之间所有没:流程图中,两个结点之间所有没有重复结点的通路组成的结构称为封闭有重复结点的通路组成的结构称为封闭结构。结构。6.1.1.3 基本程序基本程序 如图:封闭结构为
7、如图:封闭结构为 a - b1 - b2 - b3 ; c1 - c2 ; d1 - d2 - d3 ; e - f ab1b2b3c2c1d1d2d3ef1)不包括多于一个结点的正规子程序,即它是一)不包括多于一个结点的正规子程序,即它是一种不可再分解的正规程序;(程序自身不可视种不可再分解的正规程序;(程序自身不可视为正规子程序)为正规子程序) 2)如果存在封闭结构,封闭结构都是正规程序。)如果存在封闭结构,封闭结构都是正规程序。 6.1.1.3 基本程序基本程序 定义定义4:一个正规程序,如果满足以下两个条件,:一个正规程序,如果满足以下两个条件,则称之为则称之为基本程序基本程序: 基本
8、程序形式有多种,前面提到的三种基本程序形式有多种,前面提到的三种基本控制结构(基本控制结构(顺序结构、选择结构、循环顺序结构、选择结构、循环结构结构)和两个扩充控制结构()和两个扩充控制结构(多分支结构、多分支结构、UNTIL循环结构循环结构)都是基本程序。)都是基本程序。 定义定义5: 用以构造程序的基本程序的集合称为用以构造程序的基本程序的集合称为基集合基集合。 如:如:顺序,顺序,if-then-else,while do 顺序,顺序,if-then-else,repeat-until 都是基集合。都是基集合。 定义定义6:如果一个基本程序的函数结点用另一:如果一个基本程序的函数结点用另
9、一个基本函数程序替换,产生的新的正规程序称个基本函数程序替换,产生的新的正规程序称为为复合程序复合程序。 A复合程序复合程序expBexpA: 循环结构的循环结构的A函数结点用另一循环结构代替,即嵌套循环,就产生了函数结点用另一循环结构代替,即嵌套循环,就产生了复合程序。复合程序。 由于复合程序是由一些基本程序组成,因此,由于复合程序是由一些基本程序组成,因此,无论从总体上看或是从每个组成部分看,都满足无论从总体上看或是从每个组成部分看,都满足“一个入口,一个出口一个入口,一个出口”的原则,这样的程序就的原则,这样的程序就是通常说的好结构程序,或者结构化程序。是通常说的好结构程序,或者结构化程
10、序。 定义定义7:由基本程序的一个固定的基集合:由基本程序的一个固定的基集合构造出的复合程序,称为构造出的复合程序,称为结构化程序结构化程序。结构化定理结构化定理:任一正规程序都可以函数等价于:任一正规程序都可以函数等价于一个由基集合一个由基集合顺序,顺序,If-else-then,While-do产生的结构化程序。产生的结构化程序。 实际上,只要能证明可以将任一正规程序转实际上,只要能证明可以将任一正规程序转换成等价的结构化程序就可以证明这个结构化换成等价的结构化程序就可以证明这个结构化定理。定理。 6.1.2 结构化定理结构化定理证明证明:(分三步进行结构化程序的转换):(分三步进行结构化
11、程序的转换)步骤一:从程序入口处开始步骤一:从程序入口处开始给程序的函数结点给程序的函数结点和谓词结点编号和谓词结点编号:1,2,3,n,同时,将同时,将每个函数和谓词结点的出口线用它后面的结点每个函数和谓词结点的出口线用它后面的结点的号码进行编号,如果出口线后面没有结点,的号码进行编号,如果出口线后面没有结点,也就是说该结点的出口线与程序的出口线相连也就是说该结点的出口线与程序的出口线相连时,出口线编号为时,出口线编号为0。 步骤二:对原程序中每一个编号为步骤二:对原程序中每一个编号为i, 出口线编出口线编号为号为j的函数结点的函数结点H,构造一个新的序列程序构造一个新的序列程序Gi,如图:
12、如图: HGi =HL:= jiij 类似地,对于每个编号为类似地,对于每个编号为i,出口线分别为出口线分别为j和和k的谓词结点,构造一个新的选择程序的谓词结点,构造一个新的选择程序Gi,如图:如图: PjkiGi =PiL := jL := k步骤三:步骤三:利用已经得到的一些利用已经得到的一些Gi程序(程序(i=1,2,3,n),),按下图的形式构造一个按下图的形式构造一个While-do循环。循环。 图中的循环体是一图中的循环体是一个对个对L从从1到到n的嵌套的嵌套选择(选择(if-then-else)程序,转换后的程序程序,转换后的程序与原程序是等价的,与原程序是等价的,是由基集合是由
13、基集合顺序、顺序、选择、循环选择、循环 所复合所复合成的结构化程序。成的结构化程序。L:=1L0L=1L=nL=2GnL:=0G2G1TTTTFFFF 这种方法并不是唯一的把程序转变为结构化这种方法并不是唯一的把程序转变为结构化程序的方法,所得的程序也不一定是最好的。程序的方法,所得的程序也不一定是最好的。 它的目的是为了证明结构化定理。它的目的是为了证明结构化定理。例例1:把图示的非结构化程序转换成结构化程序:把图示的非结构化程序转换成结构化程序(用结构化定理证明过程提供的方法转换)(用结构化定理证明过程提供的方法转换) 6.1.3 非结构化程序到结构化程序的转换非结构化程序到结构化程序的转
14、换P1P2AB非结构化程序例图非结构化程序例图1)进行结点及其出口线的编号;)进行结点及其出口线的编号; 1340202341P1P2AB非结构化程序例图非结构化程序例图P1321G1=P11L := 3L := 22)将图中的四个结点构造新的程序)将图中的四个结点构造新的程序G1、G2、G3、G4; BG2 =BL:= 0220P2403G3 =P23L := 4L := 0AG4 =AL:= 14413)利用得到的)利用得到的G1、G2、G3、G4按介绍的方法构造一个按介绍的方法构造一个While-do循环,最终结果如图:循环,最终结果如图: L:=1L0L=1L=4L=2L:=0P1L
15、:= 3L := 2BL:= 0L=3P2L := 4L := 0AL:= 1转化后的结构化程序图转化后的结构化程序图FFFFFTTTTT6.2 人机界面设计人机界面设计6.2.1 设计问题设计问题 1. 系统响应时间;系统响应时间; 2. 用户帮助;用户帮助; 3. 出错信息处理;出错信息处理; 4. 命令交互命令交互6.2.2 设计过程设计过程6.2.3 人机界面设计指南人机界面设计指南 1. 一般交互指南;一般交互指南; 2. 信息显示指南;信息显示指南; 3. 数据输入指南。数据输入指南。6.3 过程设计的工具过程设计的工具 6.3.1 程序流程图程序流程图 程序流程图程序流程图:是一
16、种描述程序的控制结:是一种描述程序的控制结构流程和指令执行情况的有向图。构流程和指令执行情况的有向图。 历史悠久、使用广泛、直观描绘控制流历史悠久、使用广泛、直观描绘控制流程、便于初学者掌握。程、便于初学者掌握。ASP检索程序流程图:检索程序流程图:开 始加载Include文件定义记数变量、作物变量创建数据库链接对象、记录集对象打开数据库用客户提交的值对作物变量赋值SQL查询语句赋值通过记录集对象打开SQL语句设定的记录记录集末端?记数变量加1,输出记录字段值及图像转跳下一记录关闭数据库链接对象、记录集对象,并释放资源输出记录数和提示结 束YN2)程序流程图中用箭头代表控制流,因此程)程序流程
17、图中用箭头代表控制流,因此程序员不受任何约束,可以完全不顾结构程序员不受任何约束,可以完全不顾结构程序设计的精神,随意转移控制。序设计的精神,随意转移控制。3)程序流程图不易表示数据结构。)程序流程图不易表示数据结构。程序流程图的程序流程图的缺点缺点:1)程序流程图本质上不是逐步求精的好工具,)程序流程图本质上不是逐步求精的好工具,它诱使程序员过早地考虑程序的控制流程,它诱使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构。而不去考虑程序的全局结构。6.3.2 盒图(盒图(N-S图)图) ABC条件条件FTElseBThenACase条件条件Case1ACase2BCasenN循环条件
18、循环条件循环条件循环条件Do-While部分部分Do-Until部分部分Aa . 顺 序 结顺 序 结构构b.选择结构选择结构c.多分支结构多分支结构d.当型循环结构当型循环结构e.直到型循环结构直到型循环结构f.调用子程序调用子程序A图图6.4 盒图的基本符号盒图的基本符号盒图的特点有:盒图的特点有: 1)功能域明确,可以从盒图上一眼就看出来;)功能域明确,可以从盒图上一眼就看出来; 2)不可能任意转移控制;)不可能任意转移控制; 3)很容易确定局部和全程数据的作用域;)很容易确定局部和全程数据的作用域; 4)很容易表现嵌套关系,也可以表示模块的层)很容易表现嵌套关系,也可以表示模块的层次结
19、构。次结构。 FTBCDACase1E2F3G4HA:盒图例子盒图例子 PAD(Problem Analysis Diagram)是问题是问题分析图。分析图。 日立公司发明和推广(日立公司发明和推广(1973)。)。 6.3.3 PAD图图P1P2WHILE CUNTIL CPPP2P1CP1P2PnX=L1L2Lndefa.顺序结构顺序结构b.当型循环结构当型循环结构c.直到型循环结构直到型循环结构d.选择结构选择结构e.多分支结构多分支结构f.语句标号语句标号g.定义定义图图6.5 PAD图的基本符号图的基本符号例子:例子: P1P2UNTIL C2P7P4P3Cdefa.初始的初始的PA
20、D图图图图6.6 PAD图例子图例子b.使用使用def符号细化处理框符号细化处理框P2P5P2P8C1UNTIL C2P9P10P6PAD图的优点:图的优点:1)使用表示结构化控制结构的)使用表示结构化控制结构的PAD符号所设计符号所设计出来的程序必然是结构化程序;出来的程序必然是结构化程序;2)PAD图所描绘的程序结构十分清晰。图所描绘的程序结构十分清晰。 图中最左面的竖线是程序的主线,即第一层结图中最左面的竖线是程序的主线,即第一层结构。随着程序层次的增加,构。随着程序层次的增加,PAD图逐渐向右延伸,图逐渐向右延伸,每增加一个层次,图形向右扩展一条竖线。每增加一个层次,图形向右扩展一条竖
21、线。PAD图中竖线的总条数就是程序的层次数;图中竖线的总条数就是程序的层次数; 3)用)用PAD图表现程序,通俗易懂,程序从图中图表现程序,通俗易懂,程序从图中最左竖线上端的结点开始执行,自上而下,最左竖线上端的结点开始执行,自上而下,从左向右顺序执行,遍历所有结点;从左向右顺序执行,遍历所有结点;4)容易将)容易将PAD图转换成高级语言源程序,这图转换成高级语言源程序,这种转换可以用软件工具自动完成;种转换可以用软件工具自动完成;5)可用于表示程序逻辑,也可用于描绘数据)可用于表示程序逻辑,也可用于描绘数据结构;结构;6)PAD图的符号支持自顶向下、逐步求精的图的符号支持自顶向下、逐步求精的
22、方法。方法。判定表由四部分组成:判定表由四部分组成: 左上部列出所有左上部列出所有条件条件 左下部是所有可能做的左下部是所有可能做的动作动作 右上部表示各种右上部表示各种条件组合条件组合 右下部是和每种条件组合相右下部是和每种条件组合相对应的动作对应的动作 6.3.4 判定表判定表 123456789国内乘客国内乘客 TTTTFFFF头等舱头等舱 TFTFTFTF残疾乘客残疾乘客 FFTTFFTT行李重量行李重量W30 TFFFFFFFF 免费免费 (W-30)2 (W-30)3 (W-30)4 (W-30)6 (W-30)8 (W-30)12 6.3.5 判定树判定树 判定树是判定表的变种。
23、判定树是判定表的变种。 行李重量行李重量W30行李重量行李重量W30国内乘客国内乘客外国乘客外国乘客头等舱头等舱其他舱其他舱头等舱头等舱其他舱其他舱残疾乘客残疾乘客正常乘客正常乘客残疾乘客残疾乘客正常乘客正常乘客残疾乘客残疾乘客正常乘客正常乘客残疾乘客残疾乘客正常乘客正常乘客(W-30)2(W-30)4(W-30)3(W-30)6(W-30)4(W-30)8(W-30)6(W-30)12免费免费图图6.7 用判定树表示计算行李费的算法用判定树表示计算行李费的算法行李费算法行李费算法 PDL也称为伪码。也称为伪码。 如:如:if I0 then 执行订单数据输入模块执行订单数据输入模块 else
24、 报告出错信息报告出错信息 end if 6.3.6 过程设计语言(过程设计语言(PDL)PDL的优点的优点:1)可以作为注释直接插在源程序中间;)可以作为注释直接插在源程序中间;2)可以使用普通的正文编辑程序或文字处理)可以使用普通的正文编辑程序或文字处理系统来完成系统来完成PDL的书写和编辑工作;的书写和编辑工作;3)现在已经有一些自动处理程序可以自动地)现在已经有一些自动处理程序可以自动地把把PDL生成程序代码。生成程序代码。 PDL的缺点的缺点:不如图形工具形象直观。:不如图形工具形象直观。6.4 面向数据结构的设计方法面向数据结构的设计方法 1)顺序结构)顺序结构 ABCD图图6.8
25、 A由由B、C、D三三个元素顺序组成个元素顺序组成6.4.1 Jackson图图2)选择结构)选择结构 ABCD图图6.9 根据条件根据条件A选选择择B、C、D中的某一中的某一个个3)重复结构)重复结构 AB*图图6.10 A由由B出出现现N次组成次组成6.4.2 改进的改进的Jackson图图 ABCD图图6.11 改进的改进的Jackson图图ABCDAB-AB*S(i)S(i)I(i)(a)(b)(c)(d)Jackson方法的目标是:方法的目标是: 得出对程序处理过程的详细描述。得出对程序处理过程的详细描述。 6.4.3 Jackson方法方法Jackson结构程序设计方法由五个步骤组
26、成:结构程序设计方法由五个步骤组成:1)分析并确定输入数据和输出数据的逻辑结)分析并确定输入数据和输出数据的逻辑结构,并用构,并用Jackson图描绘这些数据结构;图描绘这些数据结构;2)找出输入数据结构和输出数据结构中有对)找出输入数据结构和输出数据结构中有对应关系的数据单元;应关系的数据单元; 3)用三条规则从描绘数据结构的)用三条规则从描绘数据结构的Jackson图图导出描绘程序结构的导出描绘程序结构的Jackson图:图: A为每对有对应关系的数据单元,按照它为每对有对应关系的数据单元,按照它们在数据结构图中的层次在程序结构图的相们在数据结构图中的层次在程序结构图的相应层次画一个处理框
27、;应层次画一个处理框; B根据输入数据结构中剩余的每个数据单元根据输入数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框;别为它们画上对应的处理框;C根据输出数据结构中剩余的每个数据单元根据输出数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框;别为它们画上对应的处理框;4)列出所有操作和条件(包括分支条件和循)列出所有操作和条件(包括分支条件和循环结束条件),并且把它们分配到程序结环结束条件),并且把它们分配到程序结构图的适当位置;构图的适当位置
28、;5)用伪码表示程序。)用伪码表示程序。顺序结构顺序结构:A seq B C DA end 与三种基本结构对应的伪码是:与三种基本结构对应的伪码是:选择结构选择结构A select cond1 BA or cond2 CA or cond3 DA end重复结构重复结构A iter until (或或while) cond BA end例例:一个正文文件由若干记录组成,每个记录:一个正文文件由若干记录组成,每个记录是一个字符串。是一个字符串。如:如:要求:要求:1)设计程序统计每个记录中空格字符的个数,)设计程序统计每个记录中空格字符的个数,输出数据的格式是,每读入一个记录(字符输出数据的格式
29、是,每读入一个记录(字符串)之后,另起一行打印出这个字符串及其串)之后,另起一行打印出这个字符串及其空格数;空格数;2)最后打印出文件中空格的总个数。)最后打印出文件中空格的总个数。 正文文件正文文件字符串字符串*字符字符*空格空格非空格非空格输出表格输出表格表格体表格体空格总数空格总数串信息串信息*字符串字符串空格数空格数IISI(a)输入数据结构输入数据结构(b)输出数据结构输出数据结构图图6.12 表示输入表示输入/输出数据结构的输出数据结构的Jackson图图 分析输入、输出数据结构,用分析输入、输出数据结构,用Jackson图描绘,并找出两者对应的数据单元:图描绘,并找出两者对应的数
30、据单元:统计空格统计空格程序体程序体印总数印总数处理字符串处理字符串*分析字符串分析字符串印空格数印空格数印字符串印字符串分析字符分析字符*处理空格处理空格处理非空格处理非空格IIS图图6.13 描绘统计空格程序结构的描绘统计空格程序结构的Jackson图图导出描绘程序结构的导出描绘程序结构的Jackson图:图:(1)停止)停止 (2)打开文件)打开文件(3)关闭文件)关闭文件 (4)印出字符串)印出字符串(5)印出空格数目)印出空格数目 (6)印出空格总数)印出空格总数(7)sum := sum +1 (8)totalsum := totalsum + sum(9)读入字符串读入字符串 (
31、10)sum := 0(11)totalsum : = 0 (12)pointer := 1(13)pointer := pointer + 1 I(1) 文件结束文件结束 I(2) 字符串结束字符串结束 S(3) 字符是空格字符是空格 列出所有操作和条件:列出所有操作和条件: 统计空格统计空格程序体程序体印总数印总数处理字符串处理字符串*分析字符串分析字符串印空格数印空格数印字符串印字符串分析字符分析字符*处理空格处理空格处理非空格处理非空格I(1)I(2)S(3)图图6.14 最终分配好操作和条件的最终分配好操作和条件的Jackson图图311192610124589713136.5 程序
32、复杂度的定量度量程序复杂度的定量度量 定量度量程序复杂度的作用:定量度量程序复杂度的作用: (1)可估算软件中错误的数量及软件开发工)可估算软件中错误的数量及软件开发工作量;作量; (2)度量的结果可用来比较不同设计或不同)度量的结果可用来比较不同设计或不同算法的优劣;算法的优劣; (3)程序的复杂度可作为模块规模的限度。)程序的复杂度可作为模块规模的限度。 1. 流图流图 “退化退化”的程序流程图,仅描绘程序的的程序流程图,仅描绘程序的控制流程,不表现对数据的具体操作及循控制流程,不表现对数据的具体操作及循环、选择的条件。环、选择的条件。6.5.1 McCabe方法方法一个圆代表一条或多条语
33、句;一个圆代表一条或多条语句;一个顺序结构可以合并成一个结点;一个顺序结构可以合并成一个结点;汇点也是结点;汇点也是结点;一个顺序处理框序列和一个判断框可一个顺序处理框序列和一个判断框可映射成一个结点。映射成一个结点。复合条件:复合条件: 包含了一个或包含了一个或多个布尔运算符多个布尔运算符(OR、AND、NOR等)。等)。 应把复合条件应把复合条件分解为简单条件,分解为简单条件,每个条件对应一每个条件对应一个结点。个结点。2. 计算环形复杂度的方法计算环形复杂度的方法 1)环形复杂度)环形复杂度 V(G)等于流图中的区域数;)等于流图中的区域数; 2)环形复杂度)环形复杂度 V(G)EN+2
34、,其中,其中E是流是流图中边的条数,图中边的条数,N是结点数;是结点数; 3)环形复杂度)环形复杂度 V(G)P1,其中,其中P为流图为流图中判定结点的数目。中判定结点的数目。例:计算下列程序图的程序复杂度例:计算下列程序图的程序复杂度解:解: 方法一:程序图把平面分为方法一:程序图把平面分为4个区域,程序复个区域,程序复杂度杂度V(G)4; 方法二:边的条数方法二:边的条数E11,结点数,结点数N9,程序,程序复杂度复杂度V(G)EN24 ; 方法三:判定结点为方法三:判定结点为1、2、4点,数目为点,数目为P3个,所以个,所以V(G)P14。3. 环形复杂度的用途环形复杂度的用途 对测试难
35、度的一种定量度量,也能对软件最终对测试难度的一种定量度量,也能对软件最终的可靠性给出某种预测。的可靠性给出某种预测。 实践表明,模块规模以实践表明,模块规模以V(G)10为宜。为宜。 根据程序中运算符和操作数的总数来度量程根据程序中运算符和操作数的总数来度量程序复杂度。序复杂度。 N = N1 + N2其中:其中:N定义为定义为程序长度程序长度; N1为程序中运算符出现的总次数;为程序中运算符出现的总次数; N2为操作数出现的总次数。为操作数出现的总次数。 6.5.2 Halstead方法方法Halstead给出预测程序长度的公式为:给出预测程序长度的公式为: H = n1log2n1 + n
36、2log2n2其中:其中:H定义为程序预测长度;定义为程序预测长度; n1为程序中使用的为程序中使用的不同运算符不同运算符(包括关(包括关键字)的个数;键字)的个数; n2为程序中使用的为程序中使用的不同操作数不同操作数(变量和(变量和常量)的个数。常量)的个数。 多次验证都表明,程序的预测长度多次验证都表明,程序的预测长度H和和实际程序长度实际程序长度N非常接近。非常接近。 Halstead还给出了预测程序中包含错还给出了预测程序中包含错误的个数的公式:误的个数的公式: E = N log2(n1+n2) / 3000 第第6章小结章小结 详细设计说明书详细设计说明书 着重描述每一模块是怎样
37、实现的,包括实现算法、着重描述每一模块是怎样实现的,包括实现算法、逻辑流程等。逻辑流程等。第7章:实现 编码和测试统称为实现。编码和测试统称为实现。编码:把软件设计结果翻译成程序。编码:把软件设计结果翻译成程序。测试:检测程序并改正错误的过程。测试:检测程序并改正错误的过程。计算机程序设计语言基本上可以分为两计算机程序设计语言基本上可以分为两大类:大类: 1. 汇编语言汇编语言; 2. 高级语言。高级语言。7.1 编码编码7.1.1 选择程序设计语言选择程序设计语言从应用特点看,高级语言可分为:从应用特点看,高级语言可分为:1)基础语言基础语言 如如BASIC、FORTRAN、COBOL、AL
38、GOL等等2)结构化语言结构化语言 如如ALGOL、PL/1、PASCAL、C、ADA等等 3)专用语言专用语言 如如APL、BLISS、FORTH、LISP、PROLOG等等选择一种编程语言的理论标准:选择一种编程语言的理论标准:1)有理想的模块化机制;)有理想的模块化机制;2)可读性好的控制结构和数据结构;)可读性好的控制结构和数据结构;3)便于调试和提高软件可靠性;)便于调试和提高软件可靠性;4)编译程序发现程序错误的能力强;)编译程序发现程序错误的能力强;5)有良好的独立编译机制。)有良好的独立编译机制。 选择语言时除了考虑理论上的标准,还必选择语言时除了考虑理论上的标准,还必须同时考
39、虑主要的实用标准:须同时考虑主要的实用标准: (1)系统用户要求)系统用户要求(2)可以使用的编译程序)可以使用的编译程序(3)可以得到的软件工具)可以得到的软件工具(4)工程规模)工程规模(5)程序员知识)程序员知识(6)软件可移植性要求)软件可移植性要求(7)软件的应用领域)软件的应用领域 1.程序内部的文档程序内部的文档 选取含义鲜明的名字,如果使用缩写,缩选取含义鲜明的名字,如果使用缩写,缩写规则要一致,并给每个名字加注释;写规则要一致,并给每个名字加注释; 通常在每个模块开始处要有一段注释,描通常在每个模块开始处要有一段注释,描述模块功能、算法、接口特点等;述模块功能、算法、接口特点
40、等; 程序清单布局应利用适当的阶梯形式,使程序清单布局应利用适当的阶梯形式,使程序的层次结构清晰明显。程序的层次结构清晰明显。 7.1.2 写程序的风格写程序的风格2.数据说明数据说明 数据说明的次序应该标准化,如按数据类型数据说明的次序应该标准化,如按数据类型确定说明的次序;确定说明的次序; 多个变量名在一个语句中说明时,应该按字多个变量名在一个语句中说明时,应该按字母顺序排列这些变量;母顺序排列这些变量; 如果设计时使用了复杂的数据结构,应该用如果设计时使用了复杂的数据结构,应该用注释说明实现该数据结构的方法和特点。注释说明实现该数据结构的方法和特点。 3.语句构造语句构造 4.输入输入/
41、输出输出 5.效率效率 A程序运行时间程序运行时间 B存储器效率存储器效率 C输入输入/输出效率输出效率程序设计工具实例:程序设计工具实例:Visual C运用运用Visual C+ 开发工具需要掌握:开发工具需要掌握: C语言特点、语法;语言特点、语法; Windows编程基础;编程基础; MFC相关知识;相关知识; Visual C集成开发工具环境的使用;集成开发工具环境的使用;一、一、C语言特点、语法:语言特点、语法: C+语言是在语言是在C语言的基础是扩展而成的,语言的基础是扩展而成的,两种语言的基本语法和语义是相同。两种语言的基本语法和语义是相同。C+中加入了面向对象程序设计(中加入
42、了面向对象程序设计(OOP)的特征:的特征: 封装性封装性:通过:通过“类类”把属性和函数组合在一起。把属性和函数组合在一起。继承性继承性:派生类可从先前定义的基类中继承函:派生类可从先前定义的基类中继承函数和属性。数和属性。多态性多态性:一个函数名,由不同的对象解释执行,:一个函数名,由不同的对象解释执行,可得到不同的执行效果。可得到不同的执行效果。二、二、Windows编程基础:编程基础:API: API是是Windows应用程序编程接口。应用程序编程接口。 API是一个程序内(或一组相关程序内)的一是一个程序内(或一组相关程序内)的一组函数调用,程序员用它创建其他程序。组函数调用,程序员
43、用它创建其他程序。 程序员不必知道函数内部,只要知道程序员不必知道函数内部,只要知道API的函的函数原型及返回值。数原型及返回值。 API的函数原型及返回值形式的函数原型及返回值形式可由相关的技术规范资料获得。可由相关的技术规范资料获得。 现在的现在的Win32 API中,核心部分依靠三个主中,核心部分依靠三个主要组件提供要组件提供Windows的大部分函数,这三个的大部分函数,这三个组件分别是:组件分别是: USER32.DLL; GDI32.DLL; KERNEL32.DLL。 Windows消息机制消息机制:1)基于消息的事件驱动)基于消息的事件驱动 消息可以是由硬件发来的(存于系统队列
44、)消息可以是由硬件发来的(存于系统队列),也可以由也可以由Windows系统和应用程序发来(存于系统和应用程序发来(存于程序队列中);程序队列中); 每一个每一个Windows程序在不停的捕捉各种消息程序在不停的捕捉各种消息,并进行处理;并进行处理; 每个窗口都必须有一个窗口函数,来负责消每个窗口都必须有一个窗口函数,来负责消息的判断与处理。息的判断与处理。 2)窗口函数对消息的处理)窗口函数对消息的处理 窗口函数是一个回调函数,可以处理收到的窗口函数是一个回调函数,可以处理收到的消息,在程序中不需要用户显式调用。消息,在程序中不需要用户显式调用。 该窗口函数的形式通常为:该窗口函数的形式通常为:WndProc(),每个每个窗口类必须在初始化时指定一个窗口函数。窗口类必须在初始化时指定一个窗口函数。