軟件開發基本知識

一、軟件的概念
1、軟件:是計算機系統中與硬件相互依存的部分,它包括程序、數據及相關文檔的完整集合。其中
Ø 程序-是按照事先設計的功能和性能的要求執行的指令序列
Ø 數據-是使程序正常操縱信息的數據結構
Ø 文檔-是程序開發、維護和使用有關的圖文資料
2、軟件分類(按功能劃分)
Ø 系統軟件:如操作系統、數據庫管理系統、設備驅動程序等
Ø 支撐軟件:協助用戶開發軟件的工具性軟件,如微軟可視化開發平臺工具
Ø 應用軟件:爲特定目的服務的軟件,如財務管理軟件。
二、軟件工程和軟件開發
1、 軟件工程
Ø 一系列完善的工程化原則。
軟件工程是爲經濟地獲得能夠在實際機器上有效運行的可靠軟件而建立和使用的一系列完善的工程化原則。
Ø 軟件工程是開發、運行、維護和修復軟件的系統方法。
1983年,IEEE(電氣和電子工程師學會)作出定義,軟件工程是開發、運行、維護和修復軟件的系統方法。軟件定義爲:計算機程序、方法、規則、相關的文檔資料以及在計算機上運行時所必須的數據。
Ø 主要思想是強調軟件開發過程需要英語工程化的原則。
2、 軟件的生存週期
按照軟件工程的過程(plan, do,check, action)即軟件規格說明、軟件開發、軟件確認,軟件演進,進一步展開,軟件的生存週期包括6個階段
(1) 制定計劃
(2) 需求分析
(3) 軟件設計
(4) 程序編寫
(5) 軟件測試
(6) 運行和維護
3、 軟件開發
開發階段有三個相互關聯的步驟組成,即設計、實現(編碼)、測試。
三、各個階段的目標和主要工作
制定計劃
管理層面的內容。
Ø 制定待開發軟件系統的總目標,給出它的功能、性能、可靠性以及接口等方面的要求;
Ø 研究完成該項軟件任務的可行性,探討解決問題的可能方案;
Ø 制定開發實施計劃,可行性研究報告。
需求分析
對待開發軟件提出的需求進行分析並給詳細定義出
需求分析的目標:
Ø 是深入描述軟件的功能和性能,確定軟件設計的約束、軟件同其它系統元素的接口細節,
Ø 分析階段只確定軟件系統要“做什麼”,
Ø “怎麼做’有後續的設計階段完成。對算法的詳細描述也是在設計階段給出。
Ø 定義軟件的其它有效性需求。
需求分析的任務:
Ø 通過與用戶的合作,瞭解用戶對待開發系統的要求;
Ø 根據用戶的要求的系統所在的信息域的調查、分析,確定系統的邏輯模型;
Ø 對求解的問題做適當的分解,使之適合於計算機求解。
需求分析工作的內容:
數據建模:
包括3種相互關聯的信息,即數據對象、描述對象的屬性、描述對象間相互鏈接的關係。用數據流圖描述系統數據流的變換和流向,用數據詞典定義數據流圖中出現的數據流、數據文件、加工和處理,用判定表表示覆雜條件和動作組合情況。
功能建模和數據流:
目標系統被表示成“輸入信息-》目標系統-》輸出信息”,系統的功能體現在覈心數據變換中。功能建模的思想就是用抽象模型的概念,按照軟件內部數據傳遞、變換的關係,自頂向下逐層分解,直到找到滿足功能要求的所有可實現的軟件爲止。功能建模表達數據的運動情況和數據流的變換。
行爲建模:給出需求分析方法的所有操作原則。描述系統或對象的狀態、導致狀態改變的事件,從而描述系統的行爲。
軟件設計•需求轉換成體系結構,對每個模塊具體描述。
Ø 需求轉換成體系結構,對每個模塊具體描述。
軟件設計是一個把軟件需求變換爲軟件表示的過程。把已確定的各項需求轉換成相應的體系結構,進而對每個模塊需完成的工作進行具體描述。最初這個表示只是描述出可直接反映功能、數據、行爲需求的軟件的總框架,然後進一步細化,在此框架中填入細節,把它加工成程序細節上非常接近與源程序的軟件表示。
Ø 軟件設計是解決“怎麼做“的問題。
軟件分析階段已經完全弄清楚了軟件的各種需求,軟件設計是解決“怎麼做“的問題。
Ø 軟件設計的內容
根據分析模型中用數據、功能、行爲模型所表示的需求,採用相應設計方法進行概要設計(數據設計、體系結構設計、接口設計)和詳細設計(過程設計)。
n 概要設計:
將軟件需求轉化爲數據結構和軟件的系統結構,並建立接口,建立整個系統的體系結構框架,並給出了系統中的全局數據結構和數據庫接口、人-機接口,與其它的硬件、軟件的接口。
此外還從系統全局的角度,考慮處理方式、運行方式、容錯方式以及系統維護等方面的問題,奠定整個系統實現的基礎,沒有概要設計直接考慮程序設計,就不能從全局把握軟件系統的結構和質量,容易造成程序結構劃分不合理,導致系統處於一種不穩定的狀態。這個階段應着重解決實現需求的程序模塊劃分問題。(數據設計、體系結構設計、接口設計)
數據設計:
把需求中的對象和關係,以及數據詞典中描述的詳細數據內容轉化爲數據結構的定義。
數據設計的過程:
1、爲在需求分析階段所確定的數據對象選擇邏輯表示,需要對不同的結構進行算法分析,以便選擇一個最有效的設計方案。
2、確定對邏輯數據結構所必須的操作模塊,以便限制或確定各個數據設計決策的影響範圍。
數據設計的原則:
1、考慮幾種不同的數據方案,考慮給後期設計帶來的影響
2、確定所有的數據結構和每種數據結構上施加的操作
3、應當建立一個數據詞典。即表示數據項和控制項的特性,明確定義各種信息項。
比如
存摺=戶名+所號+帳號+開戶日+性質
戶名=2{字母}24 //至少出現2個字母,最多出現24個
所號=’’001”..”999”//儲蓄所編碼規定爲3位數
開戶日=年+月+日
性質=’1’..”6”//1表示普通用戶,5表示工資用戶等等
4、 逐步細化方法應用於數據設計
底層數據的設計推遲到設計過程的後期,將逐步細化方法應用於數據設計,即需求分析階段確定總體數據組織,概要設計階段加以細化,詳細設計階段才規定具體細節。
5、程序設計語言應當支持數據類型的定義和實現。
清晰的信息定義是軟件開發成功的關鍵。
附 數據設計相關內容講解
 在計算機發展的初期,計算機主要用於數值計算,處理的是數值數據,而且數據量小,結構簡單,形式統一。隨着計算機技術的發展,計算機應用領域的擴大,越來越多的非數值數據需要處理,數據的概念也被大大推廣,數字、字符、圖像、聲音都可屬於數據的範疇。與數值數據相比,非數值數據的結構比較複雜,其計算機表示也比較麻煩。
  只有對數據內部的結構關係以及數據在計算機內如何存儲和操作進行深入的研究,才能設計出高效可靠的程序,實現對數據的有效處理。
1、 數學模型
  用計算機解決一個實際問題,首先必須從具體問題抽象出一個適當的數學模型,用這個數學模型應能得出該問題的精確或近似解。然後確定數學模型的計算方法,根據問題的具體要求,可在已知的各種算法中選擇一種合適的算法或另設計一種新的算法。接下來就是用某種程序設計語言爲確定的算法編制計算機程序,同時準備好作爲程序處理對象的各種數據。再接下來就開始程序的調試運行,用一些典型的數據和描述邊界條件的數據對程序進行測試,以便發現和糾正程序中的錯誤,錯誤的糾正可能導致前面步驟的多次反覆。最後,在程序調試達到所要求的質量標準之後,就可正式投入運行,最終在計算機上得出問題的解。
  建立實際問題的數學模型是計算機應用必須首先進行的工作,也是一項很重要的工作。
  常見的數學模型可分爲數值計算和非數值計算兩大類。許多實際問題數學抽象的結果是數學方程。這些數學方程可以用解析的方法求出精確解,或者用模擬的方法求出近似解。但是更多的實際問題無法用數學方程來描述,這些問題所求的不是某個數值,而是某種檢索的結果,某種排列的狀態,某種轉換後的形式,某種設計的表示……這些問題的數學模型不是用數學方程,而是用一種數據結構來描述數據以及數據之間的相互關係。
2、數據結構的概念
數據是對客觀事物的名稱、數量、特徵、性質的描述形式(即編碼),是計算機所能處理的一切符號的總稱。數據既是計算機加工的對象,又是計算機的產品(計算結果)。例如,一個利用數值分析方法解代數方程的程序,其處理對象是整數和實數;一個編譯程序或者文字處理程序的處理對象是字符串。因此,對計算機科學來講,數據的含義很廣泛,比如圖形、圖象、色彩和聲音等都可以通過編碼而歸於數據的範疇。
  一般,我們對那些單個的孤立的數據並不感興趣,而着重研究由衆多數據元素組成的數據集合,研究集合中數據元素之間存在怎樣的內在聯繫,通常需要對數據和數據集合進行哪些運算(即對數據進行的處理),如何提高運算效率等等,這就引出了數據結構。
  數據結構裏包括一批數據,是數據的一個集合。這個集合中的每一個數據個體稱爲數據元素,它是數據的基本單位。一個數據元素又叫做一個數據結點,簡稱結點。
數據類型是指程序設計語言中所允許的變量的種類,也就是變量可以取的值和可以進行的運算的集合。可以把數據類型看成是在程序設計語言中已經實現了的數據結構。
  一個數據元素可以是簡單的,只有一個數據項,例如一個數,一個字符,一個名字等;也可以是複雜的,由若干數據項組成,一個數據結點由用來描述一個獨立事物的名稱、數量、特徵、性質的一組相關信息組成。例如,在設計處理學生成績問題的程序時,每個學生有關的數據項(域)構成一個數據結點,可能包括學生的姓名、學號、各科考試成績等等,學號可以作爲結點的關鍵字。在處理庫存商品問題時,一個數據結點對應一種商品的相關數據項,包括商品編號和名稱、規格、數量、生產廠家、單價、入庫日期等,商品編號可以作爲關鍵字。
數據結構是帶有結構特性的數據元素的集合,它研究的是數據的邏輯結構和數據的存儲結構以及它們之間的相互關係,並對這種結構定義相適應的運算,設計出相應的算法。
體系結構設計:
――定義軟件系統中各主要成分之間的關係。
事實上,軟件總是有體系結構的,不存在沒有體系結構的軟件。體系結構(Architecture)一詞在英文裏就是"建築"的意思。把軟件比作一座樓房,從整體上講,是因爲它有基礎、主體和裝飾,即操作系統之上的基礎設施軟件、實現計算邏輯的主體應用程序、方便使用的用戶界面程序。從細節上來看每一個程序也是有結構的。
Ø 結構化程序就是以語句組成模塊,模塊的聚集和嵌套形成層層調用的程序結構,也就是體系結構。
Ø 主要有三要素:程序構件(模塊)的層次結構、構件之間的交互方式,及數據的結構。
雖然軟件體系結構已經在軟件工程領域中有着廣泛的應用,但迄今爲止還沒有一個被大家所公認的定義。許多專家學者從不同角度和不同側面對軟件體系結構進行了刻畫,
Ø 軟件設計的一個目標就是建立軟件的體系結構表示。
體系結構經歷了一個由低級到高級的發展過程,有數據流系統、調用-返回系統、獨立構建系統、虛擬機等等。我們用C語言編制的軟件結構採用一種調用-返回式的。
Ø 解決了模塊劃分問題
軟件體系結構不僅指定了系統的組織結構和拓撲結構,並且顯示了系統需求和構成系統的元素之間的對應關係,提供了一些設計決策的基本原理
接口設計:
――根據數據流圖定義軟件內部各成分之間、軟件與其它協同系統之間以及軟件與用戶之間的交互機制。
n 詳細設計:
即過程設計(也叫程序設計),通過對結構表示進行細化,得到軟件的詳細數據結構和算法。要決定概要設計階段每個模塊的具體算法。
程序設計(過程設計):
Ø 把結構成分轉化爲軟件的過程性描述,滿足在編碼階段能夠根據過程性描述生成源程序代碼。
Ø 程序設計的任務:需要對程序採用的算法的邏輯關係進行分析,設計出全部必要的過程細節,並給予清晰的表達,使之成爲編碼的依據。
Ø 程序設計不同於編碼或編程。設計不是編碼,編碼也不是設計。
Ø 任何設計模型的抽象級別都比源代碼要高,在編碼階段做的唯一設計決策就是描述如何將過程設計轉換爲程序代碼的小的實現細節。相當於將一段漢語精確譯成英語的過程。
Ø 程序設計要決定軟件各個模塊的實現算法,並精確地表達這些算法。
各個模塊的算法涉及到軟件的功能和算法的設計,精確表達這些算法涉及到算法的描述和表達工具。
四、結構化程序設計
爲了有效地進行程序設計,不僅要掌握一門程序設計語言,還應該學會針對各類問題擬定出有效的解題方法和步驟——即算法設計。有了正確的算法,才能夠編制程序。算法的好壞,決定了程序的優劣,因此,程序設計的核心任務之一就是設計算法。
(一) 什麼是算法?
1算 法-程序的靈魂
Ø 廣義地講--算法是爲完成一項任務所應當遵照的一步一步的規則的、精確的、無歧義的描述,它的總步數是有限的。
Ø 狹義地講-- 算法是解決一個問題採取的方法和步驟的描述。
簡單地說,算法就是解決問題的辦法,是對特定問題求解步驟的詳細描述。所謂計算機能執行是指一個算法能不斷地被細化,最終能用計算機所能識別的命令來表達,進而被執行。所以,從計算機應用的角度來說,算法是用於求解某個特定問題的一些指令的集合。具體地說,我們用計算機所能實現的操作或指令,來描述問題的求解過程,(編碼)我們就得到了這一特定問題的計算機算法。
Ø 算法解決的是“做什麼”和“怎麼做”的問題
Ø 算法是靈魂,數據結構是加工對象 ,語言是工具
Ø 計算機算法設計:設計出計算機解決具體問題的詳細步驟,並且將全部的解題過程用某種計算機工具完整地描述出來。
隨着應用問題求解的目標不同以及解決具體應用問題的基本思路的不同,算法設計的思路也不同,即算法設計的基本方法不同。
Ø 算法的分類:數值算法和非數值算法
數值算法解決的是數值計算問題,包括方程和方程組的求解,微分積分的計算等;
非數值算法解決的是計算機或日常生活中的信息調度和管理問題,包括信息的組織與管理、信息優選等。
Ø 程序=算法+數據結構
我們利用計算機解決各種問題,算法是至關重要的。沒有算法或沒有計算機算法,我們對要解決的問題就無從下手。
  計算機解決問題不但要依賴於算法,而且會涉及到大批數據。數據的組織和存儲會直接影響算法的實現方式和效率。
  人們在處理複雜問題時,總要利用抽象這個思維工具。抽象是抓住問題的實質,而忽略問題的次要部分;注意事物的普遍規律,或共性的東西。
  算法和數據結構是人們用計算機解題時所作的兩種抽象:算法是從計算機的操作角度對解題過程的抽象;數據結構是從如何組織處理操作對象的角度進行的抽象。這兩種抽象互相依賴、互相補充,最大限度地減低問題的複雜性。
  在這兩個方面的基礎上,人們開發出運行效率較高的各種應用程序。因此,在—定意義上,人們認爲:程序=算法+數據結構
Ø 程序設計=算法+數據結構+程序設計方法+程序設計開發工具
除了算法和數據結構之外,程序設計方法對程序設計也是重要的,它影響到程序設計的成敗及程序設計質量。隨着計算機解決的問題越來越複雜,計算機本身的運算速度越來越快,內存容量也越來越大,程序設計已決不是程序員個人技巧的“手工藝品”。程序設計要遵循一定的開發方法及思想,如結構化設計方法,模塊化程序設計方法、自頂向下的逐步細化的方法、面向對象的程序設計方法等,要按照工程管理的方法去進行軟件開發,即用軟件工程的思想及方法去進行軟件開發。所以可以進一步說:程序設計=算法+數據結構+程序設計方法+程序設計開發工具
(二)爲什麼程序需要控制?
Ø 有非常明確的預期,順序的擬訂步驟
生活中我們如果對整個事情的處理過程有非常明確的預期沒有任何意外發生的話,就不需要任何判斷,我們可以分爲幾個順序的擬訂步驟依次完成而達到目標。
Ø 如果沒有確定的目標,需要給出判斷條件來控制計算機去執行確定的任務,這就是爲什麼計算機有分枝的理由。
如果沒有確定的目標,我們可能就發生的情況作出下一步行動的判斷,如乘公共汽車到火車站,不知道公共汽車在哪裏,到一個路口沒找到,會到另一個路口找。
作爲計算機在處理複雜而變化的問題時,由於它不能自己判斷隨即發生的情況而修改自己的行爲,它只是按照人事先作出嚴謹的設計,給出判斷條件來控制計算機去執行確定的任務,這就是爲什麼計算機有分枝的理由。分支就是就需要編程者事先估計到各種可能性的發生,讓程序接下來有什麼樣的走向和選擇,要求程序員要料事如神而不是程序料事如神,所以程序設計人員需要嚴謹的素質。
Ø 計算機擅長的是邏輯推理和計算,我們很多問題需要反反覆覆的重複工作才能解決,枯燥而浪費時間,計算機卻能以極高的速度把人們從繁重的腦力勞動中解放出來。
無論是選擇運行還是重複運行,都需要設計程序者實現對程序步驟進行判斷控制,
在結構化設計方法之前,這種控制流的轉向是任意性的,用傳統流程圖表示(p23,圖 2.13)這種算法稱爲BS型算法
在程序語言中是用GOTO語句實現控制路徑,
轉向的任意性使得GOTO語句氾濫使用,程序路徑複雜而混亂,難以理解算法的邏輯。
爲了從程序的控制結構入手消除不適應的容易混亂的GOTO語句。
1965年E.W.Dijkstra在一次會議上提出應該把GOTO語句從高級語言中去掉,
1966年,Bohra和jacopini證明了任何單入口單出口沒有死循環的程序都可以由三種基本的控制結構構造出來。這三種基本結構就是(1)順序就構(2)選擇結構(包括單選擇if…else型和多選擇case型) (3)重複結構(包括當型while ..do型和直到型do..while型),使用這三種控制結構的程序叫結構化程序。
(三)、算法的描述
圖形工具、表格工具、語言工具等3類
Ø 圖形工具包括:程序流程圖、NS圖、PAD圖、HIPO圖(Hierarchy plus input process output)等
Ø 表格工具:判定表
Ø 語言工具:PDL(program design language)僞碼、自然語言
1、程序流程圖
程序流程圖描述程序中,控制流的情況,即程序中處理(指令)的執行順序和執行序列所依賴的條件,有向線段(流線)表示的是控制流,從一個處理走到另一個處理。
程序流程圖比較適合於彙編語言的編程。
流程圖描述非結構化程序(傳統程序流程圖)
流程圖獨立於程序設計語言,直觀、清晰、易於學習,但也有一些缺點,表示程序控制流程的箭頭可以不受約束隨意轉移控制。
流程圖中的符號(見幻燈片)
流程圖描述結構化程序(結構化程序流程圖)
爲使流程圖描述結構化程序,只使用以下五種控制結構。見幻燈片,舉例從10個數中選出最大的數見幻燈片
2、N-S圖(盒圖)
美國學者Nassi和Shneiderman提出,結構見幻燈片圖,舉例從10個數中選擇最大的數,見幻燈片。
3、 代碼表示法
僞代碼是介於自然語言和計算機語言之間的文字和符號來表示算法。如同一篇文章,自上而下地寫下來,每一行或幾行表示一個基本操作。用僞代碼
不用圖形符號,一般計算機語言中具有語句關鍵詞可用英文表示,其它可用漢語或英語表示,總之便於書寫和閱讀爲原則,用僞代碼寫算法一般沒有固定的嚴格的語法要求,只要意思表達清楚,這是目前常用的方式,特別是學會c語言後,可以適當按照c語言的語法規則先概略描述,然後逐步細化描述,時間長了,能夠訓練自己達到“Thinking in C”的思維能力。
4、計算機語言表示算法
即程序編寫(編碼),已經不是“設計”的範圍,而是實現的階段,要嚴格遵循使用的計算機語言的語法規則,如用C語言編寫程序要遵循C語言的語法規則,這些規則正是本課程的學習內容。
算法的描述方法綜述(見幻燈片)

(四)、結構化程序設計
1、結構化程序設計主要包括兩方面:
(1) 在編寫程序時,強調使用幾種基本控制結構,通過組合嵌套,形成程序的控制結構。儘可能避免使用GOTO語句。
(2) 在程序設計過程中,儘量採用自頂向下和逐步細化的原則,由粗到細,一步步展開。
表現在詳細設計和編碼階段,應當採取自頂向下、逐步求精的方法,把一個模塊的功能逐步分解,細化爲一系列具體的步驟,進而翻譯成一系列用程序語言寫成的程序。
對“自頂向下和逐步細化的原則,由粗到細,一步步展開”的理解
對於程序的描述而言(無論是前面給出的日常生活實例中的非形式的“程序”,還是希
望計算機去執行的程序),還有幾個重要的問題值得提出:
可以寫在程序裏的基本“指令”包括哪些?洗臉、查書目等是前面日常生活中的“程序”
裏的基本動作。在編寫需要計算機去執行的程序時,其中的基本動作應該是計算機能完成的
事項。例如,要寫前面那樣的二進制代碼形式的程序,就需要按照具體計算機指令系統的規
定寫出一條條指令。用一種高級語言寫程序時,同樣必須基於這種語言所支持的基本功能(基
本命令等等)。學習用高級語言寫程序,一個最基本的方面就是了解語言所提供的基本功能,
瞭解它們的描述形式和所完成的操作效果。
對於描述程序的語言有什麼要求?描述前面有關日常生活的“程序”時採用的是漢語,
是我們日常用於人際交流的“自然語言”。自然語言詞彙豐富,有極強的表達能力。但在許
多地方要依賴於接受者的知識和常識。如果,要求孔子按照前面給出的程序到圖書館去借書,他不可能理解其中的動作,也無法執行它去把書借來。自然語言的描述常常很不精確,許多
疏漏需要靠接受者用自己的知識去填補。這種情況可以大大提高信息的傳遞效率,但也帶來
誤解的可能性。送給計算機使用的程序必須採用計算機能處理的記法形式,其描述工具(語
言)必須是精確的,無歧義的。程序設計語言都必須滿足這些要求。
一個程序可能在不同的層次上描述。看看有關刷牙的例子。前面只用一個詞描述這一動作。但如果仔細想想,刷牙也是一個很複雜的過程。例如,我們還可以進一步將其分解描述爲取杯子、裝水、取牙刷、擠牙膏、漱口、刷牙、清洗牙齒等一系列細節動作。還可以進一步將這一層面上的每個動作分解爲一系列的肌肉伸縮動作。
應當將程序的細節分解到哪個層次,一方面要看程序語言所提供的基本功能。此外,程序的描述方式也要照顧到人的需要。複雜的程序可能需要成千上萬,甚至成百萬或千萬行高級語言代碼。簡單地在高級語言基本層面上描述程序同樣會顯得層次太低,使程序的意義難以把握,難以保證它能實現所預想功能,難以修改程序去滿足新的需要,如此等等。因此,在開發複雜的程序時,我們需要提供更高的描述層次,將程序的功能在各個層次上分解描述。就像我們看到極長的一系列有關肌肉伸縮動作的描述,很難理解這裏所做的是刷牙一樣。隨着程序變得越來越複雜,其組織結構問題也變得更加重要了。
還是用一個生活中的例子來說明問題。對於學生早上起牀後的活動,首先應該在很高的
層次上描述,就像前面所給出的:
1,起牀;
2,刷牙;
3,洗臉;
4,喫飯;
5,早自習;
這樣就把一個複雜的程序分解成爲若干相對簡單一些的部分了。如果需要進一步細節化,那麼我們就降到下一個細節層次,將一個高層動作分解爲一系列低層的基本動作。例如,可能將“喫早飯”這一高層動作分解爲下面動作序列:
早起活動
起牀
喫早飯
洗臉
刷牙
早讀
拿飯碗;
去食堂;
排隊買飯;
喫飯;
刷碗;
離開食堂;
必要時再做進一步分解。例如,將“排隊買飯”分解爲“排隊、選飯、選菜、付款”等。在這種分解描述的過程中,我們還應該保留前面構造出的抽象描述的層次。這種層次結構不但有利於人們理解程序的細節過程,也有利於發現程序中的錯誤,還能使所得程序易於根據需要去修改。例如,學校的食堂改爲快餐份飯,由於整個程序被按照分解爲一些具有邏輯獨立性的部分,修改起來也就更容易了。
編程序時所需要掌握的恰恰就是這種工作方式。我們需要從問題的要求出發,從高層開
始設計程序,並逐步分解程序功能。當將程序所需功能分解到一定的細節程度之後,就可以
藉助於程序語言的結構,描述程序工作中的細節步驟了。本書將不斷討論這方面的問題。在
學習程序設計的過程中,也必須學習分析和構造程序的正確方法。
具體的計算機程序細化舉例見幻燈片
2、結構化程序設計的主要原則
n 使用語言中的順序、選擇、重複等有限的基本控制結構表示程序邏輯。
n 選用的控制結構只准許有一個入口和一個出口。
n 程序語句組成容易識別的塊,每塊只有一個入口和一個出口。
n 複雜結構應該用基本控制結構進行組合嵌套來實現。
n 語言中沒有的控制結構,可用一段等價的程序段模擬,但要求該程序段在整個系統中應前後一致。
n 嚴格控制GOTO語句,僅在下列情形纔可使用:
① 用一個非結構化的程序設計語言去實現一個結構化的構造。
② 若不使用GOTO語句就會使程序功能模糊。
③ 在某種可以改善而不是損害程序可讀性的情況下
五、軟件設計的原則
1抽象化
在進行模塊設計的時候可以有不同的抽象層次
(1)過程抽象
從系統定義到實現,每進展一步都可以看作對軟件解決方案的抽象化過程的一次細化。在軟件需求分析階段,“問題所處環境爲大家所熟悉的術語”來描述軟件解決方法,然後到概要設計、詳細設計,抽象層次逐步降低。
(2)數據抽象
與過程抽象一樣可以在不同層次上描述數據對象的細節。
(3)控制抽象
控制抽象可以包含一個程序控制機制而無需規定內部細節,如操作系統中,採用同步信號的方式協調某些活動。
2、自頂向下,逐步細化
這是Niklaus Wirth提出的設計策略,將軟件體系結構按自頂向下的方式,對各個層次的過程細節和數據細節逐層細化,直到用程序設計語言的語句能夠實現爲止。
3、模塊化
軟件系統的層次結構正是模塊化的具體體現。就是說,整個軟件被劃分爲若干單獨命名和可編址的部分,成爲模塊。
對於一個大問題總體複雜,把它分解成爲一些獨立的小問題易於處理。但當模塊數增加,模塊間的聯繫就會加大。把模塊連接起來的工作量就會加大,要尋找平衡。
4、控制層次(程序結構)
往往用程序的層次結構來表示,位於最上層是頂層模塊是主模塊,下面的是下屬模塊,一層層分下去。
程序結構的深度:程序結構的層次數,反映了程序結構的規模和複雜程度
程序結構的寬度:同一層模塊的最大模塊個數
模塊的扇入和扇出:扇出表示一個模塊直接調用其它模塊的數目,扇入是一個給定模塊有模塊來調用它,多扇入的模塊一般設計成公用模塊。
5、結構劃分
程序結構可以按照水平方向或垂直方向進行劃分。
水平方向劃分按照主要的程序功能來定義模塊結構的各個分支。頂層模塊(M)作爲控制模塊,控制協調下面的功能模塊之間的通信和運行,下級模塊(A、B、C)簡單的功能劃分是建立:輸入-》處理(數據變換)-》輸出。
6、數據結構
數據結構是數據之間邏輯關係的一種表示,數據結構設計應確定數據的組織、存取方式、信息的不同處理方法。數據結構的組織方式和複雜程度靈活多樣,但典型的數據結構種類是有限的,它們是構成那些更復雜結構的基本構件。
(1)標量:最簡單的一種數據結構,標量項就是單個的數據元素,入布爾量、整數、實數或字符串。可以通過名字對它們進行存儲。
(2)順序向量(一維數組):若干個標量項組織成一個表或者連接成一個組,可以擴展爲二維、三維、四維…..n維
(3)鏈表:是一種更靈活的數據結構,它把物理上不相鄰的標量項、向量、或空間結構用指針鏈接起來。
(4)組合數據結構:把上述的標量項、向量或n維空間可以構造結構體數據,也可以把各種數據結構用多重鏈表建立分層結構和網絡結構。
7、軟件過程
Ø 就是模塊內的詳細設計過程,
程序結構描述了程序的控制層次關係,和各個部分的接口情況,這裏着重描述各個模塊的處理細節。
Ø 它也是層次化的。
8、信息隱藏
如何分解一個軟件才能得到最佳的模塊組合,?需要了解信息隱藏。是指,每個模塊的實現細節對於其它模塊來說是隱藏的。所以有效的模塊化是通過獨立的模塊來實現,就是模塊之間數據上功能上沒有太大的聯繫,衡量獨立性的標準是模塊間的耦合和內聚。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章