資源描述:
《程序軟件結(jié)構(gòu)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、程序規(guī)劃方法漫談程序匠人一、前言“程序設(shè)計(jì)”的真諦是什么?許多初學(xué)者的理解是“寫代碼”。但是,在匠人看來,把“程序設(shè)計(jì)”理解為“寫代碼”,就像把“電路設(shè)計(jì)”理解為“畫PCB”一樣。新手們苦惱的問題是,他們只會(huì)“寫代碼”。他們一接到新的項(xiàng)目,總是在第一時(shí)間就爬到鍵盤上去敲代碼。新手們的精力總是比較旺盛,他們加班加點(diǎn),兩天就把所有代碼敲完。然后他們會(huì)用十倍或幾十倍以上的時(shí)間去調(diào)試,中間伴隨著幾次三番的推倒重來。最后,他們交出一個(gè)勉強(qiáng)能跑的程序。這種程序,外行乍一看,覺得還行;內(nèi)行乍一看,卻是嚇出一身冷汗!這也許不能怪新手
2、們,因?yàn)樗麄兊睦蠋熯€沒有來得及教會(huì)他們“程序設(shè)計(jì)”的一些方法。他們甚至還沒有學(xué)會(huì)寫注釋,就已經(jīng)畢業(yè)了。于是他們只能在畢業(yè)后的工作中,去完成這段本該在學(xué)校里完成的修煉。要說到程序設(shè)計(jì),最重要的一種方法,就是“多思考”。偏偏這又是最難手把手地教的。在此,匠人介紹一些設(shè)計(jì)時(shí)比較常用方法給大家。我們可以借助這些方法來對(duì)程序進(jìn)行更高效、更多維的規(guī)劃。二、程序流程圖1、從一個(gè)簡(jiǎn)單的流程圖說起我們先來看看這個(gè)圖(參見圖1.1:一個(gè)程序流程圖例子)。許多人都很熟悉,它的名稱叫“流程圖”,或者“程序流程圖”。流程圖是一種傳統(tǒng)的算法表示
3、法,程序流程圖是人們對(duì)解決問題的方法、思路或算法的一種描述。它利用圖形化的符號(hào)框來代表各種不同性質(zhì)的操作,并用流程線來連接這些操作。2、流程圖的作用流程圖簡(jiǎn)單直觀,應(yīng)用廣泛,功能卓越。在程序的規(guī)劃階段,通過畫流程圖,可以幫助我們理清程序思路。尤其是在非結(jié)構(gòu)化的匯編語言中,流程圖的重要性不言而喻。在程序的調(diào)試、除錯(cuò)、升級(jí)、維護(hù)過程中,作為程序的輔助說明文檔,流程圖也是很高效便捷的。另外,在團(tuán)隊(duì)的合作中,流程圖還是程序員們相互交流的重要手段。閱讀一份簡(jiǎn)明扼要的流程圖,比閱讀一段繁雜的代碼更加易于理解。3、流程圖的基本畫法
4、按道理,畫流程圖應(yīng)該是每個(gè)程序員的基本功。匠人驚訝的是,居然有那么多人不會(huì)或不屑于畫流程圖。在這里,匠人羅列出一些流程圖中常用的符號(hào)(參見圖1.2:常用的流程圖符號(hào))。細(xì)心的讀者會(huì)發(fā)現(xiàn),這里給出的一些流程圖符號(hào)與教科書上的有點(diǎn)出入。比如說符號(hào)D(條件判斷框),書上給出的一般都是四角菱形的,而不是匠人推薦使用的六角菱形。匠人在實(shí)踐中發(fā)現(xiàn),容納同樣多的文字,六角菱形比四角菱形可以節(jié)省更多的空間。這也就意味著我們可以在同樣大小的幅面內(nèi)畫出更多的內(nèi)容。因此,除非是您公司里有明文規(guī)定必須使用四角菱形,否則就讓教科書見鬼去吧。另
5、一個(gè)不同點(diǎn),就是如果程序中要調(diào)用一個(gè)子程序,那么最好給這個(gè)子程序一個(gè)特別的符號(hào),就像符號(hào)C(調(diào)用子程序框)。這樣做的好處是可以更有利于閱讀。4、畫流程圖軟件匠人推薦用Visio軟件來畫流程圖。這款軟件功能非常強(qiáng)大,而畫流程圖只是它眾多功能中的一個(gè)。您只需新建一個(gè)Visio文件,點(diǎn)擊菜單“文件”-〉“形狀”-〉“流程圖”-〉“基本流程圖”,就可以得到許多現(xiàn)成的流程圖符號(hào)。在Visio畫好的流程圖,可以很方便地復(fù)制到Word環(huán)境中。并且可以在Word中進(jìn)一步進(jìn)行修改編輯。當(dāng)然,如果您只是偶然畫流程圖,也可以用Word或E
6、xcel軟件的畫圖功能來實(shí)現(xiàn)。它們一樣可以畫流程圖,只是沒有那么專業(yè)罷了。5、流程圖的結(jié)構(gòu)化早期的非結(jié)構(gòu)化語言中都有類似“goto”的語句。它允許程序從一個(gè)地方直接跳到另一個(gè)地方去。而隨著C語言的盛行,對(duì)程序的結(jié)構(gòu)化要求,必然在流程圖中得到體現(xiàn)。經(jīng)過研究,人們發(fā)現(xiàn)任何復(fù)雜的程序算法,都可以分解為順序、選擇(分支)和循環(huán)這三種基本結(jié)構(gòu)?;窘Y(jié)構(gòu)之間可以并列、嵌套,但不允許交叉跳轉(zhuǎn)。我們構(gòu)造一個(gè)算法的時(shí)候,也僅以這三種結(jié)構(gòu)為構(gòu)成單位,并遵守三種基本結(jié)構(gòu)的規(guī)范。如果說“goto”是孫悟空的“筋斗云”,那么“結(jié)構(gòu)化”就是“如
7、來神掌”。也就是說,不管你如何翻騰,也不能從一個(gè)結(jié)構(gòu)直接跳轉(zhuǎn)到另一個(gè)結(jié)構(gòu)的內(nèi)部去。呵呵!這就是結(jié)構(gòu)化編程的要求。它的好處就是結(jié)構(gòu)清晰,易于正確性驗(yàn)證,易于糾錯(cuò)。既然整個(gè)算法都是由三種基本結(jié)構(gòu)組成的,那么,我們只要掌握這三種結(jié)構(gòu)的流程圖畫法,就可以畫出任何算法的流程圖,無往而不利了。(1)順序結(jié)構(gòu)順序結(jié)構(gòu)是簡(jiǎn)單的線性結(jié)構(gòu),每條語句按順序執(zhí)行(參見圖1.4:順序結(jié)構(gòu))。太簡(jiǎn)單了,實(shí)在沒啥好說。(2)選擇(分支)結(jié)構(gòu)選擇(分支)結(jié)構(gòu)是對(duì)某個(gè)給定條件進(jìn)行判斷,條件為“真”(滿足)或?yàn)椤凹佟保ú粷M足)時(shí),分別執(zhí)行不同的程序語句
8、。當(dāng)條件不滿足時(shí),有時(shí)需要執(zhí)行一些語句,而有時(shí)可能什么都不做,由此分化出兩種形態(tài)。(參見圖1.5:選擇(分支)結(jié)構(gòu))對(duì)于簡(jiǎn)單的選擇(if)結(jié)構(gòu),條件判斷的結(jié)果只有Yes和No兩種。而在更復(fù)雜的選擇結(jié)構(gòu)中,比如說對(duì)某個(gè)表達(dá)式的值進(jìn)行多重條件判斷,結(jié)果就會(huì)有許多。假設(shè)這個(gè)表達(dá)式可能=0、1、2、3、或者溢出,那么結(jié)果就有5個(gè)分支,我們可以用4個(gè)選擇