【教学课件】第七章详细设计.ppt
详细设计,一、结构化程序设计思想1.结构化程序设计的提出Dijkstra在1965年召开的IFIP国际信息处理联合会议上提出将GOTO语句取消。1968年ACM美国计算机协会发表了Dijkstra一篇文章:GOTO 语句有害论,并提出了3种基本控制结构。,2.什么是结构程序设计结构程序设计是一种设计程序的技术,它采用自顶向下逐步求精的设计方法和单入口单出口的控制结构。它包括顺序、条件和重复三种基本控制结构。,三种基本的控制结构,其他常用的控制结构,2.逐步求精的含义详细设计阶段逐步求精的含义:把一个模块的功能逐步分解细化为一系列具体的处理步骤或某种高级语言的语句。总体设计阶段逐步求精的含义:把一个复杂问题的解法分解和细化成一个由许多模块组成的层次结构的软件系统。,3.结构程序设计技术的优越性(1)自顶向下逐步求精的方法符合人类解决复杂问题的普遍规律,因此可以显著提高软件开发工程的成功率和生产率。(2)用先全局后局部、先整体后细节、先抽象后具体的逐步求精过程开发出的程序有清晰的层次结构,因此容易阅读和理解。(3)不使用GO TO语句仅使用单入口单出口的控制结构,使得程序的静态结构和它的动态执行情况比较一致,易于阅读和理解。,(4)控制结构有确定的逻辑模式,编写程序代码只限于很少几种直截了当的方式,因此源程序清晰流畅。(5)程序清晰和模块化使得在修改和重新设计一个软件时可以重用的代码量最大。(6)程序的逻辑结构清晰,有利于程序正确性证明。,一、图形设计表示法1.程序流程图2.盒图(NS图)3.PAD图4.程序设计语言PDL,详细设计工具,1.程序流程图(1)程序流程图又称为程序框图,是早期软件设计的主要工具。(2)优点:对控制流程的描绘很直观,便于初学者掌握。结构清晰,可读性、可测试性和可维护性好。,程序流程图,(3)缺点:程序流程图本质上不是逐步求精的好工具,它诱使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构。程序流程图中用箭头代表控制流,因此程序员不受约束,可以完全不顾结构程序设计的精神,随意转移控制。程序流程图不易表示数据结构。,Case条件,(Repeat-until),示例,程序流程图的标准符号,循环的标准符号 注解的使用,多出口判断,N-S图,2.盒图(N-S图)盒图由Nassi和Shneiderman提出,又称为N-S图,它有以下特点:(1)功能域(即一个特定控制结构的作用域)明确,很容易从盒图上看出。(2)不可能任意转移控制(3)很容易确定局部和全程数据的作用域(4)很容易表现嵌套关系,也可以表示模块的层次结构(5)盒图没有箭头,不可以随意转移控制,不允许违背程序设计的原则。,N-S图,N-S图也叫做盒图。五种基本控制结构由五种图形构件表示。,N-S图的嵌套定义形式,X8,X6,X7,Casei=2,3,4,X3 X4,Case i=2,3,4,X3,X4,X2,d,e,c,X5,与a图等价的流程图,练习:写出下列伪码的盒图Start If P then while Q do F Enddo else block G N end blockEndifstop,P,Q,F,G,N,复习,图形设计表示法 1.程序流程图 2.盒图,PAD图,3.PAD图PAD图由日本日立公司在1973年发明,它是一种用于过程设计的表达式,它综合了流程图、盒图、Warnier图和伪码等技术的一些特点,在Pascal语言基础上发展起来的。它用二维树型结构的图来表示程序的控制流,比较容易翻译成程序代码。,生成PAD图的步骤:第一步要从系统设计的一种粗略、模糊概念出发,将过程描述为过程顺序部分的表示、重复部分的表示和选择部分的表示。重复以上步骤,直到过程完全确定和详尽为止。,头脑中粗略模糊问题解的概念,顺序过程的细化循环过程的细化选择过程的细化,模糊,模糊,模糊,模糊,模糊,模糊,模糊,模糊,模糊,模糊,前处理,后处理,选择处理,PAD图的基本符号及其说明,PAD也设置了五种基本控制结构的图式,并允许递归使用。,PAD图转换为相应源程序的步骤:根据问题解画出PAD图;把PAD图看作横向生长的树,沿着树向前进,写出源程序。写源程序时的原则:遇处理框和子程序框直接写出其处理内容遇选择框或重复框按照表4-2所示的语言模式写出相应的语句,PAD图的基本图示和C语言的标准模式(表4.2),(Q),(Q),表4.2(续表),(Q),H,(Q),H,PAD图转换为C语言源程序的实例,例1,边长为x,y,z的三角形面积公式为:P=S(S-x)(S-y)(S-z)其中 S=(x+y+z)/2 现有三个三角形,它们的边长分别为a1,b1,c1;a2,b2,c2;a3,b3,c3,求这三个三角形面积之和。,/*file:y9-9,c*/,#include“stdio.h”,Main(),Float p();,Float a1,b1,c1,a2,b2,c2,a3,b3,c3,sum;,Scanf(“%f%f%f%f%f%f%f%f%f”,ab,/*file:y9-9,c*/,#include“stdio.h”,Main(),Float p();,Float a1,b1,c1,a2,b2,c2,a3,b3,c3,sum;,Scanf(“%f%f%f%f%f%f%f%f%f”,&a1,&b1,&c1,&a2,&b2,&c2,&a3,&b3,&c3,);,Extern float sqrt();,Printf(%f”,sum);,Float(p(x,y,z),Float x,y,z;,Sum=p(a1,b1,c1)+p(a2,b2,c2)+p(a3,b3,c31);,ab,Extern float sqrt();,Printf(%f”,sum);,Float(p(x,y,z),Float x,y,z;,Sum=p(a1,b1,c1)+p(a2,b2,c2)+p(a3,b3,c3);,cd,Return(s1);,Float s,s1;,S=(x+y+z)/2;,S1=sqrt(s*(s-x)*(s-y)*(s-z);,cd,Return(s1);,Float s,s1;,S=(x+y+z)/2;,S1=sqrt(s*(s-x)*(s-y)*(s-z);,/*file:y9-9,c*/,#include“stdio.h”,Main(),Float p();,Float a1,b1,c1,a2,b2,c2,a3,b3,c3,sum;,Scanf(“%f%f%f%f%f%f%f%f%f”,&a1,&b1,&c1,&a2,&b2,&c2,&a3,&b3,&c3,);,Extern float sqrt();,Printf(%f”,sum);,Float(p(x,y,z),Float x,y,z;,Sum=p(a1,b1,c1)+p(a2,b2,c2)+p(a3,b3,c3);,Return(s1);,Float s,s1;,S=(x+y+z)/2;,S1=sqrt(s*(s-x)*(s-y)*(s-z);,输入数据:3 4 5 3 4 5 3 4 5 三个三角形面积之和:18.000000,例2,打印1968年出生的学生人数,并统计全班男女学生各有多少。,/*file:10-38,c*/,#include“stdio.h”,#define Bsize 128,main();,Struct student,ab,Char sex,*name;,/*file:10-38,c*/,#include“stdio.h”,#define Bsize 128,main();,Struct student,Char sex,*name;,Int birthyear;,Class5;,Char bfbsize+2,*fp3;,Int i;,Int count68=0,countm=0,countf=0;,cd,Printf(“name,sex(m,f),birth yearn”);,ab,Int birthyear;,Class5;,Char bfbsize+2,*fp3;,Int i;,Int count68=0,countm=0,countf=0;,Printf(“name,sex(m,f),birth yearn”);,cd,(I=0,I5,I+),gh,Basicget(stdin,bf,bsize,fp,3),Classi.name=fp0;,Classi.sex=*fp1;,Classi.birthyear=atio(fp2);,ef,(Classi.birthyear=1968),+count68;,For(I=0,I5,I+),Basicget(stdin,bf,bsize,fp,3),Classi.name=fp0;,Classi.sex=*fp1;,Classi.birthyear=atio(fp2);,If(Classi.birthyear=1968),+count68;,将字符串表示的数据化为整数,读入记录类型的数据,ef,gh,(Classi.sex)=m),+countm;,+countf;,Printf(“male:%dn”,countm);,Printf(“female:%dn”,countf);,Printf(“birthyear=1968%dn”,count68);,If(Classi.sex)=m),+countm;,+countf;,else,Printf(“male:%dn”,countm);,Printf(“female:%dn”,countf);,Printf(“birthyear=1968%dn”,count68);,/*file:10-38,c*/,#include“stdio.h”,#define Bsize 128,main();,Struct student,Char sex,*name;,Int birthyear;,Class5;,Char bfbsize+2,*fp3;,Int i;,Int count68=0,countm=0,countf=0;,Printf(“name,sex(m,f),birthyearn”);,For(I=0,I5,I+),Basicget(stdin,bf,bsize,fp,3),Classi.name=fp0;,Classi.sex=*fp1;,Classi.birthyear=atio(fp2);,If(Classi.birthyear=1968),+count68;,If(Classi.sex)=m),+countm;,+countf;,else,Printf(“male:%dn”,countm);,Printf(“female:%dn”,countf);,Printf(“birthyear=1968%dn”,count68);,+count68;,Name,sex(m,f),birthyear李娜,f,1965张立,m,1968丹妮,f,1968王丽丽,f,1967孙晓嫚,f,1968Male:1Female:4Birthyear=1968:3,PAD图,主要特点:(1)使用PAD图设计的程序必然是结构化程序(2)PAD图描绘的程序结构十分清晰(3)用PAD图表现程序逻辑,易读、易懂、易记(4)容易将PAD图转换成高级语言源程序(5)PAD图既可用于表示程序逻辑,也可用于描绘数据结构(6)PAD图的符号支持自顶向下、逐步求精方法的使用(7)PAD图面向高级语言,PDL,PDL是一种用于描述功能模块的算法设计和加工细节的语言。称为设计程序用语言。它是一种伪码。伪码的语法规则分为“外语法”和“内语法”。PDL具有严格的关键字外语法,用于定义控制结构和数据结构,同时它的表示实际操作和条件的内语法又是灵活自由的,可使用自然语言的词汇。,PDL的特点,提供全部结构化控制结构、数据说明和模块特征。能对PDL正文进行结构分割,使之变得易于理解。为了区别关键字,规定关键字一律大写,其它单词一律小写。或者规定关键字加下划线,或者规定它们为黑体字。,内语法使用自然语言来描述处理特性。内语法比较灵活,只要写清楚就可以,不必考虑语法错,以利于人们可把主要精力放在描述算法的逻辑上。有数据说明机制,包括简单的(如标量和数组)与复杂的(如链表和层次结构)的数据结构。有子程序定义与调用机制,用以表达各种方式的接口说明。,示例:拼词检查程序,PROCEDURE spellcheck IS BEGIN split document into single words look up words in dictionary display words which are not in dictionary create a new dictionary END spellcheck,使用PDL语言,逐步求精:,PROCEDURE spellcheckBEGIN-*split document into single wordsLOOP get next word add word to word list in sortorder EXIT WHEN all words processedEND LOOP-*look up words in dictionaryLOOP get word from word list,IF word not in dictionary THEN-*display words not in dictionary display word prompt on user terminal IF user response says word OK THEN add word to good word list ELSE add word to bad word list ENDIF ENDIF EXIT WHEN all words processedEND LOOP,-*create a new words dictionary dictionary:merge dictionary and good word listEND spellcheck,二、表格设计表示法,1.判定表判定表能够清晰地表示复杂的条件组合与应做的动作之间的对应关系,而其它的工具不易表示。一张判定表由四部分组成,左上部列出所有条件,左下部是所有可能做的动作,右上部是表示各种条件组合的一个矩阵,右下部是和每种条件组合相对应的动作。判定表的每一列实质上是一条规则,规定了与特定的条件组合相对应的动作。,田,建立判定表的步骤:(1)列出与一个特定过程有关的所有动作;(2)列出该过程执行时的所有条件;(3)把特定的条件组合和特定的动作联系起来,去掉不可能的条件组合,开发每一个可能的条件组合;(4)根据第(3)步表明每个条件发生的动作,定义处理规则。,田,例:某校制定了教师的讲课课时津贴标准。对于各种性质的讲座,无论教师是什么职称,每课时津贴费一律是50元;而对于一般的授课,则根据教师的职称来决定每课时津贴费:教授30元,副教授25元,讲师20元,助教15元。,判定树,2.判定树判定树是判定表的变种,也能清晰地表示复杂的条件组合与应做的动作之间的对应关系。优点:形式简单,不需任何说明,易看出含义,易于掌握和使用。缺点:简洁性不如判定表,相同的数据元素往往要重复写多遍,而且越接近树的叶端重复次数越多。,教师课时津贴判定树,一个判定表和判定树的例子,例子 假设某航空公司规定,乘客可以免费托运重量不超过30公斤的行李。当行李重量 超过30公斤时,对头等舱的国内乘客超重部分每公斤收费 4 元,对其它舱的国内 乘客超重部分每公斤收费 6 元,对外国乘客超重部分每公斤收费比国内乘客多一 倍,对残疾乘客超重部分每公斤收费比正常乘客少一半。用判定表来表示与上述 每种条件组合相对应的动作。,所有条件,条件组合矩阵,与每种条件组合所对应的动作表,所有可能的动作列表,国内乘客,头 等 舱,残疾乘客,行李30kg,免费,(W-30)*2,(W-30)*3,(W-30)*4,(W-30)*6,(W-30)*8,(W-30)*12,T,T,T,F,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,判定表,判定树,行李费算 法,行李重量 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,行李重量 W30,免费,练习:如果金额超过1000元又未过期,则发出批准单和提货单。如果金额超过2000元,但已经过期,则不发出批准单和提货单。如果金额低于2000元,则不论是否过期,都发出批准单和提货单,而且对低于2000元已经过期的还需发出通知单。,判定表,判定树,检查订货单,过期,不过期,1000金额2000,金额2000,金额2000,发提货单、批准单,发通知单、提货单、批准单,不发,小结,重点难点:熟练掌握程序流程图、盒图、PAD图区分程序流程图、PAD图和数据流程图中的符号表示熟练掌握判定表和判定树以及它们之间的转换关系,