1、n采用自顶向下、逐步求精的程序设计方法采用自顶向下、逐步求精的程序设计方法n使用三种基本控制结构构造程序使用三种基本控制结构构造程序 (顺序、选择、重复)(顺序、选择、重复)n主程序员的组织形式主程序员的组织形式 结构化程序设计技术是一种设计程序的技结构化程序设计技术是一种设计程序的技术,它采用自顶向下逐步求精的设计方法术,它采用自顶向下逐步求精的设计方法和单入口单出口的控制结构,并且只包含和单入口单出口的控制结构,并且只包含顺序、选择和循环三种控制结构。顺序、选择和循环三种控制结构。n使用结构程序设计技术的好处:使用结构程序设计技术的好处:n1)提高软件开发工程的成功率和生产率;)提高软件开
2、发工程的成功率和生产率;n2)系统有清晰的层次结构,容易阅读理解;)系统有清晰的层次结构,容易阅读理解;n3)单入口单出口的控制结构,容易诊断纠正;)单入口单出口的控制结构,容易诊断纠正;n4)模块化可以使得软件可以重用;)模块化可以使得软件可以重用;n5)程序逻辑结构清晰,有利于程序正确性)程序逻辑结构清晰,有利于程序正确性证明证明 n经典的结构程序设计经典的结构程序设计:只允许使用顺序、:只允许使用顺序、IF_THEN_ELSE选择和选择和DO_WHILE循环;循环;扩展的结构程序设计扩展的结构程序设计:除了三种基本控制结构,:除了三种基本控制结构,还使用还使用DO_CASE和和DO_UN
3、TIL循环;循环;修正的结构程序设计:修正的结构程序设计:除了三种基本控制结构除了三种基本控制结构和两种扩充结构,还使用和两种扩充结构,还使用BREAK等结构。等结构。n是最为熟悉、应用最为广泛的算法表是最为熟悉、应用最为广泛的算法表示工具、可以比较好的描绘出算法思示工具、可以比较好的描绘出算法思路。路。A B(a)顺序结构(b)选择结构 B exp A F T exp A T F exp A F T(c)循环结构 或 DO CASE I(a)DO_UNTIL型循环结构 exp A F T CASE 1 CASE 2 CASE n (b)DO_CASE型多分支结构 起止端点 数据 处理 准备或
4、预处理 预先定义的处理 条件判断 循环上界限 循环下界限 文档 流线 虚线 省略符 并行方式 注释 书上实例书上实例p187n程序流程图虽然比较直观,灵活,并且比程序流程图虽然比较直观,灵活,并且比较容易掌握,但是它的随意性和灵活性却较容易掌握,但是它的随意性和灵活性却使它不可避免地存在着一些缺点:使它不可避免地存在着一些缺点:(1)由于程序流程图的特点,它本身并不)由于程序流程图的特点,它本身并不是逐步求精的好工具。因为它使程序员容是逐步求精的好工具。因为它使程序员容易过早地考虑程序的具体控制流程,而忽易过早地考虑程序的具体控制流程,而忽略了程序的全局结构;略了程序的全局结构;(2)程序流程
5、图中用箭头代表控制流,这)程序流程图中用箭头代表控制流,这样使得程序员不受任何约束,可以完全不样使得程序员不受任何约束,可以完全不顾结构程序设计的精神,随意转移控制;顾结构程序设计的精神,随意转移控制;(3)程序流程图在表示数据结构方面存在)程序流程图在表示数据结构方面存在不足。不足。nN-S图是由图是由Nassi和和Shneiderman提出提出的一种符合结构化程序设计原则的图的一种符合结构化程序设计原则的图形描述工具。也叫盒图。形描述工具。也叫盒图。值 1 Case1 部分 Case条件 第一个任务 第二个任务 第三个任务(a)顺序结构 F 条件 T ELSE 部分 THEN 部分(b)选
6、择结构(c)多分支结构 循环条件 DO_WHILE 部分 循环条件 DO_UNTIL 部分(d)循环结构 A(e)调用子程序 A 值 2 Case2 部分 值 n Casen 部分(1)功能域(即某一个特定控制结构的作用域)功能域(即某一个特定控制结构的作用域)有明确的规定,并且可以很直观地从有明确的规定,并且可以很直观地从N-S图上看图上看出来;出来;(2)它的控制转移不能任意规定,必须遵守结构)它的控制转移不能任意规定,必须遵守结构化程序设计的要求;化程序设计的要求;(3)很容易确定局部数据和全局数据的作用域;)很容易确定局部数据和全局数据的作用域;(4)很容易表现嵌套关系,也可以表示模块
7、的层)很容易表现嵌套关系,也可以表示模块的层次结构。次结构。N-S图与流程图的相互转换?图与流程图的相互转换?书上实例书上实例p190nPAD图是日本日立公司提出,由程序图是日本日立公司提出,由程序流程图演化来的,用结构化程序设计流程图演化来的,用结构化程序设计思想表现程序逻辑结构的图形工具。思想表现程序逻辑结构的图形工具。为为ISO认可。认可。A B(a)顺序结构 A B P(b)选择结构 WHILE P S(c)WHILE型循环结构 UNTIL P S(d)UNTIL型循环结构 A1 A2 P=An P1 P2 Pn(e)多分支结构(f)语句标号(g)定义 A C B1 B2 P1 WHI
8、LE P3 C4 C def C1 C2 C3 P2 PAD图的例子 nPAD图的实例见图的实例见p191页页n特点特点:结构清晰结构清晰,支持结构化的程序设支持结构化的程序设计方法计方法,有利于自动生成程序。有利于自动生成程序。n 输入三个正整数作为边长,判断该三条边输入三个正整数作为边长,判断该三条边构成的三角形是等边、等腰还是一般三角构成的三角形是等边、等腰还是一般三角形。请画出该程序的流程图、形。请画出该程序的流程图、N-S图、图、PAD图。图。n n n n在数据A(1)A(n)中求最大数和次大数.。n在数据A(1)A(n)中求前m个最大的数。n当算法中包含多重条件选择时,用程当算法
9、中包含多重条件选择时,用程序流程图、序流程图、N-S图或图或PAD都不能清晰都不能清晰地描述。用判定表确可以清晰表达复地描述。用判定表确可以清晰表达复杂条件与应做动作之间的关系。杂条件与应做动作之间的关系。12345教授 TFFF副教授 FTFF讲师 FFTF助教 FFFT讲座TFFFF50 30 25 20 15 例:某校制定了教师的讲课课时津贴标准。对于各种性质的讲座,无论教师是什么职称,每课时津贴费一律是50元;而对于一般的授课,则根据教师的职称来决定每课时津贴费:教授30元,副教授25元,讲师20元,助教15元。n一张判定表由四部分组成,左上部列出所一张判定表由四部分组成,左上部列出所
10、有条件,左下部是所有可能的动作,右上有条件,左下部是所有可能的动作,右上部是表示各种条件组合的一个矩阵,右下部是表示各种条件组合的一个矩阵,右下部是和每种条件组合相对应的动作部是和每种条件组合相对应的动作.n某航空公司规定,某航空公司规定,重量不超过重量不超过30公斤的行公斤的行李可免费托运。重量超过李可免费托运。重量超过30公斤时,对超公斤时,对超运部分,头等舱国内乘客收运部分,头等舱国内乘客收4元元/公斤;其它公斤;其它舱位国内乘客收舱位国内乘客收6元元/公斤;外国乘客收费为公斤;外国乘客收费为国内乘客的国内乘客的2倍;残疾乘客的收费为正常乘倍;残疾乘客的收费为正常乘客的客的1/2。123
11、456789国内乘客国内乘客T T T T FFFF头等舱头等舱T F T F T F T F残疾乘客残疾乘客FF T T FF T T行李重量行李重量 W 30T FFFFFFFF免费免费(W-30)2(W-30)3(W-30)4 (W-30)6 (W-30)8(W-30)12 用判定表表示计算行李费的算法用判定表表示计算行李费的算法nPDL是一种用于描述功能模块的算法设计是一种用于描述功能模块的算法设计和加工细则的语言。它是一种伪码。和加工细则的语言。它是一种伪码。nPDL不同于一般的不同于一般的“结构化语言结构化语言”。PDL更接近于自然语言,容易看懂。更接近于自然语言,容易看懂。nPD
12、L语言具有下述特点:语言具有下述特点:(1)PDL虽然不是程序设计语言,但是它与高级程序设计虽然不是程序设计语言,但是它与高级程序设计语言非常类似,只要对语言非常类似,只要对PDL描述稍加变换就可变成源程序描述稍加变换就可变成源程序代码。因此,它是详细设计阶段很受欢迎的表达工具。代码。因此,它是详细设计阶段很受欢迎的表达工具。(2)用)用PDL写出的程序,既可以很抽象,又可以很具体。写出的程序,既可以很抽象,又可以很具体。因此,容易实现自顶向下逐步求精的设计原则。因此,容易实现自顶向下逐步求精的设计原则。(3)PDL描述同自然语言很接近,易于理解。描述同自然语言很接近,易于理解。(4)PDL描
13、述可以直接作为注释插在源程序中,成为程序描述可以直接作为注释插在源程序中,成为程序的内部文档。这对提高程序的可读性是非常有益的。的内部文档。这对提高程序的可读性是非常有益的。(5)PDL描述与程序结构相似,因此自动产生程序比较容描述与程序结构相似,因此自动产生程序比较容易。易。nPDL的缺点是不如图形描述形象直观的缺点是不如图形描述形象直观n定量度量程序复杂度的作用:定量度量程序复杂度的作用:n (1)可估算软件中错误的数量及软件开发工作量;)可估算软件中错误的数量及软件开发工作量;n (2)度量的结果可用来比较不同设计或不同算法的优劣;)度量的结果可用来比较不同设计或不同算法的优劣;n (3
14、)程序的复杂度可作为模块规模的限度。)程序的复杂度可作为模块规模的限度。n 流图流图n“退化退化”的程序流程图,仅描绘程的程序流程图,仅描绘程序的控制流程,不表现对数据的具体序的控制流程,不表现对数据的具体操作及循环、选择的条件。操作及循环、选择的条件。1.McCabe方法方法一个圆代表一条或多条语句;一个圆代表一条或多条语句;一个顺序结构可以合并成一个结点;一个顺序结构可以合并成一个结点;汇点也是结点;汇点也是结点;一个顺序处理框序列和一个判断框可一个顺序处理框序列和一个判断框可映射成一个结点。映射成一个结点。复合条件:复合条件:包含了一个或包含了一个或多个布尔运算符多个布尔运算符(OR、A
15、ND、NOR等)。等)。应把复合条件应把复合条件分解为简单条件,分解为简单条件,每个条件对应一每个条件对应一个结点。个结点。计算环形复杂度的方法计算环形复杂度的方法:1)环形复杂度)环形复杂度 V(G)等于流图中的区域数;)等于流图中的区域数;2)环形复杂度)环形复杂度 V(G)EN+2,其中,其中E是流图中边的条是流图中边的条数,数,N是结点数;是结点数;3)环形复杂度)环形复杂度 V(G)P1,其中,其中P为流图中判定结点为流图中判定结点的数目。的数目。n例:计算下列程序图的程序复杂度例:计算下列程序图的程序复杂度n解:解:n 方法一:程序图把平面分为方法一:程序图把平面分为4个区域,程序
16、复杂度个区域,程序复杂度V(G)4;n 方法二:边的条数方法二:边的条数E11,结点数,结点数N9,程序复杂度,程序复杂度V(G)EN24;n 方法三:判定结点为方法三:判定结点为1、2、4点,数目为点,数目为P3个,所以个,所以V(G)P14。n环形复杂度的用途环形复杂度的用途 对测试难度的一种定量度量,也能对软件最终的可靠性给对测试难度的一种定量度量,也能对软件最终的可靠性给出某种预测。出某种预测。实践表明,模块规模以实践表明,模块规模以V(G)10为宜。为宜。根据程序中运算符和操作数的总数来度量程序根据程序中运算符和操作数的总数来度量程序复杂度。复杂度。N=N1+N2其中:其中:N定义为
17、定义为程序长度程序长度;N1为程序中运算符出现的总次数;为程序中运算符出现的总次数;N2为操作数出现的总次数。为操作数出现的总次数。2.Halstead方法方法nHalstead给出预测程序长度的公式为:给出预测程序长度的公式为:n H=n1log2n1+n2log2n2n其中:其中:H定义为程序预测长度;定义为程序预测长度;n n1为程序中使用的为程序中使用的不同运算符不同运算符(包括关键字)的个数;(包括关键字)的个数;n n2为程序中使用的为程序中使用的不同操作数不同操作数(变量和常量)的个数。(变量和常量)的个数。n验证表明,程序的预测长度验证表明,程序的预测长度H和实际程序长度和实际程序长度N非常接近。非常接近。n Halstead给出了预测程序中包含错误的个给出了预测程序中包含错误的个数的公式:数的公式:n E=N log2(n1+n2)/3000