軟件工程-程序編碼_第1頁
軟件工程-程序編碼_第2頁
軟件工程-程序編碼_第3頁
軟件工程-程序編碼_第4頁
軟件工程-程序編碼_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

2023/2/1第六章程序編碼編碼的目的:是使用選定的程序設(shè)計語言,把模塊的過程性描述翻譯為用該語言書寫的源程序(源代碼)模塊的過程性描述(不可執(zhí)行的)源程序(可執(zhí)行的)編碼6.1編碼的目的2023/2/1清晰性效率開發(fā)時間程序輸出內(nèi)存數(shù)語句數(shù)程序可讀性最佳輸出可讀性最佳占內(nèi)存最小語句數(shù)最少開發(fā)時間最短1-21-245321433351243521442-352-31編碼要求結(jié)果名次評判項目Winberg

的程序?qū)嶒灲Y(jié)果2023/2/1結(jié)構(gòu)化程序設(shè)計是一種設(shè)計程序的技術(shù),它采用自頂向下逐步細化的設(shè)計方法和單入口(Singleentry)單出口(Singleexit)的控制結(jié)構(gòu)。這種控制結(jié)構(gòu)包括有:

順序、選擇和循環(huán)。

6.2結(jié)構(gòu)化程序設(shè)計(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-----單入口多出口結(jié)構(gòu)

M22023/2/1無節(jié)制地使用了GOTO語句所產(chǎn)生的程序流程

M2023/2/1一、結(jié)構(gòu)化程序設(shè)計的原則1、使用語言中的順序、選擇、重復(fù)等有限的基本控制結(jié)構(gòu)表示程序2、選用的控制結(jié)構(gòu)只準許有一個入口和一個出口3、程序語句組成容易識別的塊(Block),每塊只有一個入口和一個出口4、復(fù)雜結(jié)構(gòu)應(yīng)該用基本控制結(jié)構(gòu)進行組合嵌套來實現(xiàn)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二、程序設(shè)計自頂向下,逐步求精1、程序設(shè)計是一個由粗到細的“漸進”的過程

2、程序設(shè)計不僅包括對控制結(jié)構(gòu)的設(shè)計,也包括對數(shù)據(jù)結(jié)構(gòu)的設(shè)計。二者都要一步一步地細化。采用逐步細化方法設(shè)計程序的步驟列出問題的初步解分解主要問題

繼續(xù)細化利用圖形工具或偽代碼描述程序的詳細邏輯2023/2/1用逐步細化方法設(shè)計一個程序,其功能為“從一組數(shù)中找出最大的數(shù)”

舉例第一步:列出問題的初步解1:輸入一組數(shù)2:找出其中最大的數(shù)3:輸出最大的數(shù)2023/2/1第二步:分解主要問題2.1:首先讀入一個數(shù)并設(shè)其為最大的數(shù)2.2:將該數(shù)逐次與其它數(shù)進行比較2.3:若有大于該數(shù)的則將其保存2023/2/1第三步:確定數(shù)據(jù)結(jié)構(gòu)3.1:定義一數(shù)組A3.2:max=A(1)3.3:從A(2)至A(n)開始比較3.4:若當前數(shù)大于max,則令:max=A(i)2023/2/1第四步:用PDL描述InputarrayASetMax=A(1)DOfori=2toNIFMax<A(i)SetMax=A(i)ENDIFENDDOPrintMax2023/2/1練習請用逐步細化方法設(shè)計一由下列描述的程序結(jié)構(gòu)讀入一段任意長度的英語課文,將其分解為單字,然后輸出一張單詞表(listofwords),并指出每種單詞在課文中的出現(xiàn)次數(shù)。2023/2/1三、程序復(fù)雜性的度量程序復(fù)雜性主要是指模塊內(nèi)部程序的復(fù)雜性。它直接關(guān)系到軟件開發(fā)費用的多少,開發(fā)周期的長短和軟件和軟件內(nèi)部潛伏錯誤的多少。同時它也是軟件可理解性的另一種度量。2023/2/1它可以用來計算任何一個程序的復(fù)雜性;對于不合理的程序,例如對于長度動態(tài)增長的程序,或者對于原則上無法排錯的程序,不應(yīng)當使用它進行復(fù)雜性計算;為了度量程序復(fù)雜性,要求復(fù)雜性度量應(yīng)滿足以下假設(shè):2023/2/1如果設(shè)每行代碼的出錯率為每100行源程序中可能的錯誤數(shù)目。例如,每行代碼的出錯率為1%,也就是說,每100行源程序中就可能有一個錯誤。1、代碼行度量法:統(tǒng)計程序中的源代碼的行數(shù)較小的程序---1.3%~1.8%/行較大的程序---2.7%~3.2%/行2023/2/1該方法是利用程序模塊的程序圖中環(huán)路的個數(shù),來計算程序的復(fù)雜性的。為此,該方法也稱為環(huán)路復(fù)雜度計算法。2、McCabe度量法利用程序的控制流來度量程序的復(fù)雜性

它是一種退化了的程序流程圖。即:把程序流程圖中每個處理符號都退化成一個結(jié)點,而原來流程圖中的流程線,則變成連接不同結(jié)點的有向弧。2023/2/1(1)程序圖符號2023/2/12023/2/1TC1C2CABED(2)從流程圖導(dǎo)出程序圖A開始C1BCED結(jié)束C2TF2023/2/1(3)環(huán)路復(fù)雜性的計算方法

V(G)=m-n+2p說明:V(G)是有向圖G中環(huán)路數(shù);

m:為圖G中弧數(shù);

n:為圖G中節(jié)點數(shù);

p:為圖G中強連通分量個數(shù);

A

B

C

D

E

F

G

H

K

L

I

V(G)=13-11+2=4McCabe的環(huán)路復(fù)雜性度量值為42023/2/1練習請將右側(cè)給出的程序流程圖轉(zhuǎn)換為程序圖并計算其環(huán)路值。a<=100FTb>=20b%3==1b+=3a++b-=5TFFTa=0,b=12023/2/1程序的環(huán)路復(fù)雜度則取決于程序控制流的復(fù)雜度,也就是取決于程序結(jié)構(gòu)的復(fù)雜程度。當程序內(nèi)分支或循環(huán)個數(shù)增加時,則相應(yīng)地環(huán)域復(fù)雜度也隨之增加。因此,它是對測試難度的一種定量度量,也能對軟件最終的可靠性給出某種預(yù)測。(4)、環(huán)路復(fù)雜度的用途V(G)<=102023/2/1練習請用程序流程圖描述下列問題的算法,再將其轉(zhuǎn)換為程序圖并計算其環(huán)路值。請定義一個數(shù)組a,要求找出數(shù)組中最大數(shù)和最小數(shù),并把最大數(shù)和a[0]

中的數(shù)對調(diào)、最小數(shù)和a[1]

中的數(shù)對調(diào)。2023/2/1練習請畫出下列偽代碼程序的流程圖、程序圖并計算它的環(huán)路復(fù)雜度。

LOOP:DoWhileZ>0A=A+1IFA>10THENX=AELSEY=ZENDIFIFY<5THENPRINTX,YELSEIFY=2THENGOTOLOOPELSEC=3ENDIFENDIFG=H+RENDDOIFF>0THENPRINTGELSEPRINTKENDIFSTOP2023/2/1四、程序效率程序效率是指程序的執(zhí)行速度及程序占用的存儲空間。程序編碼是最后提高運行速度和節(jié)省存儲機會,因此在此階段不能不考慮程序的效率。2023/2/11、算法對效率的影響源程序的效率與詳細設(shè)計階段確定的算法的效率有著直接的關(guān)系。當我們把詳細設(shè)計翻譯并轉(zhuǎn)換成源代碼之后,那么算法效率就會反映為程序的執(zhí)行速度和存儲容量的要求2023/2/1(1)在編程序前,盡可能化簡有關(guān)的算術(shù)表達式和邏輯表達式(2)仔細檢查算法中的嵌套的循環(huán),盡可能將某些語句或表達式移到循環(huán)外面(3)盡量避免使用多維數(shù)組(4)盡量避免使用指針和復(fù)雜的表(5)不要混淆數(shù)據(jù)類型,避免在表達式中出現(xiàn)類型混雜(6)盡量采用整數(shù)算術(shù)表達式和布爾表達式(7)選用等效的高效率算法轉(zhuǎn)換過程中的指導(dǎo)原則是:2023/2/1

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

i=1j=1舉例請設(shè)計求解下列問題的算法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)2(j+2)203i=1j=1內(nèi)循環(huán)次數(shù)20*4=80外循環(huán)次數(shù)21總循環(huán)次數(shù)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);}應(yīng)把變化范圍大的循環(huán)變量放在內(nèi)層。內(nèi)循環(huán)次數(shù)3*21=63外循環(huán)次數(shù)4總循環(huán)次數(shù)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

共計執(zhí)行了

3*20=60次

重復(fù)執(zhí)行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

共計執(zhí)行了

3次

減少了57次應(yīng)盡量把與循環(huán)變量無關(guān)的運算移到循環(huán)外去。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

共計執(zhí)行了

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

共計執(zhí)行了

60次

2023/2/1練習從鍵盤輸入10個整數(shù),要求按有小到大的順序?qū)⑺鼈冚敵觥U埐捎帽容^交換法和選擇法對上述10條數(shù)據(jù)進行排序,然后分別對這兩種方法進行比較,并從程序的運行了效率的角度對兩個程序進行比較。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五、程序設(shè)計風格Codingstyle1、保持控制流的直線性(1)、對多入口和多出口的控制結(jié)構(gòu)要作適當?shù)奶幚?/p>

……IfC1thenS110S2

20IfC2thenSngoto10

C1S1S2C2SnTT多入口循環(huán)結(jié)構(gòu)2023/2/1IfC1thenS1elseS2While(notC2)doS2SnC1S1C2SnTTS2S2改進后的循環(huán)結(jié)構(gòu)重復(fù)環(huán)節(jié)法2023/2/110if(notC1)thenS2if(notC2)thenSnS1goto10多出口循環(huán)結(jié)構(gòu)C1S2TTC2S1Sn2023/2/1while(C1andC2)doS1If(not(C1)thenS2Sn經(jīng)過處理后的單出口循環(huán)結(jié)構(gòu)C1andC2S2TC1S1SnT邏輯分析法2023/2/1while(C1)doBeginS1IfC2thengoto10elseS2End10Sn

EXIT:=false

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

do

SUM=SUM+xloopuntilSUM>1000PrintSUM使用TureBasic

語言中的專用語句退出循環(huán)上面程序的功能是:從鍵盤輸入一個數(shù),并累加到總和中。當總和超過1000或輸入為0時則停止輸入,并打印出總和。2023/2/1if(N>=0)then

if(N能被2整除)thenprint“正偶數(shù)”elseprint“負數(shù)”

導(dǎo)致二義性的then-if

結(jié)構(gòu)(2)、避免使用模糊或費解的結(jié)構(gòu)if(N<0)thenprint“負數(shù)”

elseif(N能被2整除)thenprint“正偶數(shù)”

2023/2/1WhileC1IfC2thenWhileC3IfC4thenRepeat

SUntilC5

Loop

Loop…….

費解的深層嵌套結(jié)構(gòu)嵌套層最好不要超過3層2023/2/1二、保持控制流的局部性

局部性是程序設(shè)計的一條準則。像應(yīng)用甚廣的模塊化設(shè)計,可看成是局部化原理在總體設(shè)計中的具體體現(xiàn)。其實,在編碼時也要遵守局部化的原則,這就是保持控制流的局部性,其目的不僅是為了提高程序的清晰度,也有利于防止錯誤的擴散,提高程序的可修改性。2023/2/11、GOTO

語句的使用準則向前不向后的規(guī)則……while(C1>0){S1=S1+C1;if(S1>1000)gotolabel;……}……

label:S2=a+b;……2023/2/1goto的目的地最好在同一控制結(jié)構(gòu)內(nèi)部,或者離本結(jié)構(gòu)出口相近的地方。……

10IF(.NOT.C)GOTO20SGOTO10

20CONTINUE……

while(C1)doBeginS1ifC2thengoto10End

10Sn

122023/2/1C1C2C3TTTFe1e2e32、GOTO

語句的常見用法請將右側(cè)的具有多個循環(huán)出口的結(jié)構(gòu)改寫為單出口結(jié)構(gòu)2023/2/1C1C2C3TTTFe1e2e3(用GOTO語句提前退出循環(huán))方法一: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為真時執(zhí)行的語句}gotot40;30:{C3為真時的語句}40:Sn{后續(xù)語句}標志變量2023/2/1whileC1dobegin……

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論