软件工程-程序编码_第1页
软件工程-程序编码_第2页
软件工程-程序编码_第3页
软件工程-程序编码_第4页
软件工程-程序编码_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2023/2/1第六章程序编码编码的目的:是使用选定的程序设计语言,把模块的过程性描述翻译为用该语言书写的源程序(源代码)模块的过程性描述(不可执行的)源程序(可执行的)编码6.1编码的目的2023/2/1清晰性效率开发时间程序输出内存数语句数程序可读性最佳输出可读性最佳占内存最小语句数最少开发时间最短1-21-245321433351243521442-352-31编码要求结果名次评判项目Winberg

的程序实验结果2023/2/1结构化程序设计是一种设计程序的技术,它采用自顶向下逐步细化的设计方法和单入口(Singleentry)单出口(Singleexit)的控制结构。这种控制结构包括有:

顺序、选择和循环。

6.2结构化程序设计(StructuredProgramming)2023/2/1……for(a=1,b=1;a<=100,a++){if(b>=20)break;if(b%3==1){b+=3;continue;}b-=5;}……a<=100FTb>=20b%3==1b+=3a++b-=5TFFTa=0,b=1单入口

M1单出口2023/2/1A<BA,B,CB<CA<C打印BFTFTTF打印C打印A……If(A.LT.B)goto120If(B.LT.C)goto110100write(6,*)C

goto140

110write(6,*)B

goto140

120If(A.LT.C)goto130

goto100

130write(6,*)A140continue-----单入口多出口结构

M22023/2/1无节制地使用了GOTO语句所产生的程序流程

M2023/2/1一、结构化程序设计的原则1、使用语言中的顺序、选择、重复等有限的基本控制结构表示程序2、选用的控制结构只准许有一个入口和一个出口3、程序语句组成容易识别的块(Block),每块只有一个入口和一个出口4、复杂结构应该用基本控制结构进行组合嵌套来实现5、严格控制GOTO语句2023/2/1……F0=F(a);F1=F(b);if(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*Fm>0){X0=Xm;F0=Fm;}elseX1=Xm;

}finish:printf(“%d\n”,Xm);}2023/2/1Begin(F0*F1)<=0

X0=aX1=bi=1

Xm=(X0+X1)/2Fm=F(m)Q(F0*Fm)>0

X0=Xm

X1=Xm

F0=FmTTXmFTFF

F0=F(a)F1=F(b)11End22

i<=n

i

Q=abs((Fm)<eps||abs(X1-X0)<eps)2023/2/1……F0=F(a);F1=F(b);if(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;

}

printf(“%d\n”,Xm);}2023/2/1……F0=F(a);F1=F(b);if(F0*F1<=0){X0=a;X1=b;i=1;finish=0;

while(i<=n&&finish==0)

{

Xm=(X0+X1)/2;Fm=F(Xm);if(abs(Fm)<eps||abs(X1-X0)<eps)finish=1;

if(finish==0);if(F0*Fm>0){X0=Xm;F0=Fm;}elseX1=Xm;i++;

}

printf(“%d\n”,Xm);}2023/2/1二、程序设计自顶向下,逐步求精1、程序设计是一个由粗到细的“渐进”的过程

2、程序设计不仅包括对控制结构的设计,也包括对数据结构的设计。二者都要一步一步地细化。采用逐步细化方法设计程序的步骤列出问题的初步解分解主要问题

继续细化利用图形工具或伪代码描述程序的详细逻辑2023/2/1用逐步细化方法设计一个程序,其功能为“从一组数中找出最大的数”

举例第一步:列出问题的初步解1:输入一组数2:找出其中最大的数3:输出最大的数2023/2/1第二步:分解主要问题2.1:首先读入一个数并设其为最大的数2.2:将该数逐次与其它数进行比较2.3:若有大于该数的则将其保存2023/2/1第三步:确定数据结构3.1:定义一数组A3.2:max=A(1)3.3:从A(2)至A(n)开始比较3.4:若当前数大于max,则令:max=A(i)2023/2/1第四步:用PDL描述InputarrayASetMax=A(1)DOfori=2toNIFMax<A(i)SetMax=A(i)ENDIFENDDOPrintMax2023/2/1练习请用逐步细化方法设计一由下列描述的程序结构读入一段任意长度的英语课文,将其分解为单字,然后输出一张单词表(listofwords),并指出每种单词在课文中的出现次数。2023/2/1三、程序复杂性的度量程序复杂性主要是指模块内部程序的复杂性。它直接关系到软件开发费用的多少,开发周期的长短和软件和软件内部潜伏错误的多少。同时它也是软件可理解性的另一种度量。2023/2/1它可以用来计算任何一个程序的复杂性;对于不合理的程序,例如对于长度动态增长的程序,或者对于原则上无法排错的程序,不应当使用它进行复杂性计算;为了度量程序复杂性,要求复杂性度量应满足以下假设:2023/2/1如果设每行代码的出错率为每100行源程序中可能的错误数目。例如,每行代码的出错率为1%,也就是说,每100行源程序中就可能有一个错误。1、代码行度量法:统计程序中的源代码的行数较小的程序---1.3%~1.8%/行较大的程序---2.7%~3.2%/行2023/2/1该方法是利用程序模块的程序图中环路的个数,来计算程序的复杂性的。为此,该方法也称为环路复杂度计算法。2、McCabe度量法利用程序的控制流来度量程序的复杂性

它是一种退化了的程序流程图。即:把程序流程图中每个处理符号都退化成一个结点,而原来流程图中的流程线,则变成连接不同结点的有向弧。2023/2/1(1)程序图符号2023/2/12023/2/1TC1C2CABED(2)从流程图导出程序图A开始C1BCED结束C2TF2023/2/1(3)环路复杂性的计算方法

V(G)=m-n+2p说明:V(G)是有向图G中环路数;

m:为图G中弧数;

n:为图G中节点数;

p:为图G中强连通分量个数;

A

B

C

D

E

F

G

H

K

L

I

V(G)=13-11+2=4McCabe的环路复杂性度量值为42023/2/1练习请将右侧给出的程序流程图转换为程序图并计算其环路值。a<=100FTb>=20b%3==1b+=3a++b-=5TFFTa=0,b=12023/2/1程序的环路复杂度则取决于程序控制流的复杂度,也就是取决于程序结构的复杂程度。当程序内分支或循环个数增加时,则相应地环域复杂度也随之增加。因此,它是对测试难度的一种定量度量,也能对软件最终的可靠性给出某种预测。(4)、环路复杂度的用途V(G)<=102023/2/1练习请用程序流程图描述下列问题的算法,再将其转换为程序图并计算其环路值。请定义一个数组a,要求找出数组中最大数和最小数,并把最大数和a[0]

中的数对调、最小数和a[1]

中的数对调。2023/2/1练习请画出下列伪代码程序的流程图、程序图并计算它的环路复杂度。

LOOP:DoWhileZ>0A=A+1IFA>10THENX=AELSEY=ZENDIFIFY<5THENPRINTX,YELSEIFY=2THENGOTOLOOPELSEC=3ENDIFENDIFG=H+RENDDOIFF>0THENPRINTGELSEPRINTKENDIFSTOP2023/2/1四、程序效率程序效率是指程序的执行速度及程序占用的存储空间。程序编码是最后提高运行速度和节省存储机会,因此在此阶段不能不考虑程序的效率。2023/2/11、算法对效率的影响源程序的效率与详细设计阶段确定的算法的效率有着直接的关系。当我们把详细设计翻译并转换成源代码之后,那么算法效率就会反映为程序的执行速度和存储容量的要求2023/2/1(1)在编程序前,尽可能化简有关的算术表达式和逻辑表达式(2)仔细检查算法中的嵌套的循环,尽可能将某些语句或表达式移到循环外面(3)尽量避免使用多维数组(4)尽量避免使用指针和复杂的表(5)不要混淆数据类型,避免在表达式中出现类型混杂(6)尽量采用整数算术表达式和布尔表达式(7)选用等效的高效率算法转换过程中的指导原则是:2023/2/1

∑∑(i+1)²(j+2)203

i=1j=1举例请设计求解下列问题的算法2023/2/1main(){inti,j;floatsum;sum=0.0;for(i=1;i<=20;i++)for(j=1;j<=3;j++)sum=sum+(i+1)*(i+1)*(j+2);printf(“sum=%d\n”,sum);}

∑∑(i+1)²(j+2)203i=1j=1内循环次数20*4=80外循环次数21总循环次数101

2023/2/1main(){inti,j;floatsum;sum=0.0;for(j=1;j<=3;j++)for(i=1;i<=20;i++)sum=sum+(i+1)*(i+1)*(j+2);printf(“sum=%d\n”,sum);}应把变化范围大的循环变量放在内层。内循环次数3*21=63外循环次数4总循环次数672023/2/1main(){inti,j;floatsum;sum=0.0;for(j=1;j<=3;j++)for(i=1;i<=20;i++)sum=sum+(i+1)*(i+1)*(j+2);printf(“sum=%d\n”,sum);}

j+2

共计执行了

3*20=60次

重复执行57次2023/2/1main(){inti,j;floatsum;sum=0.0;for(j=1;j<=3;j++){k=j+2;for(i=1;i<=20;i++)sum=sum+(i+1)*(i+1)*k;}printf(“sum=%d\n”,sum);}

j+2

共计执行了

3次

减少了57次应尽量把与循环变量无关的运算移到循环外去。2023/2/1main(){inti,j;floatsum;sum=0.0;for(j=1;j<=3;j++){k=j+2;for(i=1;i<=20;i++)sum=sum+(i+1)*(i+1)*k;printf(“sum=%d\n”,sum);}

i+1

共计执行了

60+60=120次

2023/2/1main(){inti,j;floatsum;sum=0.0;for(j=1;j<=3;j++){k=j+2;for(i=1;i<=20;i++){m=i+1;sum=sum+m*m*k;}printf(“sum=%d\n”,sum);}

i+1

共计执行了

60次

2023/2/1练习从键盘输入10个整数,要求按有小到大的顺序将它们输出。请采用比较交换法和选择法对上述10条数据进行排序,然后分别对这两种方法进行比较,并从程序的运行了效率的角度对两个程序进行比较。2023/2/1

main(){inta[10],i,j,t;for(i=0;i<10;i++)scanf(“%d”,&a[i]);for(i=0;i<9;i++)for(j=i+1;j<10;j++)if(a[j]<a[i]){t=a[j];a[j]=a[i];a[i]=t;}for(i=0;i<10;i++)printf(“%2d”,a[i]);}2023/2/1

……for(i=0;i<9;i++){k=i;for(j=i+1;j<10;j++)if(a[j]<a[k])k=j;if(k<>j){t=a[j];a[j]=a[k];a[k]=t;}}……2023/2/1五、程序设计风格Codingstyle1、保持控制流的直线性(1)、对多入口和多出口的控制结构要作适当的处理

……IfC1thenS110S2

20IfC2thenSngoto10

C1S1S2C2SnTT多入口循环结构2023/2/1IfC1thenS1elseS2While(notC2)doS2SnC1S1C2SnTTS2S2改进后的循环结构重复环节法2023/2/110if(notC1)thenS2if(notC2)thenSnS1goto10多出口循环结构C1S2TTC2S1Sn2023/2/1while(C1andC2)doS1If(not(C1)thenS2Sn经过处理后的单出口循环结构C1andC2S2TC1S1SnT逻辑分析法2023/2/1while(C1)doBeginS1IfC2thengoto10elseS2End10Sn

EXIT:=false

while(C1and(notEXIT))doBeginS1IfC2thenEXIT:=trueelseS2End10Sn标志变量法标志变量breakExitdoExitfor2023/2/1SUM=0Doinputxifx=0thenexit

do

SUM=SUM+xloopuntilSUM>1000PrintSUM使用TureBasic

语言中的专用语句退出循环上面程序的功能是:从键盘输入一个数,并累加到总和中。当总和超过1000或输入为0时则停止输入,并打印出总和。2023/2/1if(N>=0)then

if(N能被2整除)thenprint“正偶数”elseprint“负数”

导致二义性的then-if

结构(2)、避免使用模糊或费解的结构if(N<0)thenprint“负数”

elseif(N能被2整除)thenprint“正偶数”

2023/2/1WhileC1IfC2thenWhileC3IfC4thenRepeat

SUntilC5

Loop

Loop…….

费解的深层嵌套结构嵌套层最好不要超过3层2023/2/1二、保持控制流的局部性

局部性是程序设计的一条准则。像应用甚广的模块化设计,可看成是局部化原理在总体设计中的具体体现。其实,在编码时也要遵守局部化的原则,这就是保持控制流的局部性,其目的不仅是为了提高程序的清晰度,也有利于防止错误的扩散,提高程序的可修改性。2023/2/11、GOTO

语句的使用准则向前不向后的规则……while(C1>0){S1=S1+C1;if(S1>1000)gotolabel;……}……

label:S2=a+b;……2023/2/1goto的目的地最好在同一控制结构内部,或者离本结构出口相近的地方。……

10IF(.NOT.C)GOTO20SGOTO10

20CONTINUE……

while(C1)doBeginS1ifC2thengoto10End

10Sn

122023/2/1C1C2C3TTTFe1e2e32、GOTO

语句的常见用法请将右侧的具有多个循环出口的结构改写为单出口结构2023/2/1C1C2C3TTTFe1e2e3(用GOTO语句提前退出循环)方法一:EXIT2=false;EXIT3=false;while(C1)and(not(EXIT2)and(not(EXIT3)do

begin……ifC2thenEXIT2:=true;……ifC3thenEXIT3:=true;

……endif(EXIT2)thengoto20;if(EXIT3)thengoto30;goto40;

20:{C2为真时执行的语句}gotot40;30:{C3为真时的语句}40:Sn{后续语句}标志变量2023/2/1whileC1dobegin……

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论