您好,欢迎访问三七文档
结构化程序设计程序设计风格程序效率程序复杂性度量做为软件工程过程的一个阶段,程序编码是设计的继续。程序设计语言的特性和程序设计风格会深刻地影响软件的质量和可维护性。为了保证程序编码的质量,程序员必须深刻理解、熟练掌握并正确地运用程序设计语言的特性。此外,还要求源程序具有良好的结构性和良好的程序设计风格。结构化程序设计结构化程序设计主要包括两方面:在编写程序时,强调使用几种基本控制结构,通过组合嵌套,形成程序的控制结构。尽可能避免使用GOTO语句。在程序设计过程中,尽量采用自顶向下和逐步细化的原则,由粗到细,一步步展开。结构化程序设计的主要原则使用语言中的顺序、选择、重复等有限的基本控制结构表示程序逻辑。选用的控制结构只准许有一个入口和一个出口。程序语句组成容易识别的块,每块只有一个入口和一个出口。复杂结构应该用基本控制结构进行组合嵌套来实现。语言中没有的控制结构,可用一段等价的程序段模拟,但要求该程序段在整个系统中应前后一致。严格控制GOTO语句,仅在下列情形才可使用:①用一个非结构化的程序设计语言去实现一个结构化的构造。②若不使用GOTO语句就会使程序功能模糊。③在某种可以改善而不是损害程序可读性的情况下。例1打印A,B,C三数中最小者程序程序1if(AB)goto120;if(BC)goto110;100write(C);goto140;110write(B);goto140;120if(AC)goto130;goto100;130write(A);140end程序2if(AB)and(AC)thenwrite(A)elseif(AB)and(BC)thenwrite(B)elsewrite(C)endifendif例2用二分法求方程f(x)=0在区间[a..b]中的根的程序假设在闭区间[a..b]上函数f(x)有唯一的一个零点f0=f(a);f1=f(b);//程序1if(f0*f1=0){x0=a;x1=b;for(i=1;i=n;i++){xm=(x0+x1)/2;fm=f(xm);if(abs(fm)eps||abs(x1-x0)eps)gotofinish;if(f0*fm0){x0=xm;f0=fm;}elsex1=xm;}finish:printf(“\nTherootofthisequationis%d\n”,xm);}单入口,两出口正常出口是循环达到n次,非正常出口是循环中途控制转出到标号finish所在位置可读性好f0=f(a);f1=f(b);//程序2if(f0*f1=0){x0=a;x1=b;for(i=1;i=n;i++){xm=(x0+x1)/2;fm=f(xm);if(abs(fm)<eps||abs(x1-x0)<eps)break;if(f0*fm>0){x0=xm;f0=fm;}elsex1=xm;}}f0=f(a);f1=f(b);//程序3if(f0*f1=0){x0=a;x1=b;i=1;finished=0;while(i=n&&finished==0){xm=(x0+x1)/2;fm=f(xm);if(abs(fm)<eps||abs(x1-x0)<eps)finished=1;if(finished==0)if(f0*fm>0){x0=xm;f0=fm;}elsex1=xm;}}引入布尔变量finished,改for型循环为while型,将单入口多出口结构改为单入口单出口结构。自顶向下,逐步求精在详细设计和编码阶段,应当采取自顶向下,逐步求精的方法。把一个模块的功能逐步分解,细化为一系列具体的步骤,进而翻译成一系列用某种程序设计语言写成的程序。例,用筛选法求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*/for(i=2;i=100;i++)A[i]=i;/*建立2到10的素数表B[],其中存放2到10以内的素数*/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[]中剔除;-----3.1/*输出A[]中所有没有被剔除的数*/for(i=2;i=100;i++)若A[i]没有被剔除,则输出之---4.1}对框架中的局部再做细化,得到整个程序。main(){/*建立2到100的数组A[],其中A[i]=i*/for(i=2;i=100;i++)A[i]=i;/*建立2到10的素数表B[],其中存放2到10以内的素数*/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]没有被剔除,则输出之*/if(A[i]!=0)printf(“A[%d]=%d\n”,I,A[i]);}自顶向下,逐步求精方法的优点符合人们解决复杂问题的普遍规律。可提高软件开发的成功率和生产率用先全局后局部,先整体后细节,先抽象后具体的逐步求精的过程开发出来的程序具有清晰的层次结构,程序容易阅读和理解程序自顶向下,逐步细化,分解成一个树形结构。在同一层的节点上的细化工作相互独立。有利于编码、测试和集成每一步工作仅在上层节点的基础上做不多的设计扩展,便于检查有利于设计的分工和组织工作。程序设计风格程序实际上也是一种供人阅读的文章,有一个文章的风格问题。应该使程序具有良好的风格。源程序文档化数据说明语句结构输入/输出方法源程序文档化标识符的命名安排注释程序的视觉组织符号名的命名符号名即标识符,包括模块名、变量名、常量名、标号名、子程序名、、数据区名以及缓冲区名等。这些名字应能反映它所代表的实际东西,应有一定实际意义。例如,表示次数的量用Times,表示总量的用Total,表示平均值的用Average,表示和的量用Sum等。名字不是越长越好,应当选择精炼的意义明确的名字。必要时可使用缩写名字,但这时要注意缩写规则要一致,并且要给每一个名字加注释。同时,在一个程序中,一个变量只应用于一种用途。NEW.BALANCE.ACCOUNTS.PAYABLENBALAPN程序的注释夹在程序中的注释是程序员与日后的程序读者之间通信的重要手段。注释决不是可有可无的。一些正规的程序文本中,注释行的数量占到整个源程序的1/3到1/2,甚至更多。注释分为序言性注释和功能性注释。序言性注释通常置于每个程序模块的开头部分,它应当给出程序的整体说明,对于理解程序本身具有引导作用。有些软件开发部门对序言性注释做了明确而严格的规定,要求程序编制者逐项列出。有关项目包括:程序标题;有关本模块功能和目的的说明;主要算法;接口说明:包括调用形式,参数描述,子程序清单;有关数据描述:重要的变量及其用途,约束或限制条件,以及其它有关信息;模块位置:在哪一个源文件中,或隶属于哪一个软件包;开发简历:模块设计者,复审者,复审日期,修改日期及有关说明等。功能性注释功能性注释嵌在源程序体中,用以描述其后的语句或程序段是在做什么工作,或是执行了下面的语句会怎么样。而不要解释下面怎么做。例如,/*ADDAMOUNTTOTOTAL*/TOTAL=AMOUNT+TOTAL不好。如果注明把月销售额计入年度总额,便使读者理解了下面语句的意图:/*ADDMONTHLY-SALESTOANNUAL-TOTAL*/TOTAL=AMOUNT+TOTAL要点描述一段程序,而不是每一个语句;用缩进和空行,使程序与注释容易区别;注释要正确。视觉组织空格、空行和移行恰当地利用空格,可以突出运算的优先性,避免发生运算的错误。例如,将表达式(A<-17)ANDNOT(B<=49)ORC写成(A<-17)ANDNOT(B<=49)ORC自然的程序段之间可用空行隔开;移行也叫做向右缩格。它是指程序中的各行不必都在左端对齐,都从第一格起排列。这样做使程序完全分不清层次关系。对于选择语句和循环语句,把其中的程序段语句向右做阶梯式移行。使程序的逻辑结构更加清晰。例如,两重选择结构嵌套,写成下面的移行形式,层次就清楚得多。IF(…)THENIF(…)THEN……ELSE……ENDIF……ELSE……ENDIF数据说明在设计阶段已经确定了数据结构的组织及其复杂性。在编写程序时,则需要注意数据说明的风格。为了使程序中数据说明更易于理解和维护,必须注意以下几点。1.数据说明的次序应当规范化2.说明语句中变量安排有序化3.使用注释说明复杂数据结构数据说明的次序应当规范化数据说明次序规范化,使数据属性容易查找,也有利于测试,排错和维护。原则上,数据说明的次序与语法无关,其次序是任意的。但出于阅读、理解和维护的需要,最好使其规范化,使说明的先后次序固定。例如,在FORTRAN程序中数据说明次序①常量说明②简单变量类型说明③数组说明④公用数据块说明⑤所有的文件说明在类型说明中还可进一步要求。例如,可按如下顺序排列:①整型量说明②实型量说明③字符量说明④逻辑量说明说明语句中变量安排有序化当多个变量名在一个说明语句中说明时,应当对这些变量按字母的顺序排列。带标号的全程数据(如FORTRAN的公用块)也应当按字母的顺序排列。例如,把integersize,length,width,cost,price写成integercost,length,price,size,width使用注释说明复杂数据结构如果设计了一个复杂的数据结构,应当使用注释来说明在程序实现时这个数据结构的固有特点。例如,对PL/1的链表结构和Pascal中用户自定义的数据类型,都应当在注释中做必要的补充说明。语句结构在设计阶段确定了软件的逻辑流结构,但构造单个语句则是编码阶段的任务。语句构造力求简单,直接,不能为了片面追求效率而使语句复杂化。1.在一行内只写一条语句在一行内只写一条语句,并且采取适当的移行格式,使程序的逻辑和功能变得更加明确。许多程序设计语言允许在一行内写多个语句。但这种方式会使程序可读性变差。因而不可取。例如,有一段排序程序FORI:=1TON-1DOBEGINT:=I;FORJ:=I+1TONDOIFA[J]<A[T]THENT:=J;IFT≠ITHENBEGINWORK:=A[T];A[T]:=A[I];A[I]:=WORK;ENDEND;由于一行中包括了多个语句,掩盖了程序的循环结构和条件结构,使其可读性变得很差。FORI:=1TON-1DO//改进布局BEGINT:=I;FORJ:=I+1TONDOIFA[J]<A[T]THENT:=J;IFT≠ITHENBEGINWORK:=A[T];A[T]:=A[I];A[I]:=WORK;ENDEND;2.程序编写首先应当考虑清晰性程序编写首先应当考虑清晰性,不要刻意追求技巧性,
本文标题:软件工程概论06
链接地址:https://www.777doc.com/doc-213266 .html