簡述“自頂向下,逐步求精”——面向過程程式設計方法
引入
所謂“自頂向下,逐步求精”的程式設計方法,網路上有著如下的說法,一者是百度百科所述,另一者則為維基百科的說法。
自頂向下設計 :一種逐步求精的設計程式的過程和方法。對要完成的任務進行分解,先對最高層次中的問題進行定義、設計、程式設計和測試,而將其中未解決的問題作為一個子任務放到下一層次中去解決。這樣逐層、逐個地進行定義、設計、程式設計和測試,直到所有層次上的問題均由實用程式來解決,就能設計出具有層次結構的程式。
——百度百科
In computer science, divide and conquer is an algorithm design paradigm based on multi-branched recursion. A divide and conquer algorithm works by recursively breaking down a problem into two or more sub-problems of the same or related type, until these become simple enough to be solved directly. The solutions to the sub-problems are then combined to give a solution to the original problem.
——Wikipedia
個人看法
要說到“自頂向下”,那麼肯定是有著一個頂部的存在——就是一個或若干個複雜的大的問題。那麼將這複雜、大的問題劃分為小問題,找出問題的關鍵、重點所在,然後用精確的思維定性、定量地去描述問題,就是“自頂向下”方法的思路和體現。
至於“逐步求精”,那就是將現實世界的問題經抽象轉化為邏輯空間或求解空間的問題。複雜問題經抽象化處理變為相對比較簡單的問題。經若干步抽象(精化)處理,最後到求解域中只是比較簡單的程式設計問題。
其中,具體可分為以下幾鐘不同的抽象處理方式:
①順序結構
②選擇結構
③迴圈結構
而其中最複雜的要數迴圈結構,但這種方法卻是解決問題較為有效的一種方法,比如說它可以解決洗衣機執行的問題,而今日我就將用這種“自頂向下,逐步求精”的方法實現普通洗衣機執行程式的虛擬碼。
不過在這之前,我得先用一個簡單的例子來熟悉熟悉這一種方法。
例1:楊輝三角
例1:輸入一個數字n(1<=n<=10), 不在範圍內的n輸出“Out Of Range.\n” 輸出楊輝三角的前n行
為什麼我會選擇楊輝三角來充當本文的第一個例子而不選擇簡單的1+2+3+…+n這種問題來充當例子呢?
&esmp;很簡單,那種1加到100的問題逼格不夠,一看就是拿來敷衍的。(吐槽一發)
那麼,這個楊輝三角怎麼樣才能夠用程式碼實現呢?
方法有很多,因為這個數陣這麼多年來早已經被人類給摸得七七八八了:
規律:
從上圖可看出楊輝三角的幾個顯著特徵:
1. 每行數值左右對稱,且均為正整數。 2. 行數遞增時,列數亦遞增。 3. 除斜邊上的1外,其餘數值均等於其肩部兩數之和。
①先提一種較為直觀的方法, 楊輝三角與二項式定理有密切關係,即楊輝三角的第n行(n=0…MAX_ROW)對應二項式(a+b)n展開(Binomial Expansion)的係數集合。例如,第二行的數值1-2-1為冪指數為2的二項式(a+b)^2展開形式a^2 + 2ab + b^2的係數,即
組合後得到:
故 直接利用特徵3求解楊輝值,即第i行的第j個數等於第i-1行的第j-1個數與第j個數之和,用二維陣列形式表達即為a[i][j] = a[i-1][j-1] + a[i-1][j],通俗易懂簡潔。
程式碼實現:
1 void BasicYangHui(void)
2 {
3 int dwRow = 0, dwCol = 0, aTriVal[MAX_ROW][MAX_COL] = {{0}};
4
5 for(dwRow = 0; dwRow < MAX_ROW; dwRow++)
6 {
7 aTriVal[dwRow][0] = aTriVal[dwRow][dwRow] = 1; //若為i行0或i列,則i行j列楊輝值為1
8 }
9
10 for(dwRow = 2; dwRow < MAX_ROW; dwRow++)
11 {
12 for(dwCol = 1; dwCol < dwRow; dwCol++) //否則,i行j列楊輝值為i-1行中第j-1列與第j列值之和
13 aTriVal[dwRow][dwCol] = aTriVal[dwRow-1][dwCol-1] + aTriVal[dwRow-1][dwCol];
14 }
15
16 //輸出楊輝三角值
17 for(dwRow = 0; dwRow < MAX_ROW; dwRow++)
18 {
19 for(dwCol = 0; dwCol <= dwRow; dwCol++)
20 {
21 printf("%5d", aTriVal[dwRow][dwCol]);
22 }
23 printf("\n");
24 }
25 }
②我要是連陣列都懶得用呢,好的,也可以,這就需要繼續找規律咯(我貼出程式碼,至於規律,則是已深在其中)。
int main()
{
int s = 1, h; // 數值和高度
int i, j; // 迴圈計數
scanf("%d", &h); // 輸入層數
printf("1\n"); // 輸出第一個 1
for (i = 2; i <= h; s = 1, i++) // 行數 i 從 2 到層高
{
printf("1 "); // 第一個 1
for (j = 1; j <= i - 2; j++) // 列位置 j 繞過第一個直接開始迴圈
//printf("%d ", (s = (i - j) / j * s));
printf("%d ", (s = (i - j) * s / j));
printf("1\n"); // 最後一個 1,換行
}
getchar(); // 暫停等待
return 0;
}
如圖:
這就輕鬆完成了打出楊輝三角的程式碼部分。
等下,這題目不是還有個範圍嗎?好的,這就是此文要講述的自頂向下,逐步求精的方法。
剛才所列的是楊輝三角列印的原理程式碼部分,雖然看似已經解決了這個題目,但不要忘了,這僅僅只是題目的一部分,距離真正完成還是差了並不止一點哦。
回觀題目,【不在範圍內的n輸出“Out Of Range.\n”】,這一句,是與程式碼平行乃至更強的條件限制部分,因此在完成該任務的開始,就應分好層次,若n不在這個範圍,就直接跳出而列印“Out Of Range.\n”咯。(跳槽一下:反正也就那麼幾個不同的數,實在想不到規律的還不如直接打表哈哈!!!)
至此,任務完成咯。
例2:洗衣機
洗衣機作為日常生活中極其重要的電器,其操作定然是便於人們使用的,而如何使得人們操作它而感到方便舒適,則是程式設計者的任務!
若使用之前所述的“自頂向下,逐步求精”的方法,首先要做的,便是分析洗衣機所具有的功能,然後是這些功能操作所需要的過程,然後我們在分別對此以程式!
正常而言,一個洗衣機程式,不可缺少的必然有進水,洗滌(漂洗),排水,脫水等程式。
而將它們分別用程式碼實現,則又需要思考設計它們分別的實現方式,比如說,脫水的時間、進水的時間或量、以及洗滌時洗衣機滾軸的轉動方式等等。而思考到這一層之後,接下來進行的便是使用最簡單使實用的程式碼使之實現!!虛擬碼如下:
READ 使用者選擇模式
REPEAT 注水 UNTILL 水位=注水要求
REPEAT 浸泡 UNTILL 時間 = 時間要求
WHILE(電機啟動時間>0)
{ REPEAT
電機左轉3次
電機右轉3次
時間-1單位
}
ENDWHILE
WHILE(水位!=0)
排水
ENDWHILE
FOR(脫水時間>0)
電機轉動
脫水時間-1單位
ENDFOR
關閉電源
而設計完這些最基本的步驟,還需要的便是思考功能,比如說:快洗與普通洗的區別,再附以程式碼來實現之後組裝在一次就完成此專案咯。
結
本次對於程式設計方法原理的學習讓我對未來軟體設計充滿了希望,畢竟,一般而言,同等條件下,一個有方法的人總比沒有的要出色,是吧?
相關推薦
簡述“自頂向下,逐步求精”——面向過程程式設計方法
引入 所謂“自頂向下,逐步求精”的程式設計方法,網路上有著如下的說法,一者是百度百科所述,另一者則為維基百科的說法。 自頂向下設計 :一種逐步求精的設計程式的過程和方法。對要完成的任務進行分解,先對最高層次中的問題進行定義、設計、程式設計和測試,而將
自頂向下,逐步求精------一條程式設計的捷徑
引言 第一次聽到這個思想時,我覺得這和那些形而上的指導方針是一個套路,就是說來聽聽,沒有任何實際的應用價值。事實似乎也驗證了我的這個猜想,在開始學習碼程式碼的前兩個月,我從來沒有應用過這個思想,然而這也沒有給我造成什麼困擾。究其原因,大概就是題目簡單,程式碼不
淺談“自頂向下,逐步求精”
概念 “自頂而下,逐步求精”的設計思想,其出發點是從問題的總體目標開始,抽象低層的細節,先專心構造高層的結構,然後再一層一層地分解和細化。這使設計者能把握主題,高屋建瓴,避免一開始就陷入複雜的細節中,使複雜的設計過程變得簡單明瞭,過程的結果也容易做到正確可靠。
自頂向下,逐步求精
定義:(E.W.Dijikstra)在1965年提出的,是軟體發展的一個重要的里程碑。它的主要觀點是採用自頂向下、逐步求精的程式設計方法;使用三種基本控制結構構造程式,任何程式都可由順序、選擇、迴圈三種基本控制結構構造。是以模組化設計為中心,將待開發的軟體系統劃
深入 自頂向下 逐步求精 面向過程程式設計方法
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
深入 自頂向下 逐步求精 面向過程程式設計方法
程式設計初學者常常受困於不會想問題:“不知道讓計算機解決這個問題該如何做”。其實,程式設計師的一個基本功是,能夠將複雜的問題分解開來。學會分解任務,因超級大分為大的、中的、小的、超小的,直到能用很直接的方法解決。記住一個很管用的策略:自項向下,逐步求精。不管做何事,都拿這個
“自頂而下,逐步求精” 應用體會
作為我們程式設計的初學者,不知道如何把現實中的問題,直接轉換到計算機的高階語言中,這裡就需要我們轉換思路,應用一種新的形勢,將看似複雜的問題變得簡單,看似凌亂的步驟變得有序,看似十分精確的語句,一點一點突破。 在處理程式碼問題的時候,普通常用函式和程式碼的記憶
c++使用樸素遞迴演算法(自頂向下遞迴)和動態規劃dp(帶備忘的自頂向下,自底向上)解決鋼條切割及執行例項結果
本博文資料來源於演算法導論第三版 動態規劃有兩種等價實現方法:帶備忘的自頂向下發(topDownWithMemoization),自底向上方法,付出額外的記憶體空間來節省計算時間,是典型的時空權衡,遞迴時會儲存每個子問題的解 長度n與對應價格p關係 1~10的對應最
【軟體測試】簡述自頂向下和自底向上兩種整合測試方法
自頂向下的整合是從主控模組(主程式,即根結點)開始,按照系統程式結構,沿著控制層次從上而下,逐漸將各模組組裝起來。在從上向下的整合測試過程中,需對那些未經整合的模組開發樁模組。在整合過程中,可以採用
何謂"自頂向下",何謂"自底向上"
相信每一個coder都聽說過“自頂向下”以及“自底向上”這兩個名詞。 我也是很早就聽說過這兩個名詞,感覺是”不明覺厲”。 有一天,我打電話給一個做C語言開發的朋友說,我說我一直在做Java,想
“自頂向下, 逐步求精”的程序設計方法。
align 問題 重點 http .net 分解 法國 所在 定量 http://blog.csdn.net/rns521/article/details/6973395/ 結構化程序設計、面向對象程序設計、計算機輔助設計。 結構化程序設計支持“自頂向下, 逐步求精”的
計算機網路自頂向下 :應用層(DNS,POP)
DNS是: 一個分散式DNS伺服器實現分佈或資料庫。 一個使得主機能夠查詢分佈資料庫的應用層協議。 DNS伺服器通常是執行BIND軟體的Linux機器。 DNS協議執行在UDP之上使用53埠。 DNS提供的服務: DNS除了進行主機到IP地址的
實現UDP套接字程式設計 整理《計算機網路——自頂向下方法(James F. Kurose, Keith W. Rose)》
1. 首先介紹一下網路應用程式。主要有兩類: 一類是實現“在協議標準(RFC或其他標準文件)中所定義的操作”,是開放的網路應用程式,開發者必須遵守協議所規定的規則。因此,不同開發者開發的程式能夠互動操作(這些程式需要使用與該協議關聯的周知埠號);
TCP套接字程式設計 整理《計算機網路——自頂向下方法(James F. Kurose, Keith W. Rose)》
與UDP不同,TCP是一個面向連線的協議。這意味著,在客戶端和伺服器能夠開始互相傳送資料之前,它們要先握手和建立一個TCP連線。連線建立之後,當有一方需要給另一方傳送資料,它只需經套接字把資料丟個TCP連線,無需再為資料附上目的地地址。1. 下面討論一下TCP客
計算機網絡(自頂向下)----讀書筆記
接收消息 技術 tel 出隊 電纜 outer sage 調度算法 結構 1.端系統和網絡核心、協議 處在因特網邊緣的部分就是連接在因特網上的所有的主機。這些主機又稱為端系統(end system) 網絡核心部分要向網絡邊緣中的大量主機提供連通性,使邊緣部分中的任何
計算機網絡自頂向下方法——可靠數據傳輸原理1(構造可靠數據傳輸協議)
需要 足夠 方向 信息 不發送 可靠的 更多 定時器 基於 TCP向調用它的因特網應用提供所提供的服務模型 數據可以通過一條可靠的信道進行傳輸。借助於可靠的信道,傳輸比特就不會受到損壞或丟失,而且所有數據都是按其發送順序進行交付。 可靠傳輸協議 實現服務模型就需要可靠
《計算機網絡教程——自頂向下方法》學習筆記
連接狀態 數據結構 ip地址 物理層 重復分組 ring ssh 自頂向下 nmp 這本書很經典,也很厚,之前學了大半部分(TCP/IP的五個層),也許是因為概念太多、內容太廣就放下了。這次記錄算是總結復習吧,感覺學東西特別是這種基礎性的東西還是得記筆記,有歸納的學習不然學
Java 自頂向下的歸併排序
package merge; import java.util.Scanner; import java.lang.String; public class Merge { private static Comparable[] aux; public static voi
自頂向下與自底向上的歸併排序
自頂向下和自底向上歸併排序是兩個歸併順序不同的排序過程。通過例子來說明: 初始化陣列:int a[]={16, 15, 14, 13. 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1} 自頂向下: lo=0, mid=0, hi=1 15 16 14 13 1
【ACM】UVa 489 劊子手遊戲(自頂向下)
【題目】 Hangman Judge是一個猜英文單字的小遊戲(在電子字典中常會看到),遊戲規則如下: 1、答案單字寫在紙上(每個字元一張紙),並且被蓋起來,玩家每次猜一個英文字元(letter)。 2、如果這個英文字元猜中(在答案的英文單字中有出現),被猜中的字元就被翻