




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
程序編碼結(jié)構(gòu)化程序設(shè)計(jì)程序設(shè)計(jì)風(fēng)格程序效率程序復(fù)雜性度量做為軟件件工程過過程的一一個(gè)階段段,程序編碼碼是設(shè)計(jì)計(jì)的繼續(xù)續(xù)。程序設(shè)計(jì)計(jì)語言的的特性和和程序設(shè)設(shè)計(jì)風(fēng)格格會深刻刻地影響響軟件的的質(zhì)量和和可維護(hù)護(hù)性。為了保證證程序編編碼的質(zhì)質(zhì)量,程程序員必必須深刻刻理解、、熟練掌掌握并正正確地運(yùn)運(yùn)用程序序設(shè)計(jì)語語言的特特性。此此外,還還要求源源程序具具有良好好的結(jié)構(gòu)構(gòu)性和良良好的程程序設(shè)計(jì)計(jì)風(fēng)格。。結(jié)構(gòu)化程程序設(shè)計(jì)計(jì)結(jié)構(gòu)化程程序設(shè)計(jì)計(jì)主要包包括兩方方面:在編寫程程序時(shí),,強(qiáng)調(diào)使用幾種種基本控控制結(jié)構(gòu)構(gòu),通過組組合嵌套套,形成成程序的的控制結(jié)結(jié)構(gòu)。盡可能避避免使用用GOTO語句。在程序設(shè)設(shè)計(jì)過程程中,盡盡量采用用自頂向向下和逐逐步細(xì)化化的原則則,由粗到細(xì)細(xì),一步步展展開。結(jié)構(gòu)化程程序設(shè)計(jì)計(jì)的主要要原則使用語言言中的順序、選擇、重復(fù)等有限的的基本控控制結(jié)構(gòu)構(gòu)表示程程序邏輯輯。選用的控控制結(jié)構(gòu)構(gòu)只準(zhǔn)許許有一個(gè)入口口和一個(gè)出口口。程序語句句組成容易識別別的塊,每塊只有有一個(gè)入口口和一個(gè)出口口。復(fù)雜結(jié)構(gòu)構(gòu)應(yīng)該用用基本控控制結(jié)構(gòu)構(gòu)進(jìn)行組組合嵌套套來實(shí)現(xiàn)現(xiàn)。語言中沒沒有的控控制結(jié)構(gòu)構(gòu),可用用一段等等價(jià)的程程序段模模擬,但但要求該該程序段段在整個(gè)個(gè)系統(tǒng)中中應(yīng)前后后一致。。嚴(yán)格控制制GOTO語句,僅在下下列情形形才可使使用:①用一一個(gè)非結(jié)結(jié)構(gòu)化的的程序設(shè)設(shè)計(jì)語言言去實(shí)現(xiàn)現(xiàn)一個(gè)結(jié)結(jié)構(gòu)化的的構(gòu)造。。②若不不使用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]中的根的的程序
假設(shè)在閉閉區(qū)間[[a..b]上函數(shù)f(x)有唯一的的一個(gè)零零點(diǎn)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)達(dá)到n次,非正正常出口口是循環(huán)環(huán)中途控控制轉(zhuǎn)出出到標(biāo)號號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型,將單單入口多多出口結(jié)結(jié)構(gòu)改為為單入口口單出口口結(jié)構(gòu)。。自頂向下下,逐步步求精在詳細(xì)設(shè)設(shè)計(jì)和編編碼階段段,應(yīng)當(dāng)當(dāng)采取自自頂向下下,逐步步求精的的方法。。把一個(gè)模模塊的功功能逐步步分解,,細(xì)化為為一系列列具體的的步驟,,進(jìn)而翻翻譯成一一系列用用某種程程序設(shè)計(jì)計(jì)語言寫寫成的程程序。例,用篩篩選法求求100以內(nèi)的的素?cái)?shù)篩選法就就是從2到100中去去掉2,,3,……,9,,10的的倍數(shù),,剩下的的就是100以以內(nèi)的素素?cái)?shù)。為了解決決這個(gè)問問題,可可先按程程序功能能寫出一一個(gè)框架架。main(){{///程序框架架建立2到到100的數(shù)組組A[],,其中A[i]=i;----------------------------------------------1建立2到到10的的素?cái)?shù)表表B[],,其中存放放2到10以以內(nèi)的素素?cá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的的素?cái)?shù)表表B[],,其中存放放2到10以內(nèi)內(nèi)的素?cá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}對框架中中的局部部再做細(xì)細(xì)化,得得到整個(gè)個(gè)程序。。main(){{/*建立2到到100的數(shù)組組A[],,其中A[i]=i*/for((i=2;;i<=100;;i++))A[i]=i;/*建立2到到10的的素?cái)?shù)表表B[],,其中存放放2到10以內(nèi)內(nèi)的素?cá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)點(diǎn)符合人們們解決復(fù)復(fù)雜問題題的普遍遍規(guī)律。。可提高高軟件開開發(fā)的成成功率和和生產(chǎn)率率用先全局局后局部部,先整整體后細(xì)細(xì)節(jié),先先抽象后后具體的的逐步求求精的過過程開發(fā)發(fā)出來的的程序具具有清晰晰的層次次結(jié)構(gòu),,程序容容易閱讀讀和理解解程序自頂頂向下,,逐步細(xì)細(xì)化,分分解成一一個(gè)樹形形結(jié)構(gòu)。。在同一一層的節(jié)節(jié)點(diǎn)上的的細(xì)化工工作相互互獨(dú)立。。有利于于編碼、、測試和和集成每一步工工作僅在在上層節(jié)節(jié)點(diǎn)的基基礎(chǔ)上做做不多的的設(shè)計(jì)擴(kuò)擴(kuò)展,便便于檢查查有利于設(shè)設(shè)計(jì)的分分工和組組織工作作。程序設(shè)計(jì)計(jì)風(fēng)格程序?qū)嶋H際上也是是一種供供人閱讀讀的文章章,有一一個(gè)文章的風(fēng)風(fēng)格問題。應(yīng)應(yīng)該使程程序具有有良好的的風(fēng)格。。源程序文文檔化數(shù)據(jù)說明明語句結(jié)構(gòu)構(gòu)輸入/輸輸出方法法源程序文文檔化標(biāo)識符的的命名安排注釋釋程序的視視覺組織織符號名的的命名符號名即即標(biāo)識符符,包括括模塊名、變量名、常量名、標(biāo)號名、子程序名名、、數(shù)據(jù)區(qū)名名以及緩沖區(qū)名名等。這些名字字應(yīng)能反反映它所所代表的的實(shí)際東東西,應(yīng)有一定定實(shí)際意意義。例如,表表示次數(shù)數(shù)的量用用Times,表示總量量的用Total,表示平均均值的用用Average,表示和的的量用Sum等。名字不是是越長越越好,應(yīng)當(dāng)選選擇精煉煉的意義義明確的的名字。。必要時(shí)可可使用縮縮寫名字字,但這時(shí)時(shí)要注意意縮寫規(guī)規(guī)則要一一致,并并且要給每一個(gè)個(gè)名字加加注釋。同時(shí),,在一個(gè)個(gè)程序中中,一個(gè)個(gè)變量只只應(yīng)用于于一種用用途。NEW..BALANCE.ACCOUNTS.PAYABLENBALAPN
程序的注注釋夾在程序序中的注注釋是程程序員與與日后的的程序讀讀者之間間通信的的重要手手段。注釋決不不是可有有可無的的。一些正規(guī)規(guī)的程序序文本中中,注釋釋行的數(shù)數(shù)量占到到整個(gè)源源程序的的1/3到1//2,甚甚至更多多。注釋分為為序言性性注釋和和功能性性注釋。。序言性注注釋通常置于于每個(gè)程程序模塊塊的開頭頭部分,,它應(yīng)當(dāng)給給出程序序的整體體說明,對于理理解程序序本身具具有引導(dǎo)導(dǎo)作用。。有些軟軟件開發(fā)發(fā)部門對對序言性性注釋做做了明確確而嚴(yán)格格的規(guī)定定,要求求程序編編制者逐逐項(xiàng)列出出。有關(guān)項(xiàng)目目包括::程序標(biāo)題題;有關(guān)本模模塊功能和目目的的說明;主要算法法;接口說明明:包括調(diào)調(diào)用形式式,參數(shù)數(shù)描述,,子程序序清單;;有關(guān)數(shù)據(jù)據(jù)描述:重要的的變量及及其用途途,約束束或限制制條件,,以及其其它有關(guān)關(guān)信息;;模塊位置置:在哪一一個(gè)源文文件中,,或隸屬屬于哪一一個(gè)軟件件包;開發(fā)簡歷歷:模塊設(shè)設(shè)計(jì)者,,復(fù)審者者,復(fù)審審日期,,修改日日期及有有關(guān)說明明等。功能性注注釋功能性注注釋嵌在在源程序序體中,,用以描描述其后后的語句句或程序序段是在在做什么么工作,,或是執(zhí)執(zhí)行了下下面的語語句會怎怎么樣。。而不要要解釋下下面怎么么做。例如,/*ADDAMOUNTTOTOTAL*//TOTAL==AMOUNT+TOTAL不好。如果注明明把月銷銷售額計(jì)計(jì)入年度度總額,,便使讀讀者理解解了下面面語句的的意圖::/*ADDMONTHLY-SALESTOANNUAL--TOTAL**/TOTAL==AMOUNT+TOTAL要點(diǎn)描述一段段程序,,而不是是每一個(gè)個(gè)語句;;用縮進(jìn)和和空行,,使程序序與注釋釋容易區(qū)區(qū)別;注釋要正正確。視覺組織織空格、空空行和移移行恰當(dāng)?shù)乩每崭?,可以突出運(yùn)算算的優(yōu)先先性,避免發(fā)發(fā)生運(yùn)算算的錯(cuò)誤誤。例如,,將表達(dá)達(dá)式(A<-17)ANDNOT(B<=49)ORC寫成(A<-17)ANDNOT(B<=49)ORC自然的程程序段之之間可用用空行隔開;移行也叫做向右縮格格。它是指指程序中中的各行行不必都都在左端端對齊,,都從第第一格起起排列。。這樣做做使程序序完全分分不清層層次關(guān)系系。對于選擇語句句和循環(huán)語句句,把其中中的程序序段語句句向右做做階梯式移移行。使程序序的邏輯輯結(jié)構(gòu)更更加清晰晰。例如,兩兩重選擇擇結(jié)構(gòu)嵌嵌套,寫寫成下面面的移行行形式,,層次就就清楚得得多。IF(…)THENIF(…)THEN……ELSE……ENDIF……ELSE……ENDIF數(shù)據(jù)說明明在設(shè)計(jì)階階段已經(jīng)經(jīng)確定了了數(shù)據(jù)結(jié)結(jié)構(gòu)的組組織及其其復(fù)雜性性。在編編寫程序序時(shí),則則需要注注意數(shù)據(jù)據(jù)說明的的風(fēng)格。。為了使程程序中數(shù)數(shù)據(jù)說明明更易于于理解和和維護(hù),,必須注注意以下下幾點(diǎn)。。1.數(shù)據(jù)據(jù)說明的的次序應(yīng)應(yīng)當(dāng)規(guī)范范化2.說明明語句中中變量安安排有序序化3.使用用注釋說說明復(fù)雜雜數(shù)據(jù)結(jié)結(jié)構(gòu)數(shù)據(jù)說明明的次序序應(yīng)當(dāng)規(guī)規(guī)范化數(shù)據(jù)說明明次序規(guī)規(guī)范化,,使數(shù)據(jù)據(jù)屬性容容易查找找,也有有利于測測試,排排錯(cuò)和維維護(hù)。原則上,,數(shù)據(jù)說說明的次次序與語語法無關(guān)關(guān),其次次序是任任意的。。但出于于閱讀、、理解和和維護(hù)的的需要,,最好使使其規(guī)范范化,使使說明的的先后次次序固定定。例如,在在FORTRAN程序中數(shù)數(shù)據(jù)說明明次序①常量說明明②簡單變量量類型說說明③數(shù)組說明明④公用數(shù)據(jù)據(jù)塊說明明⑤所有的文文件說明明在類型說說明中還還可進(jìn)一一步要求求。例如如,可按如下下順序排排列:①整型量說說明②實(shí)型量說說明③字符量說說明④邏輯量說說明說明語句句中變量量安排有有序化當(dāng)多個(gè)變量量名在一一個(gè)說明明語句中中說明時(shí),應(yīng)當(dāng)當(dāng)對這些些變量按字母的的順序排排列。帶標(biāo)號號的全程程數(shù)據(jù)((如FORTRAN的公用塊塊)也應(yīng)應(yīng)當(dāng)按字字母的順順序排列列。例如,把把integersize,length,width,cost,price寫成integercost,length,price,size,width使用注釋釋說明復(fù)復(fù)雜數(shù)據(jù)據(jù)結(jié)構(gòu)如果設(shè)計(jì)計(jì)了一個(gè)個(gè)復(fù)雜的的數(shù)據(jù)結(jié)結(jié)構(gòu),應(yīng)應(yīng)當(dāng)使用用注釋來來說明在在程序?qū)崒?shí)現(xiàn)時(shí)這這個(gè)數(shù)據(jù)據(jù)結(jié)構(gòu)的的固有特特點(diǎn)。例如,對對PL/1的鏈表結(jié)結(jié)構(gòu)和Pascal中用戶自自定義的的數(shù)據(jù)類類型,都都應(yīng)當(dāng)在在注釋中中做必要要的補(bǔ)充充說明。。語句結(jié)構(gòu)構(gòu)在設(shè)計(jì)階階段確定定了軟件件的邏輯輯流結(jié)構(gòu)構(gòu),但構(gòu)構(gòu)造單個(gè)個(gè)語句則則是編碼碼階段的的任務(wù)。。語句構(gòu)構(gòu)造力求求簡單,,直接,,不能為為了片面面追求效效率而使使語句復(fù)復(fù)雜化。。1.在在一行內(nèi)內(nèi)只寫一一條語句句在一行內(nèi)內(nèi)只寫一一條語句句,并且且采取適適當(dāng)?shù)囊埔菩懈袷绞?,使程程序的邏邏輯和功功能變得得更加明明確。許多程序序設(shè)計(jì)語語言允許許在一行內(nèi)內(nèi)寫多個(gè)個(gè)語句。但這種種方式會使程序序可讀性性變差。因而不不可取。。
例如,有有一段排排序程序序FORI:==1TON-1DOBEGINT:==I;FORJ:==I+1TONDOIFA[J]<A[T]]THENT:==J;IFT≠ITHENBEGINWORK:==A[T];A[T]]:=A[I]];A[[I]::=WORK;;ENDEND;由于一行行中包括括了多個(gè)個(gè)語句,,掩蓋了了程序的的循環(huán)結(jié)結(jié)構(gòu)和條條件結(jié)構(gòu)構(gòu),使其其可讀性性變得很很差。FORI::=1TON-1DO//改進(jìn)布局局BEGINT:=I;FORJ::=I++1TONDOIFA[J]<A[T]]THENT:=J;IFT≠ITHENBEGINWORK:=A[T]];A[T]]:=A[I]];A[I]]:=WORK;ENDEND;;2.程序序編寫首首先應(yīng)當(dāng)當(dāng)考慮清清晰性程序編寫寫首先應(yīng)應(yīng)當(dāng)考慮慮清晰性性,不要要刻意追追求技巧巧性,使使程序編編寫得過過于緊湊湊。例如,有有一個(gè)用用C語句寫出出的程序序段:A[I]]=A[I]+A[T]];A[T]]=A[I]-A[T]];A[I]]=A[I]-A[T]];此段程序序可能不不易看懂懂,有時(shí)時(shí)還需用用實(shí)際數(shù)數(shù)據(jù)試驗(yàn)驗(yàn)一下。。實(shí)際上,,這段程程序的功功能就是是交換A[I]]和A[T]]中的內(nèi)容容。目的的是為了了節(jié)省一一個(gè)工作作單元。。如果改改一下::WORK=A[T];A[T]]=A[I];A[I]]=WORK;就能讓讀讀者一目目了然了了。3.程序序要能直直截了當(dāng)當(dāng)?shù)卣f明明程序員員的用意意。程序編寫寫得要簡簡單,寫寫清楚,,直截了了當(dāng)?shù)卣f說明程序序員的用用意。例例如,for((i=1;;i<=n;i++))for((j=1;;j<=n;j++))V[i][j]=((i/j)*((j/i)除法運(yùn)算算(/))在除數(shù)數(shù)和被除除數(shù)都是是整型量量時(shí),其其結(jié)果只只取整數(shù)數(shù)部分,,而得到到整型量量。當(dāng)i<j時(shí),i/j=0當(dāng)j<i時(shí),j/i=0得到的數(shù)數(shù)組當(dāng)i≠j時(shí)V[i][j]=((i/j)*((j/i)=0當(dāng)i=j(luò)時(shí)V[i][j]=((i/j)*((j/i)=1這樣得到到的結(jié)果果V是一個(gè)單單位矩陣陣。寫成以下下的形式式,就能能讓讀者者直接了了解程序序編寫者者的意圖圖。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.除除非對效效率有特特殊的要要求,程程序序編寫要要做到清晰第一一,效率第二二。不要為了了追求效效率而喪喪失了清清晰性。。事實(shí)上上,程序效率率的提高高主要應(yīng)應(yīng)通過選選擇高效效的算法法來實(shí)現(xiàn)。。5.首先先要保證證程序正確確,然然后才才要求提高速度度。反過來說說,在使使程序高高速運(yùn)行行時(shí),首首先要保保證它是是正確的的。6.避免免使用臨時(shí)時(shí)變量而使可讀讀性下降降。例如,有有的程序序員為了了追求效效率,往往往喜歡歡把表達(dá)達(dá)式A[I]]+1//A[I];寫成AI=A[I]];X=AI+1//AI;;這樣將一一句分成成兩句寫寫,會產(chǎn)產(chǎn)生意想想不到的的問題。。7.讓讓編譯程程序做簡簡單的優(yōu)優(yōu)化。8.盡盡可能使用庫函函數(shù)9.避避免不必要的的轉(zhuǎn)移。同時(shí)如果果能保持持程序可可讀性,,則不必必用GOTO語句。例如,有有一個(gè)求求三個(gè)數(shù)數(shù)中最小小值的程程序:
IF((X<<Y))GOTO30IF((Y<Z)GOTO50SMALL=ZGOTO7030IF((X<Z)GOTO60SMALL=ZGOTO7050SMALL==Y(jié)GOTO7060SMALL==X70CONTINUE程序只需需編寫成成:small=x;if((y<small)small=y(tǒng);if((z<small)small=z;所以程序序應(yīng)當(dāng)簡簡單,不不必過于于深?yuàn)W,,避免使用用GOTO語句繞來來繞去。。10.盡盡量只采采用三種基本本的控制制結(jié)構(gòu)來編寫程程序。除順序結(jié)構(gòu)構(gòu)外,使用用if-then-else來實(shí)現(xiàn)選擇結(jié)構(gòu)構(gòu);使用do-until或do-while來實(shí)現(xiàn)循環(huán)結(jié)構(gòu)構(gòu)。
11.避避免使使用空的ELSE語句和IF…THENIF……的語句。。這種結(jié)結(jié)構(gòu)容易易使讀讀者產(chǎn)生生誤解。。例如,,if((char>=''a’)if((char<=’’z’)cout<<““Thisisaletter。。”;elsecout<<““Thisisnotaletter。?!?可能產(chǎn)生生二義性性問題。。12.避避免采用用過于復(fù)復(fù)雜的條條件測試試。13.盡盡量減少少使用““否定””條件的的條件語語句。例如,如如果在程程序中出出現(xiàn)if((!((char<<‘0’’|||char>>‘9’)))……改成if((char>>=''0’’&&&char<<=''9’’)……不要讓讀讀者繞彎彎子想。。14.盡盡可能能用通俗易懂懂的偽碼碼來描述程程序的流流程,然然后再翻翻譯成必必須使用用的語言言。15.數(shù)數(shù)據(jù)結(jié)結(jié)構(gòu)要有有利于程程序的簡簡化。16.要要模塊化,使模塊塊功能盡盡可能單單一化,,模塊間間的耦合合能夠清清晰可見見。17.利利用信息隱蔽蔽,確保每每一個(gè)模模塊的獨(dú)獨(dú)立性。。18.從從數(shù)據(jù)出發(fā)去構(gòu)構(gòu)造程序序。19.不不要修修補(bǔ)不好好的程序序,要重重新編寫寫。也不不要一味味地追求求代碼的的復(fù)用,,要重新新組織。。20.對對太大大的程序序,要分分塊編寫寫、測試試,然后后再集成成。21.對對遞歸歸定義的的數(shù)據(jù)結(jié)結(jié)構(gòu)盡量量使用遞遞歸過程程。輸入和輸輸出輸入和輸輸出信息息是與用用戶的使使用直接接相關(guān)的的。輸入入和輸出出的方式式和格式式應(yīng)當(dāng)盡盡可能方方便用戶戶的使用用。一定定要避免免因設(shè)計(jì)計(jì)不當(dāng)給給用戶帶帶來的麻麻煩。因此,在在軟件需需求分析析階段和和設(shè)計(jì)階階段,就就應(yīng)基本本確定輸輸入和輸輸出的風(fēng)風(fēng)格。系系統(tǒng)能否否被用戶戶接受,,有時(shí)就就取決于于輸入和和輸出的的風(fēng)格。。不論是批處理的的輸入//輸出方方式,還是交互式的的輸入//輸出方方式,在設(shè)計(jì)計(jì)和編碼碼時(shí)都應(yīng)應(yīng)考慮下下列原則則:1.對所有的的輸入數(shù)數(shù)據(jù)都要要進(jìn)行檢檢驗(yàn),識識別錯(cuò)誤誤的輸入入,以保保證每個(gè)個(gè)數(shù)據(jù)的的有效性性;2.檢查輸入入項(xiàng)的各各種重要要組合的的合理性性,必要要時(shí)報(bào)告告輸入狀狀態(tài)信息息;3.使得輸入入的步驟驟和操作作盡可能能簡單,,并保持持簡單的的輸入格格式;4.輸入數(shù)據(jù)據(jù)時(shí),應(yīng)應(yīng)允許使使用自由由格式輸輸入;5.應(yīng)允許缺缺省值;;6.輸入一批批數(shù)據(jù)時(shí)時(shí),最好好使用輸輸入結(jié)束束標(biāo)志,,而不要要由用戶戶指定輸輸入數(shù)據(jù)據(jù)數(shù)目;;7.在交互式式輸入輸輸入時(shí),,要在屏屏幕上使使用提示示符明確確提示交交互輸入入的請求求,指明明可使用用選擇項(xiàng)項(xiàng)的種類類和取值值范圍。。同時(shí),,在數(shù)據(jù)據(jù)輸入的的過程中中和輸入入結(jié)束時(shí)時(shí),也要要在屏幕幕上給出出狀態(tài)信信息;8.當(dāng)程序設(shè)設(shè)計(jì)語言言對輸入入/輸出出格式有有嚴(yán)格要要求時(shí),,應(yīng)保持持輸入格格式與輸輸入語句句的要求求的一致致性;9.給所有的的輸出加加注解,,并設(shè)計(jì)計(jì)輸出報(bào)報(bào)表格式式。輸入/輸輸出風(fēng)格格還受到到許多其其它因素素的影響響。如輸輸入/輸輸出設(shè)備備(例如如終端的的類型,,圖形設(shè)設(shè)備,數(shù)數(shù)字化轉(zhuǎn)轉(zhuǎn)換設(shè)備備等)、、用戶的的熟練程程度、以以及通信信環(huán)境等等。程序效率率討論效率率的準(zhǔn)則則程序的效效率是指指程序的執(zhí)執(zhí)行速度度及程序所需需占用的的內(nèi)存的的存儲空空間。程序編編碼是最最后提高高運(yùn)行速速度和節(jié)節(jié)省存儲儲的機(jī)會會,因此此在此階階段不能能不考慮慮程序的的效率。。讓我們們首先明明確討論論程序效效率的幾幾條準(zhǔn)則則效率是一一個(gè)性能能要求,,應(yīng)當(dāng)在在需求分分析階段段給出。。軟件效率率以需求求為準(zhǔn),不應(yīng)以以人力所所及為準(zhǔn)準(zhǔn)。好的設(shè)計(jì)計(jì)可以提提高效率率。程序的效率與程程序的簡簡單性相關(guān)。一般說來來,任何何對效率率無重要要改善,,且對程程序的簡簡單性、、可讀性性和正確確性不利利的程序序設(shè)計(jì)方方法都是是不可取取的。算法對效效率的影影響源程序的的效率與詳詳細(xì)設(shè)計(jì)計(jì)階段確確定的算算法的效效率直接接有關(guān)。在詳細(xì)細(xì)設(shè)計(jì)翻翻譯轉(zhuǎn)換換成源程程序代碼碼后,算算法效率率反映為為程序的的執(zhí)行速速度和存存儲容量量的要求求。設(shè)計(jì)向程程序轉(zhuǎn)換換過程中中的指導(dǎo)導(dǎo)原則::①在編程序序前,盡盡可能化化簡有關(guān)關(guān)的算術(shù)術(shù)表達(dá)式式和邏輯輯表達(dá)式式;②仔細(xì)檢查查算法中中的嵌套套的循環(huán)環(huán),盡可可能將某某些語句句或表達(dá)達(dá)式移到到循環(huán)外外面;③盡量避免免使用多多維數(shù)組組;④盡量避免免使用指指針和復(fù)復(fù)雜的表表;⑤采用“快快速”的的算術(shù)運(yùn)運(yùn)算;
⑥不要混淆淆數(shù)據(jù)類類型,避避免在表表達(dá)式中中出現(xiàn)類類型混雜雜;⑦盡量采用用整數(shù)算算術(shù)表達(dá)達(dá)式和布布爾表達(dá)達(dá)式;⑧選用等效效的高效效率算法法;許多編譯譯程序具具有“優(yōu)優(yōu)化”功功能,可可以自動(dòng)動(dòng)生成高高效率的的目標(biāo)代代碼。影響存儲儲器效率率的因素素在大中型型計(jì)算機(jī)機(jī)系統(tǒng)中中,存儲儲限制不不再是主主要問題題。在這這種環(huán)境境下,對對內(nèi)存采取取基于操操作系統(tǒng)統(tǒng)的分頁頁功能的的虛擬存存儲管理理。存儲效率率與操作作系統(tǒng)的的分頁功功能直接接有關(guān)。采用結(jié)構(gòu)構(gòu)化程序序設(shè)計(jì),,將程序功功能合理理分塊,使每個(gè)模模塊或一一組密切切相關(guān)模模塊的程程序體積積大小與與每頁的的容量相相匹配,可減少少頁面調(diào)調(diào)度,減減少內(nèi)外外存交換換,提高高存儲效效率。在微型計(jì)計(jì)算機(jī)系系統(tǒng)中,,存儲器器的容量量對軟件件設(shè)計(jì)和和編碼的的制約很很大。因因此要選擇可可生成較較短目標(biāo)標(biāo)代碼且且存儲壓壓縮性能能優(yōu)良的的編譯程程序,有時(shí)需需采用匯匯編程序序。提高存儲儲器效率率的關(guān)鍵鍵是程序序的簡單單性。影響輸入入/輸出出的因素素輸入/輸輸出可分分為兩種種類型::面向人((操作員員)的輸輸入/輸輸出面向設(shè)備備的輸入入/輸出出如果操作作員能夠夠十分方方便、簡簡單地錄錄入輸入入數(shù)據(jù),,或者能能夠十分分直觀、、一目了了然地了了解輸出出信息,,則可以以說面向向人的輸輸入/輸輸出是高高效的。。關(guān)于面向向設(shè)備的的輸入//輸出,,可以提提出一些些提高輸輸入/輸輸出效率率的指導(dǎo)導(dǎo)原則::輸入/輸輸出的請請求應(yīng)當(dāng)當(dāng)最小化化;對于所有有的輸入入/輸出出操作,,安排適當(dāng)當(dāng)?shù)木彌_沖區(qū),以減少少頻繁的的信息交交換。對輔助存存儲(例例如磁盤盤),選擇盡可可能簡單單的,可可接受的的存取方方法;對輔助存存儲的輸輸入/輸輸出,應(yīng)應(yīng)當(dāng)成塊傳送送;對終端或或打印機(jī)機(jī)的輸入入/輸出出,應(yīng)考考慮設(shè)備備特性,盡可能能改善輸輸入/輸輸出的質(zhì)質(zhì)量和速速度;任何不易易理解的的,對改改善輸入入/輸出出效果關(guān)關(guān)系不大大的措施施都是不不可取的的;任何不易易理解的的所謂““超高效效”的輸輸入/輸輸出是毫毫無價(jià)值值的;程序復(fù)雜雜性度量量程序復(fù)雜雜性主要要指模塊內(nèi)程程序的復(fù)復(fù)雜性。它直接接關(guān)聯(lián)到到軟件開開發(fā)費(fèi)用用的多少少,開發(fā)發(fā)周期的的長短和和軟件內(nèi)內(nèi)部潛伏伏錯(cuò)誤的的多少。。減少程序序復(fù)雜性性,可提提高軟件件的簡單單性和可可理解性性,并使使軟件開開發(fā)費(fèi)用用減少,,開發(fā)周周期縮短短,軟件件內(nèi)部潛潛藏錯(cuò)誤誤減少。復(fù)雜性度度量需要要滿足的的假設(shè)為了度量量程序復(fù)復(fù)雜性,,要求::它可以用用來計(jì)算算任何一一個(gè)程序序的復(fù)雜雜性;對于不合合理的程程序,例例如對于于長度動(dòng)動(dòng)態(tài)增長長的程序序,或者者對于原原則上無無法排錯(cuò)錯(cuò)的程序序,不應(yīng)應(yīng)當(dāng)使用用它進(jìn)行行復(fù)雜性性計(jì)算;;如果程序序中指令令條數(shù)、、附加存存儲量、、計(jì)算時(shí)時(shí)間增多多,不會會減少程程序的復(fù)復(fù)雜性。。代碼行度度量法源代碼行行數(shù)度量量法基于于兩個(gè)前前提:程序復(fù)雜雜性隨著著程序規(guī)規(guī)模的增增加不均均衡地增增長;控制程序序規(guī)模的的方法最最好是采采用分而而治之的的辦法。。將一個(gè)個(gè)大程序序分解成成若干個(gè)個(gè)簡單的的可理解解的程序序段。方法的基基本考慮慮是統(tǒng)計(jì)一個(gè)個(gè)程序模模塊的源源代碼行行數(shù)目,,并以源源代碼行行數(shù)做為為程序復(fù)復(fù)雜性的的度量。。設(shè)每行代碼碼的出錯(cuò)錯(cuò)率為每100行源程序序中可能能有的錯(cuò)錯(cuò)誤數(shù)目目。Thayer曾指出,,程序出錯(cuò)錯(cuò)率的估估算范圍圍是從0.04%~7%之間間,即每100行行源程序序中可能能存在0.04~7個(gè)個(gè)錯(cuò)誤。。他還指指出,每每行代碼碼的出錯(cuò)錯(cuò)率與源源程序行行數(shù)之間間不存在在簡單的的線性關(guān)關(guān)系。Lipow指出,對對于小程序,每行代代碼出錯(cuò)錯(cuò)率為1.3%%~1..8%;對于大程序,每行代代碼的出出錯(cuò)率增增加到2.7%%~3..2%之間,這這只是考考慮了程程序的可可執(zhí)行部部分,沒沒有包括括程序中中的說明明部分。。Lipow及其他研研究者得得出一個(gè)個(gè)結(jié)論::對于少少于100個(gè)語語句的小小程序,,源代碼碼行數(shù)與與出錯(cuò)率率是線性性相關(guān)的的。隨著著程序的的增大,,出錯(cuò)率率以非線線性方式式增長。。McCabe度量法McCabe度量法,,又稱環(huán)環(huán)路復(fù)雜雜性度量量,是一一種基于程序序控制流流的復(fù)雜性性度量方方法。它基于一個(gè)個(gè)程序模模塊的程程序圖中中環(huán)路的的個(gè)數(shù),因此計(jì)計(jì)算它先先要畫出出程序圖圖。程序圖是是退化的的程序流流程圖。。流程圖圖中每個(gè)個(gè)處理都都退化成成一個(gè)結(jié)結(jié)點(diǎn),流流線變成成連接不不同結(jié)點(diǎn)點(diǎn)的有向向弧。程序圖僅僅描述程程序內(nèi)部部的控制制流程,,完全不不表現(xiàn)對對數(shù)據(jù)的的具體操操作,以以及分支支和循環(huán)環(huán)的具體體條件。。計(jì)算環(huán)路路復(fù)雜性性的方法法:根據(jù)圖論論,在一一個(gè)強(qiáng)連連通的有有向圖G中,環(huán)的的個(gè)數(shù)由由以下公公式給出出:V(G)=m-n+p其中,V(G)是有向圖圖G中環(huán)路個(gè)個(gè)數(shù),m是圖G中弧數(shù),,n是圖G中結(jié)點(diǎn)數(shù)數(shù),p是圖G中的強(qiáng)連連通分量量個(gè)數(shù)。。Myers建議,對對于復(fù)合合判定,,例如,,(A=0))∩(C=D))∪(X=‘A’)算做三個(gè)個(gè)判定。。為使圖成成為強(qiáng)連連通圖,,從圖的的入口點(diǎn)點(diǎn)到出口口點(diǎn)加一一條用虛虛線表示示的有向向邊,使使圖成為為強(qiáng)連通通圖。這這樣就可可以使用用上式計(jì)計(jì)算環(huán)路路復(fù)雜性性。在例示中中,結(jié)點(diǎn)點(diǎn)數(shù)n=11,,弧數(shù)m=13,,p=1,則有V(G)=m-n+p=13--11++1=3.等于程序序圖中弧弧所封閉閉的區(qū)域域數(shù)。幾點(diǎn)說明明環(huán)路復(fù)雜雜度取決決于程序序控制結(jié)結(jié)構(gòu)的復(fù)復(fù)雜度。。當(dāng)程序序的分支支數(shù)目或或循環(huán)數(shù)數(shù)目增加加時(shí)其復(fù)復(fù)雜度也也增加。。環(huán)路復(fù)雜雜度與程程序中覆覆蓋的路路徑條數(shù)數(shù)有關(guān)。環(huán)路復(fù)雜雜度是可可加的。。例如,,模塊A的復(fù)雜度度為3,,模塊B的復(fù)雜度度為4,則模塊A與模塊B的復(fù)雜度度是7。。McCabe建議,對于復(fù)雜雜度超過過10的的程序,,應(yīng)分成成幾個(gè)小小程序,,以減少少程序中中的錯(cuò)誤誤。Walsh用實(shí)例證證實(shí)了這這個(gè)建議議的正確確性。在在McCabe復(fù)雜度為為10的的附近,,存在出出錯(cuò)率的的間斷躍躍變。McCabe環(huán)路復(fù)雜雜度隱含含的前提提是:錯(cuò)誤與程程序的判判定加上上例行子子程序的的調(diào)用數(shù)數(shù)目成正正比。加工復(fù)雜雜性、數(shù)數(shù)據(jù)結(jié)構(gòu)構(gòu)、錄入入與打亂亂輸入卡卡片的錯(cuò)錯(cuò)誤可以以忽略不不計(jì)。這種度量量的缺點(diǎn)點(diǎn)是:對于不同同種類的的控制流流的復(fù)雜雜性不能能區(qū)分簡單IF語句與循環(huán)語句句的復(fù)雜性性同等看看待嵌套IF語句與簡單CASE語句的復(fù)雜性性是一樣樣的模塊間接接口當(dāng)成一個(gè)簡單單分支一樣處理理一個(gè)具有1000行行的順序序程序與一行語句句的復(fù)雜性性相同Halstead的軟件科科學(xué)Halstead軟件科學(xué)學(xué)研究確確定計(jì)算算機(jī)軟件件開發(fā)中中的一些些定量規(guī)規(guī)律,它它采用以以下一組組基本的的度量值值。這些度量量值通常常在程序序產(chǎn)生之之后得出出,或者者在設(shè)計(jì)計(jì)完成之之后估算算出。程序長度度(預(yù)測測的Halstead長度)令n1表示程序序中不同同運(yùn)算符符(包括括保留字字)的個(gè)個(gè)數(shù),令令n2表示程序序中不同同運(yùn)算對對象的個(gè)個(gè)數(shù),令令H表示“程程序長度度”,則則有H=n1log2n1+n2log2n2這里,H是程序長長度的預(yù)預(yù)測值,,它不等等于程序序中語句句個(gè)數(shù)。。在定義中中,運(yùn)算算符包括括:算術(shù)運(yùn)算算符賦賦值符((=或::=)邏輯運(yùn)算算符分分界符((,或;;或:))關(guān)系運(yùn)算算符括括號運(yùn)算算符子程序調(diào)調(diào)用符數(shù)數(shù)組操作作符循環(huán)操作作符等。。特別地,,成對的的運(yùn)算符符,例如如“begin…end””、“for……to””、“repeat…until”、、“while…do”、“if……then…else”、““(…))”等都當(dāng)做單一運(yùn)運(yùn)算符。。
運(yùn)算對象象包括變變量名和和常數(shù)。。實(shí)際的Halstead長度設(shè)N1為程序中中實(shí)際出出現(xiàn)的運(yùn)運(yùn)算符總總個(gè)數(shù),,N2為程序中中實(shí)際出出現(xiàn)的運(yùn)運(yùn)算對象象總個(gè)數(shù)數(shù),N為實(shí)際的的Halstead長度,則則有N=N1+N2程序的詞詞匯表Halstead定義程序序的詞匯匯表為不不同的運(yùn)運(yùn)算符種種類數(shù)n1和不同的的運(yùn)算對對象種類類數(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它表明了了程序在在詞匯上的的復(fù)雜性性。其最小小值為V
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度飲用水安全科普教育與宣傳合同
- 二零二五年度事業(yè)單位解聘合同模板(法律事務(wù)人員適用)
- 二零二五年度食品區(qū)域代理品牌保護(hù)與維權(quán)合同
- 2025年度智能空調(diào)清洗安全操作規(guī)范協(xié)議
- 二零二五年度貸款購車車輛登記過戶委托協(xié)議
- 二零二五年度臨時(shí)工崗位調(diào)動(dòng)及服務(wù)期限合同
- 二零二五年度特色鄉(xiāng)村自建房贈與與文化創(chuàng)意產(chǎn)業(yè)融合發(fā)展協(xié)議
- 二零二五年度終止租賃商鋪?zhàn)赓U合同終止協(xié)議書
- 二零二五年度文化創(chuàng)意產(chǎn)品居間合同介紹費(fèi)及傭金細(xì)則
- 二零二五農(nóng)村宅基地買賣與農(nóng)村土地整治合作合同
- 能力素質(zhì)模型的正確打開方式(分享)
- 2024年河北省公務(wù)員錄用考試《行測》真題及答案解析
- 安保服務(wù)行業(yè)市場調(diào)研分析報(bào)告
- 吉林大學(xué)《微積分AⅠ》2021-2022學(xué)年第一學(xué)期期末試卷
- 現(xiàn)代家政導(dǎo)論-課件 6.1.1認(rèn)識道德與職業(yè)道德
- 《建筑工程施工許可管理辦法》2021年9月28日修訂
- 北京市東城區(qū)2022-2023學(xué)年高三上學(xué)期期末考試地理試卷 含答案
- 普通話培訓(xùn)教案1(共5篇)
- 大慶醫(yī)學(xué)高等??茖W(xué)校單招參考試題庫(含答案)
- 國有企業(yè)內(nèi)部控制的問題與改進(jìn)措施
- 綿陽市三臺縣鄉(xiāng)鎮(zhèn)地圖矢量可編輯課件行政區(qū)劃邊界高清(四川省)
評論
0/150
提交評論