版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
程序編碼結構化程序設計程序設計風格程序效率程序復雜性度量做為軟件件工程過過程的一一個階段段,程序編碼碼是設計計的繼續(xù)續(xù)。程序設計計語言的的特性和和程序設設計風格格會深刻刻地影響響軟件的的質(zhì)量和和可維護護性。為了保證證程序編編碼的質(zhì)質(zhì)量,程程序員必必須深刻刻理解、、熟練掌掌握并正正確地運運用程序序設計語語言的特特性。此此外,還還要求源源程序具具有良好好的結構構性和良良好的程程序設計計風格。。結構化程程序設計計結構化程程序設計計主要包包括兩方方面:在編寫程程序時,,強調(diào)使用幾種種基本控控制結構構,通過組組合嵌套套,形成成程序的的控制結結構。盡可能避避免使用用GOTO語句。在程序設設計過程程中,盡盡量采用用自頂向向下和逐逐步細化化的原則則,由粗到細細,一步步展展開。結構化程程序設計計的主要要原則使用語言言中的順序、選擇、重復等有限的的基本控控制結構構表示程程序邏輯輯。選用的控控制結構構只準許許有一個入口口和一個出口口。程序語句句組成容易識別別的塊,每塊只有有一個入口口和一個出口口。復雜結構構應該用用基本控控制結構構進行組組合嵌套套來實現(xiàn)現(xiàn)。語言中沒沒有的控控制結構構,可用用一段等等價的程程序段模模擬,但但要求該該程序段段在整個個系統(tǒng)中中應前后后一致。。嚴格控制制GOTO語句,僅在下下列情形形才可使使用:①用一一個非結結構化的的程序設設計語言言去實現(xiàn)現(xiàn)一個結結構化的的構造。。②若不不使用GOTO語句就會會使程序序功能模模糊。③在某某種可以以改善而而不是損損害程序序可讀性性的情況況下。例1打打印A,B,C三數(shù)中最最小者程程序程序1if((A<B)goto120;;if((B<C)goto110;;100write((C);goto140;;110write((B);goto140;;120if((A<C)goto130;;goto100;;130write((A);140end程序2if((A<B)and((A<C)thenwrite((A)elseif((AB)and((B<C)thenwrite((B)elsewrite((C)endifendif例2用用二分分法求方方程f(x)=0在區(qū)間[[a..b]中的根的的程序
假設在閉閉區(qū)間[[a..b]上函數(shù)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*fm>0)){x0=xm;f0=fm;}elsex1=xm;}finish:printf(“\nTherootofthisequationis%%d\n”,xm);}單入口,,兩出口口正常出口口是循環(huán)環(huán)達到n次,非正正常出口口是循環(huán)環(huá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型循環(huán)為為while型,將單單入口多多出口結結構改為為單入口口單出口口結構。。自頂向下下,逐步步求精在詳細設設計和編編碼階段段,應當當采取自自頂向下下,逐步步求精的的方法。。把一個模模塊的功功能逐步步分解,,細化為為一系列列具體的的步驟,,進而翻翻譯成一一系列用用某種程程序設計計語言寫寫成的程程序。例,用篩篩選法求求100以內(nèi)的的素數(shù)篩選法就就是從2到100中去去掉2,,3,……,9,,10的的倍數(shù),,剩下的的就是100以以內(nèi)的素素數(shù)。為了解決決這個問問題,可可先按程程序功能能寫出一一個框架架。main(){{///程序框架架建立2到到100的數(shù)組組A[],,其中A[i]=i;----------------------------------------------1建立2到到10的的素數(shù)表表B[],,其中存放放2到10以以內(nèi)的素素數(shù);--------------2若A[i]=i是B[]中任一數(shù)數(shù)的倍數(shù)數(shù),則剔除A[i];---------------------------3輸出A[]中所有沒沒有被剔剔除的數(shù)數(shù);----------------------------------------------4}
main(){{/*建立2到到100的數(shù)組組A[],,其中A[i]=i*/for((i=2;;i<=100;;i++))A[i]=i;/*建立2到到10的的素數(shù)表表B[],,其中存放放2到10以內(nèi)內(nèi)的素數(shù)數(shù)*/B[1]==2;;B[2]==3;;B[3]==5;;B[4]==7;;/*若A[i]=i是B[]中任一數(shù)數(shù)的倍數(shù)數(shù),則剔剔除A[i]*/for((j=1;;j<=4;j++))檢查A[]所有的數(shù)數(shù)能否被被B[j]整除并將將能被整除除的數(shù)從從A[]中剔除;------3..1/*輸出出A[]]中所有沒沒有被剔剔除的數(shù)數(shù)*/for((i=2;;i<=100;;i++))若A[i]沒有被剔剔除,則則輸出之之---4.1}對框架中中的局部部再做細細化,得得到整個個程序。。main(){{/*建立2到到100的數(shù)組組A[],,其中A[i]=i*/for((i=2;;i<=100;;i++))A[i]=i;/*建立2到到10的的素數(shù)表表B[],,其中存放放2到10以內(nèi)內(nèi)的素數(shù)數(shù)*/B[1]==2;;B[2]==3;;B[3]==5;;B[4]==7;;/*若A[i]=i是B[]中任一數(shù)數(shù)的倍數(shù)數(shù),則剔剔除A[i]*/for((j=1;;j<=4;j++))/*檢查A[]所有的數(shù)數(shù)能否被被B[j]整除并將將能被整除的的數(shù)從A[]中剔除**/for((i=2;;i<=100;;i++)if((A[i]/B[j]*B[j]===A[i])A[i]=0;/*輸出A[]中所有沒沒有被剔剔除的數(shù)數(shù)*/for((i=2;;i<=100;;i++)/*若A[i]沒有被剔剔除,則則輸出之之*/if((A[i]!!=0))printf(“A[%d]]=%d\n””,I,A[i]);;}自頂向下下,逐步步求精方方法的優(yōu)優(yōu)點符合人們們解決復復雜問題題的普遍遍規(guī)律。。可提高高軟件開開發(fā)的成成功率和和生產(chǎn)率率用先全局局后局部部,先整整體后細細節(jié),先先抽象后后具體的的逐步求求精的過過程開發(fā)發(fā)出來的的程序具具有清晰晰的層次次結構,,程序容容易閱讀讀和理解解程序自頂頂向下,,逐步細細化,分分解成一一個樹形形結構。。在同一一層的節(jié)節(jié)點上的的細化工工作相互互獨立。。有利于于編碼、、測試和和集成每一步工工作僅在在上層節(jié)節(jié)點的基基礎上做做不多的的設計擴擴展,便便于檢查查有利于設設計的分分工和組組織工作作。程序設計計風格程序實際際上也是是一種供供人閱讀讀的文章章,有一一個文章的風風格問題。應應該使程程序具有有良好的的風格。。源程序文文檔化數(shù)據(jù)說明明語句結構構輸入/輸輸出方法法源程序文文檔化標識符的的命名安排注釋釋程序的視視覺組織織符號名的的命名符號名即即標識符符,包括括模塊名、變量名、常量名、標號名、子程序名名、、數(shù)據(jù)區(qū)名名以及緩沖區(qū)名名等。這些名字字應能反反映它所所代表的的實際東東西,應有一定定實際意意義。例如,表表示次數(shù)數(shù)的量用用Times,表示總量量的用Total,表示平均均值的用用Average,表示和的的量用Sum等。名字不是是越長越越好,應當選選擇精煉煉的意義義明確的的名字。。必要時可可使用縮縮寫名字字,但這時時要注意意縮寫規(guī)規(guī)則要一一致,并并且要給每一個個名字加加注釋。同時,,在一個個程序中中,一個個變量只只應用于于一種用用途。NEW..BALANCE.ACCOUNTS.PAYABLENBALAPN
程序的注注釋夾在程序序中的注注釋是程程序員與與日后的的程序讀讀者之間間通信的的重要手手段。注釋決不不是可有有可無的的。一些正規(guī)規(guī)的程序序文本中中,注釋釋行的數(shù)數(shù)量占到到整個源源程序的的1/3到1//2,甚甚至更多多。注釋分為為序言性性注釋和和功能性性注釋。。序言性注注釋通常置于于每個程程序模塊塊的開頭頭部分,,它應當給給出程序序的整體體說明,對于理理解程序序本身具具有引導導作用。。有些軟軟件開發(fā)發(fā)部門對對序言性性注釋做做了明確確而嚴格格的規(guī)定定,要求求程序編編制者逐逐項列出出。有關項目目包括::程序標題題;有關本模模塊功能和目目的的說明;主要算法法;接口說明明:包括調(diào)調(diào)用形式式,參數(shù)數(shù)描述,,子程序序清單;;有關數(shù)據(jù)據(jù)描述:重要的的變量及及其用途途,約束束或限制制條件,,以及其其它有關關信息;;模塊位置置:在哪一一個源文文件中,,或隸屬屬于哪一一個軟件件包;開發(fā)簡歷歷:模塊設設計者,,復審者者,復審審日期,,修改日日期及有有關說明明等。功能性注注釋功能性注注釋嵌在在源程序序體中,,用以描描述其后后的語句句或程序序段是在在做什么么工作,,或是執(zhí)執(zhí)行了下下面的語語句會怎怎么樣。。而不要要解釋下下面怎么么做。例如,/*ADDAMOUNTTOTOTAL*//TOTAL==AMOUNT+TOTAL不好。如果注明明把月銷銷售額計計入年度度總額,,便使讀讀者理解解了下面面語句的的意圖::/*ADDMONTHLY-SALESTOANNUAL--TOTAL**/TOTAL==AMOUNT+TOTAL要點描述一段段程序,,而不是是每一個個語句;;用縮進和和空行,,使程序序與注釋釋容易區(qū)區(qū)別;注釋要正正確。視覺組織織空格、空空行和移移行恰當?shù)乩每崭瘢梢酝怀鲞\算算的優(yōu)先先性,避免發(fā)發(fā)生運算算的錯誤誤。例如,,將表達達式(A<-17)ANDNOT(B<=49)ORC寫成(A<-17)ANDNOT(B<=49)ORC自然的程程序段之之間可用用空行隔開;移行也叫做向右縮格格。它是指指程序中中的各行行不必都都在左端端對齊,,都從第第一格起起排列。。這樣做做使程序序完全分分不清層層次關系系。對于選擇語句句和循環(huán)語句句,把其中中的程序序段語句句向右做做階梯式移移行。使程序序的邏輯輯結構更更加清晰晰。例如,兩兩重選擇擇結構嵌嵌套,寫寫成下面面的移行行形式,,層次就就清楚得得多。IF(…)THENIF(…)THEN……ELSE……ENDIF……ELSE……ENDIF數(shù)據(jù)說明明在設計階階段已經(jīng)經(jīng)確定了了數(shù)據(jù)結結構的組組織及其其復雜性性。在編編寫程序序時,則則需要注注意數(shù)據(jù)據(jù)說明的的風格。。為了使程程序中數(shù)數(shù)據(jù)說明明更易于于理解和和維護,,必須注注意以下下幾點。。1.數(shù)據(jù)據(jù)說明的的次序應應當規(guī)范范化2.說明明語句中中變量安安排有序序化3.使用用注釋說說明復雜雜數(shù)據(jù)結結構數(shù)據(jù)說明明的次序序應當規(guī)規(guī)范化數(shù)據(jù)說明明次序規(guī)規(guī)范化,,使數(shù)據(jù)據(jù)屬性容容易查找找,也有有利于測測試,排排錯和維維護。原則上,,數(shù)據(jù)說說明的次次序與語語法無關關,其次次序是任任意的。。但出于于閱讀、、理解和和維護的的需要,,最好使使其規(guī)范范化,使使說明的的先后次次序固定定。例如,在在FORTRAN程序中數(shù)數(shù)據(jù)說明明次序①常量說明明②簡單變量量類型說說明③數(shù)組說明明④公用數(shù)據(jù)據(jù)塊說明明⑤所有的文文件說明明在類型說說明中還還可進一一步要求求。例如如,可按如下下順序排排列:①整型量說說明②實型量說說明③字符量說說明④邏輯量說說明說明語句句中變量量安排有有序化當多個變量量名在一一個說明明語句中中說明時,應當當對這些些變量按字母的的順序排排列。帶標號號的全程程數(shù)據(jù)((如FORTRAN的公用塊塊)也應應當按字字母的順順序排列列。例如,把把integersize,length,width,cost,price寫成integercost,length,price,size,width使用注釋釋說明復復雜數(shù)據(jù)據(jù)結構如果設計計了一個個復雜的的數(shù)據(jù)結結構,應應當使用用注釋來來說明在在程序實實現(xiàn)時這這個數(shù)據(jù)據(jù)結構的的固有特特點。例如,對對PL/1的鏈表結結構和Pascal中用戶自自定義的的數(shù)據(jù)類類型,都都應當在在注釋中中做必要要的補充充說明。。語句結構構在設計階階段確定定了軟件件的邏輯輯流結構構,但構構造單個個語句則則是編碼碼階段的的任務。。語句構構造力求求簡單,,直接,,不能為為了片面面追求效效率而使使語句復復雜化。。1.在在一行內(nèi)內(nèi)只寫一一條語句句在一行內(nèi)內(nèi)只寫一一條語句句,并且且采取適適當?shù)囊埔菩懈袷绞?,使程程序的邏邏輯和功功能變得得更加明明確。許多程序序設計語語言允許許在一行內(nèi)內(nèi)寫多個個語句。但這種種方式會使程序序可讀性性變差。因而不不可取。。
例如,有有一段排排序程序序FORI:==1TON-1DOBEGINT:==I;FORJ:==I+1TONDOIFA[J]<A[T]]THENT:==J;IFT≠ITHENBEGINWORK:==A[T];A[T]]:=A[I]];A[[I]::=WORK;;ENDEND;由于一行行中包括括了多個個語句,,掩蓋了了程序的的循環(huán)結結構和條條件結構構,使其其可讀性性變得很很差。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.程序序編寫首首先應當當考慮清清晰性程序編寫寫首先應應當考慮慮清晰性性,不要要刻意追追求技巧巧性,使使程序編編寫得過過于緊湊湊。例如,有有一個用用C語句寫出出的程序序段:A[I]]=A[I]+A[T]];A[T]]=A[I]-A[T]];A[I]]=A[I]-A[T]];此段程序序可能不不易看懂懂,有時時還需用用實際數(shù)數(shù)據(jù)試驗驗一下。。實際上,,這段程程序的功功能就是是交換A[I]]和A[T]]中的內(nèi)容容。目的的是為了了節(jié)省一一個工作作單元。。如果改改一下::WORK=A[T];A[T]]=A[I];A[I]]=WORK;就能讓讀讀者一目目了然了了。3.程序序要能直直截了當當?shù)卣f明明程序員員的用意意。程序編寫寫得要簡簡單,寫寫清楚,,直截了了當?shù)卣f說明程序序員的用用意。例例如,for((i=1;;i<=n;i++))for((j=1;;j<=n;j++))V[i][j]=((i/j)*((j/i)除法運算算(/))在除數(shù)數(shù)和被除除數(shù)都是是整型量量時,其其結果只只取整數(shù)數(shù)部分,,而得到到整型量量。當i<j時,i/j=0當j<i時,j/i=0得到的數(shù)數(shù)組當i≠j時V[i][j]=((i/j)*((j/i)=0當i=j時V[i][j]=((i/j)*((j/i)=1這樣得到到的結果果V是一個單單位矩陣陣。寫成以下下的形式式,就能能讓讀者者直接了了解程序序編寫者者的意圖圖。for((i=1;i<=n;i++))for((j=1;j<=n;j++))if((i===j)V[i][j]=1.0;ELSEV[i][j]=0.0;
4.除除非對效效率有特特殊的要要求,程程序序編寫要要做到清晰第一一,效率第二二。不要為了了追求效效率而喪喪失了清清晰性。。事實上上,程序效率率的提高高主要應應通過選選擇高效效的算法法來實現(xiàn)。。5.首先先要保證證程序正確確,然然后才才要求提高速度度。反過來說說,在使使程序高高速運行行時,首首先要保保證它是是正確的的。6.避免免使用臨時時變量而使可讀讀性下降降。例如,有有的程序序員為了了追求效效率,往往往喜歡歡把表達達式A[I]]+1//A[I];寫成AI=A[I]];X=AI+1//AI;;這樣將一一句分成成兩句寫寫,會產(chǎn)產(chǎn)生意想想不到的的問題。。7.讓讓編譯程程序做簡簡單的優(yōu)優(yōu)化。8.盡盡可能使用庫函函數(shù)9.避避免不必要的的轉移。同時如果果能保持持程序可可讀性,,則不必必用GOTO語句。例如,有有一個求求三個數(shù)數(shù)中最小小值的程程序:
IF((X<<Y))GOTO30IF((Y<Z)GOTO50SMALL=ZGOTO7030IF((X<Z)GOTO60SMALL=ZGOTO7050SMALL==YGOTO7060SMALL==X70CONTINUE程序只需需編寫成成:small=x;if((y<small)small=y(tǒng);if((z<small)small=z;所以程序序應當簡簡單,不不必過于于深奧,,避免使用用GOTO語句繞來來繞去。。10.盡盡量只采采用三種基本本的控制制結構來編寫程程序。除順序結構構外,使用用if-then-else來實現(xiàn)選擇結構構;使用do-until或do-while來實現(xiàn)循環(huán)結構構。
11.避避免使使用空的ELSE語句和IF…THENIF……的語句。。這種結結構容易易使讀讀者產(chǎn)生生誤解。。例如,,if((char>=''a’)if((char<=’’z’)cout<<““Thisisaletter。?!?elsecout<<““Thisisnotaletter。。”;可能產(chǎn)生生二義性性問題。。12.避避免采用用過于復復雜的條條件測試試。13.盡盡量減少少使用““否定””條件的的條件語語句。例如,如如果在程程序中出出現(xiàn)if((!((char<<‘0’’|||char>>‘9’)))……改成if((char>>=''0’’&&&char<<=''9’’)……不要讓讀讀者繞彎彎子想。。14.盡盡可能能用通俗易懂懂的偽碼碼來描述程程序的流流程,然然后再翻翻譯成必必須使用用的語言言。15.數(shù)數(shù)據(jù)結結構要有有利于程程序的簡簡化。16.要要模塊化,使模塊塊功能盡盡可能單單一化,,模塊間間的耦合合能夠清清晰可見見。17.利利用信息隱蔽蔽,確保每每一個模模塊的獨獨立性。。18.從從數(shù)據(jù)出發(fā)去構構造程序序。19.不不要修修補不好好的程序序,要重重新編寫寫。也不不要一味味地追求求代碼的的復用,,要重新新組織。。20.對對太大大的程序序,要分分塊編寫寫、測試試,然后后再集成成。21.對對遞歸歸定義的的數(shù)據(jù)結結構盡量量使用遞遞歸過程程。輸入和輸輸出輸入和輸輸出信息息是與用用戶的使使用直接接相關的的。輸入入和輸出出的方式式和格式式應當盡盡可能方方便用戶戶的使用用。一定定要避免免因設計計不當給給用戶帶帶來的麻麻煩。因此,在在軟件需需求分析析階段和和設計階階段,就就應基本本確定輸輸入和輸輸出的風風格。系系統(tǒng)能否否被用戶戶接受,,有時就就取決于于輸入和和輸出的的風格。。不論是批處理的的輸入//輸出方方式,還是交互式的的輸入//輸出方方式,在設計計和編碼碼時都應應考慮下下列原則則:1.對所有的的輸入數(shù)數(shù)據(jù)都要要進行檢檢驗,識識別錯誤誤的輸入入,以保保證每個個數(shù)據(jù)的的有效性性;2.檢查輸入入項的各各種重要要組合的的合理性性,必要要時報告告輸入狀狀態(tài)信息息;3.使得輸入入的步驟驟和操作作盡可能能簡單,,并保持持簡單的的輸入格格式;4.輸入數(shù)據(jù)據(jù)時,應應允許使使用自由由格式輸輸入;5.應允許缺缺省值;;6.輸入一批批數(shù)據(jù)時時,最好好使用輸輸入結束束標志,,而不要要由用戶戶指定輸輸入數(shù)據(jù)據(jù)數(shù)目;;7.在交互式式輸入輸輸入時,,要在屏屏幕上使使用提示示符明確確提示交交互輸入入的請求求,指明明可使用用選擇項項的種類類和取值值范圍。。同時,,在數(shù)據(jù)據(jù)輸入的的過程中中和輸入入結束時時,也要要在屏幕幕上給出出狀態(tài)信信息;8.當程序設設計語言言對輸入入/輸出出格式有有嚴格要要求時,,應保持持輸入格格式與輸輸入語句句的要求求的一致致性;9.給所有的的輸出加加注解,,并設計計輸出報報表格式式。輸入/輸輸出風格格還受到到許多其其它因素素的影響響。如輸輸入/輸輸出設備備(例如如終端的的類型,,圖形設設備,數(shù)數(shù)字化轉轉換設備備等)、、用戶的的熟練程程度、以以及通信信環(huán)境等等。程序效率率討論效率率的準則則程序的效效率是指指程序的執(zhí)執(zhí)行速度度及程序所需需占用的的內(nèi)存的的存儲空空間。程序編編碼是最最后提高高運行速速度和節(jié)節(jié)省存儲儲的機會會,因此此在此階階段不能能不考慮慮程序的的效率。。讓我們們首先明明確討論論程序效效率的幾幾條準則則效率是一一個性能能要求,,應當在在需求分分析階段段給出。。軟件效率率以需求求為準,不應以以人力所所及為準準。好的設計計可以提提高效率率。程序的效率與程程序的簡簡單性相關。一般說來來,任何何對效率率無重要要改善,,且對程程序的簡簡單性、、可讀性性和正確確性不利利的程序序設計方方法都是是不可取取的。算法對效效率的影影響源程序的的效率與詳詳細設計計階段確確定的算算法的效效率直接接有關。在詳細細設計翻翻譯轉換換成源程程序代碼碼后,算算法效率率反映為為程序的的執(zhí)行速速度和存存儲容量量的要求求。設計向程程序轉換換過程中中的指導導原則::①在編程序序前,盡盡可能化化簡有關關的算術術表達式式和邏輯輯表達式式;②仔細檢查查算法中中的嵌套套的循環(huán)環(huán),盡可可能將某某些語句句或表達達式移到到循環(huán)外外面;③盡量避免免使用多多維數(shù)組組;④盡量避免免使用指指針和復復雜的表表;⑤采用“快快速”的的算術運運算;
⑥不要混淆淆數(shù)據(jù)類類型,避避免在表表達式中中出現(xiàn)類類型混雜雜;⑦盡量采用用整數(shù)算算術表達達式和布布爾表達達式;⑧選用等效效的高效效率算法法;許多編譯譯程序具具有“優(yōu)優(yōu)化”功功能,可可以自動動生成高高效率的的目標代代碼。影響存儲儲器效率率的因素素在大中型型計算機機系統(tǒng)中中,存儲儲限制不不再是主主要問題題。在這這種環(huán)境境下,對對內(nèi)存采取取基于操操作系統(tǒng)統(tǒng)的分頁頁功能的的虛擬存存儲管理理。存儲效率率與操作作系統(tǒng)的的分頁功功能直接接有關。采用結構構化程序序設計,,將程序功功能合理理分塊,使每個模模塊或一一組密切切相關模模塊的程程序體積積大小與與每頁的的容量相相匹配,可減少少頁面調(diào)調(diào)度,減減少內(nèi)外外存交換換,提高高存儲效效率。在微型計計算機系系統(tǒng)中,,存儲器器的容量量對軟件件設計和和編碼的的制約很很大。因因此要選擇可可生成較較短目標標代碼且且存儲壓壓縮性能能優(yōu)良的的編譯程程序,有時需需采用匯匯編程序序。提高存儲儲器效率率的關鍵鍵是程序序的簡單單性。影響輸入入/輸出出的因素素輸入/輸輸出可分分為兩種種類型::面向人((操作員員)的輸輸入/輸輸出面向設備備的輸入入/輸出出如果操作作員能夠夠十分方方便、簡簡單地錄錄入輸入入數(shù)據(jù),,或者能能夠十分分直觀、、一目了了然地了了解輸出出信息,,則可以以說面向向人的輸輸入/輸輸出是高高效的。。關于面向向設備的的輸入//輸出,,可以提提出一些些提高輸輸入/輸輸出效率率的指導導原則::輸入/輸輸出的請請求應當當最小化化;對于所有有的輸入入/輸出出操作,,安排適當當?shù)木彌_沖區(qū),以減少少頻繁的的信息交交換。對輔助存存儲(例例如磁盤盤),選擇盡可可能簡單單的,可可接受的的存取方方法;對輔助存存儲的輸輸入/輸輸出,應應當成塊傳送送;對終端或或打印機機的輸入入/輸出出,應考考慮設備備特性,盡可能能改善輸輸入/輸輸出的質(zhì)質(zhì)量和速速度;任何不易易理解的的,對改改善輸入入/輸出出效果關關系不大大的措施施都是不不可取的的;任何不易易理解的的所謂““超高效效”的輸輸入/輸輸出是毫毫無價值值的;程序復雜雜性度量量程序復雜雜性主要要指模塊內(nèi)程程序的復復雜性。它直接接關聯(lián)到到軟件開開發(fā)費用用的多少少,開發(fā)發(fā)周期的的長短和和軟件內(nèi)內(nèi)部潛伏伏錯誤的的多少。。減少程序序復雜性性,可提提高軟件件的簡單單性和可可理解性性,并使使軟件開開發(fā)費用用減少,,開發(fā)周周期縮短短,軟件件內(nèi)部潛潛藏錯誤誤減少。復雜性度度量需要要滿足的的假設為了度量量程序復復雜性,,要求::它可以用用來計算算任何一一個程序序的復雜雜性;對于不合合理的程程序,例例如對于于長度動動態(tài)增長長的程序序,或者者對于原原則上無無法排錯錯的程序序,不應應當使用用它進行行復雜性性計算;;如果程序序中指令令條數(shù)、、附加存存儲量、、計算時時間增多多,不會會減少程程序的復復雜性。。代碼行度度量法源代碼行行數(shù)度量量法基于于兩個前前提:程序復雜雜性隨著著程序規(guī)規(guī)模的增增加不均均衡地增增長;控制程序序規(guī)模的的方法最最好是采采用分而而治之的的辦法。。將一個個大程序序分解成成若干個個簡單的的可理解解的程序序段。方法的基基本考慮慮是統(tǒng)計一個個程序模模塊的源源代碼行行數(shù)目,,并以源源代碼行行數(shù)做為為程序復復雜性的的度量。。設每行代碼碼的出錯錯率為每100行源程序序中可能能有的錯錯誤數(shù)目目。Thayer曾指出,,程序出錯錯率的估估算范圍圍是從0.04%~7%之間間,即每100行行源程序序中可能能存在0.04~7個個錯誤。。他還指指出,每每行代碼碼的出錯錯率與源源程序行行數(shù)之間間不存在在簡單的的線性關關系。Lipow指出,對對于小程序,每行代代碼出錯錯率為1.3%%~1..8%;對于大程序,每行代代碼的出出錯率增增加到2.7%%~3..2%之間,這這只是考考慮了程程序的可可執(zhí)行部部分,沒沒有包括括程序中中的說明明部分。。Lipow及其他研研究者得得出一個個結論::對于少少于100個語語句的小小程序,,源代碼碼行數(shù)與與出錯率率是線性性相關的的。隨著著程序的的增大,,出錯率率以非線線性方式式增長。。McCabe度量法McCabe度量法,,又稱環(huán)環(huán)路復雜雜性度量量,是一一種基于程序序控制流流的復雜性性度量方方法。它基于一個個程序模模塊的程程序圖中中環(huán)路的的個數(shù),因此計計算它先先要畫出出程序圖圖。程序圖是是退化的的程序流流程圖。。流程圖圖中每個個處理都都退化成成一個結結點,流流線變成成連接不不同結點點的有向向弧。程序圖僅僅描述程程序內(nèi)部部的控制制流程,,完全不不表現(xiàn)對對數(shù)據(jù)的的具體操操作,以以及分支支和循環(huán)環(huán)的具體體條件。。計算環(huán)路路復雜性性的方法法:根據(jù)圖論論,在一一個強連連通的有有向圖G中,環(huán)的的個數(shù)由由以下公公式給出出:V(G)=m-n+p其中,V(G)是有向圖圖G中環(huán)路個個數(shù),m是圖G中弧數(shù),,n是圖G中結點數(shù)數(shù),p是圖G中的強連連通分量量個數(shù)。。Myers建議,對對于復合合判定,,例如,,(A=0))∩(C=D))∪(X=‘A’)算做三個個判定。。為使圖成成為強連連通圖,,從圖的的入口點點到出口口點加一一條用虛虛線表示示的有向向邊,使使圖成為為強連通通圖。這這樣就可可以使用用上式計計算環(huán)路路復雜性性。在例示中中,結點點數(shù)n=11,,弧數(shù)m=13,,p=1,則有V(G)=m-n+p=13--11++1=3.等于程序序圖中弧弧所封閉閉的區(qū)域域數(shù)。幾點說明明環(huán)路復雜雜度取決決于程序序控制結結構的復復雜度。。當程序序的分支支數(shù)目或或循環(huán)數(shù)數(shù)目增加加時其復復雜度也也增加。。環(huán)路復雜雜度與程程序中覆覆蓋的路路徑條數(shù)數(shù)有關。環(huán)路復雜雜度是可可加的。。例如,,模塊A的復雜度度為3,,模塊B的復雜度度為4,則模塊A與模塊B的復雜度度是7。。McCabe建議,對于復雜雜度超過過10的的程序,,應分成成幾個小小程序,,以減少少程序中中的錯誤誤。Walsh用實例證證實了這這個建議議的正確確性。在在McCabe復雜度為為10的的附近,,存在出出錯率的的間斷躍躍變。McCabe環(huán)路復雜雜度隱含含的前提提是:錯誤與程程序的判判定加上上例行子子程序的的調(diào)用數(shù)數(shù)目成正正比。加工復雜雜性、數(shù)數(shù)據(jù)結構構、錄入入與打亂亂輸入卡卡片的錯錯誤可以以忽略不不計。這種度量量的缺點點是:對于不同同種類的的控制流流的復雜雜性不能能區(qū)分簡單IF語句與循環(huán)語句句的復雜性性同等看看待嵌套IF語句與簡單CASE語句的復雜性性是一樣樣的模塊間接接口當成一個簡單單分支一樣處理理一個具有1000行行的順序序程序與一行語句句的復雜性性相同Halstead的軟件科科學Halstead軟件科學學研究確確定計算算機軟件件開發(fā)中中的一些些定量規(guī)規(guī)律,它它采用以以下一組組基本的的度量值值。這些度量量值通常常在程序序產(chǎn)生之之后得出出,或者者在設計計完成之之后估算算出。程序長度度(預測測的Halstead長度)令n1表示程序序中不同同運算符符(包括括保留字字)的個個數(shù),令令n2表示程序序中不同同運算對對象的個個數(shù),令令H表示“程程序長度度”,則則有H=n1log2n1+n2log2n2這里,H是程序長長度的預預測值,,它不等等于程序序中語句句個數(shù)。。在定義中中,運算算符包括括:算術運算算符賦賦值符((=或::=)邏輯運算算符分分界符((,或;;或:))關系運算算符括括號運算算符子程序調(diào)調(diào)用符數(shù)數(shù)組操作作符循環(huán)操作作符等。。特別地,,成對的的運算符符,例如如“begin…end””、“for……to””、“repeat…until”、、“while…do”、“if……then…else”、““(…))”等都當做單一運運算符。。
運算對象象包括變變量名和和常數(shù)。。實際的Halstead長度設N1為程序中中實際出出現(xiàn)的運運算符總總個數(shù),,N2為程序中中實際出出現(xiàn)的運運算對象象總個數(shù)數(shù),N為實際的的Halstead長度,則則有N=N1+N2程序的詞詞匯表Halstead定義程序序的詞匯匯表為不不同的運運算符種種類數(shù)n1和不同的的運算對對象種類類數(shù)n2的總和。。若令n為程序的的詞匯表表,則有有n=n1+n2例如,用FORTRAN語言寫出出的交換換排序的的例子SUBROUTINESORT((X,N)DIMENSIONX((N))
IF((N..LT.2)RETURNDO20I==2,NDO10J==1,IIF((X((I)..GE.X(J)))GOTO10SAVE=X(I)X(I))=X(J)X(J))=SAVE10CONTINUE20CONTINUERETURNEND
程序量程序量V可用下式式得到V=Nlog2n它表明了了程序在在詞匯上的的復雜性性。其最小小值為V
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東石油化工學院《Andoid基礎編程》2023-2024學年第一學期期末試卷
- 廣東汕頭幼兒師范高等專科學?!兜谝煌鈬Z英》2023-2024學年第一學期期末試卷
- 廣東農(nóng)工商職業(yè)技術學院《生物制藥學科前沿進展》2023-2024學年第一學期期末試卷
- 廣東茂名幼兒師范??茖W?!洞黉N策略》2023-2024學年第一學期期末試卷
- 廣東茂名健康職業(yè)學院《英國文學下》2023-2024學年第一學期期末試卷
- 廣東理工職業(yè)學院《美國社會與文化》2023-2024學年第一學期期末試卷
- 一年級數(shù)學計算題專項練習集錦
- 大腦的奧秘:神經(jīng)科學導論(復旦大學)學習通測試及答案
- 【2022屆走向高考】高三數(shù)學一輪(北師大版)基礎鞏固:第8章-第1節(jié)-簡單幾何體及其三視圖和直觀圖
- 2022韶山市高考英語閱讀理解及書面表達精煉(8)及答案
- 漢字文化解密學習通超星期末考試答案章節(jié)答案2024年
- 國家開放大學電大本科《工程經(jīng)濟與管理》2023-2024期末試題及答案(試卷號:1141)
- TBT3134-2023機車車輛驅動齒輪箱 技術要求
- 河北省石家莊市橋西區(qū)2022-2023學年七年級上學期期末地理試卷
- 水利工程安全生產(chǎn)組織機構
- 廣東省佛山市南海區(qū)人民法院
- 實施農(nóng)村客運公交化改造推進城鄉(xiāng)客運一體化發(fā)展
- 口腔修復學專業(yè)英語詞匯整理
- 【圖文】化學纖維質(zhì)量檢驗標準
- 婚喪報備表(共4頁)
- 《傳播學概論》核心課程建設方案
評論
0/150
提交評論