結構化程序設計

結構化程序設計

結構化程序設計(structured programming)指具有結構性的編程方法,是進行以模塊功能和處理過程設計為主的詳細設計的基本原則。結構化程序設計是過程式程序設計的一個子集,它對寫入的程序使用邏輯結構,使得理解和修改更有效更容易。結構化程序設計的三種基本結構是:順序結構、選擇結構和循環結構。結構化程序設計曾被稱為軟體發展中的第三個里程碑。結構化程序設計通常使用自上往下的設計模型,開發員將整個程序結構映射到單個小部分。

概述


概念

其概念最早由E.W.Dijikstra在1965年提出的,是軟體發展的一個重要的里程碑。它的主要觀點是採用自頂向下、逐步求精及模塊化的程序設計方法;使用三種基本控制結構構造程序,任何程序都可由順序、選擇、循環三種基本控制結構構造。結構化程序設計主要強調的是程序的易讀性。

內容

詳細描述處理過程常用三種工具:圖形、表格和語言。
圖形:程序流程圖、N-S圖、PAD圖表格:判定表
語言:過程設計語言(PDL
結構化程序設計曾被稱為軟體發展中的第三個里程碑。該方法的要點是:
(1) 主張使用順序、選擇、循環三種基本結構來嵌套連結成具有複雜層次的“結構化程序”,嚴格控制GOTO語句的使用。用這樣的方法編出的程序在結構上具有以下效果:
a. 以控制結構為單位,只有一個入口,一個出口,所以能獨立地理解這一部分。
b. 能夠以控制結構為單位,從上到下順序地閱讀程序文本。
c.由於程序的靜態描述與執行時的控制流程容易對應,所以能夠方便正確地理解程序的動作。
(2)“自頂而下,逐步求精”的設計思想,其出發點是從問題的總體目標開始,抽象低層的細節,先專心構造高層的結構,然後再一層一層地分解和細化。這使設計者能把握主題,高屋建瓴,避免一開始就陷入複雜的細節中,使複雜的設計過程變得簡單明了,過程的結果也容易做到正確可靠。
(3)“獨立功能,單出、入口”的模塊結構,減少模塊的相互聯繫使模塊可作為插件或積木使用,降低程序的複雜性,提高可靠性。程序編寫時,所有模塊的功能通過相應的子程序(函數或過程)的代碼來實現。程序的主體是子程序層次庫,它與功能模塊的抽象層次相對應,編碼原則使得程序流程簡潔、清晰,增強可讀性。
(4)主程序員組。
其中(1)、(2)是解決程序結構規範化問題;(3)是解決將大化小,將難化簡的求解方法問題;(4)是解決軟體開發的人員組織結構問題。

模型

結構化程序設計通常使用自上往下的設計模型,開發員將整個程序結構映射到單個小部分。已定義的函數或相似函數的集合在單個模塊或子模塊中編碼,這意味著,代碼能夠更有效地載入存儲器,模塊能在其它程序中再利用。模塊單獨測試之後,與其它模塊整合起來形成整個程序組織。
程序流程遵循簡單的層次化模型,採用“for”、“repeat”、“while”等循環結構,鼓勵使用“Go To”語句。幾乎任何語言都能使用結構化程序設計技術來避免非結構化語言的通常陷阱。非結構化程序設計必須依賴於開發人員避免結構問題,從而導致程序組織較差。大多數現代過程式語言都鼓勵結構化程序設計。

基本結構


結構化程序設計的三種基本結構是:順序結構、選擇結構和循環結構。

順序結構

順序結構表示程序中的各操作是按照它們出現的先後順序執行的。

選擇結構

選擇結構表示程序的處理步驟出現了分支,它需要根據某一特定的條件選擇其中的一個分支執行。選擇結構有單選擇、雙選擇和多選擇三種形式。

循環結構

循環結構表示程序反覆執行某個或某些操作,直到某條件為假(或為真)時才可終止循環。在循環結構中最主要的是:什麼情況下執行循環?哪些操作需要循環執行?循環結構的基本形式有兩種:當型循環和直到型循環。
當型循環:表示先判斷條件,當滿足給定的條件時執行循環體,並且在循環終端處流程自動返回到循環入口;如果條件不滿足,則退出循環體直接到達流程出口處。因為是"當條件滿足時執行循環",即先判斷後執行,所以稱為當型循環。
直到型循環:表示從結構入口處直接執行循環體,在循環終端處判斷條件,如果條件不滿足,返回入口處繼續執行循環體,直到條件為真時再退出循環到達流程出口處,是先執行后判斷。因為是"直到條件為真時為止",所以稱為直到型循環。

設計方法


自頂向下

程序設計時,應先考慮總體,后考慮細節;先考慮全局目標,后考慮局部目標。不要一開始就過多追求眾多的細節,先從最上層總目標開始設計,逐步使問題具體化。

逐步細化

對複雜問題,應設計一些子目標作為過渡,逐步細化。

模塊化

一個複雜問題,肯定是由若干稍簡單的問題構成。模塊化是把程序要解決的總目標分解為子目標,再進一步分解為具體的小目標,把每一個小目標稱為一個模塊。
限制使用goto語句結構化程序設計方法的起源來自對GOTO語句的認識和爭論。肯定的結論是,在塊和進程的非正常出口處往往需要用GOTO語句,使用GOTO語句會使程序執行效率較高;在合成程序目標時,GOTO語句往往是有用的,如返回語句用GOTO。否定的結論是,GOTO語句是有害的,是造成程序混亂的禍根,程序的質量與GOTO語句的數量呈反比,應該在所有高級程序設計語言中取消GOTO語句。取消GOTO語句后,程序易於理解、易於排錯、容易維護,容易進行正確性證明。作為爭論的結論,1974年Knuth發表了令人信服的總結,並證實了:
(1)GOTO語句確實有害,應當盡量避免;
(2)完全避免使用GOTO語句也並非是個明智的方法,有些地方使用GOTO語句,會使程序流程更清楚、效率更高;
(3)爭論的焦點不應該放在是否取消GOTO語句上,而應該放在用什麼樣的程序結構上。其中最關鍵的是,應在以提高程序清晰性為目標的結構化方法中限制使用GOTO語句。

結構化編碼

所謂編碼就是把已經設計好的演演算法用計算機語言表示,即根據已經細化的演演算法正確寫出計算機程序。結構化的語言(如 Pascal,C,QBASIC等)都有與三種基本機構對應的語句。