1. 程式人生 > >簡述“自頂向下,逐步求精”——面向過程程式設計方法

簡述“自頂向下,逐步求精”——面向過程程式設計方法

引入

 所謂“自頂向下,逐步求精”的程式設計方法,網路上有著如下的說法,一者是百度百科所述,另一者則為維基百科的說法。

自頂向下設計 :一種逐步求精的設計程式的過程和方法。對要完成的任務進行分解,先對最高層次中的問題進行定義、設計、程式設計和測試,而將其中未解決的問題作為一個子任務放到下一層次中去解決。這樣逐層、逐個地進行定義、設計、程式設計和測試,直到所有層次上的問題均由實用程式來解決,就能設計出具有層次結構的程式。

——百度百科

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/ 結構化程序設計、面向對象程序設計、計算機輔助設計。 結構化程序設計支持“自頂向下, 逐步求精”的

計算機網路 :應用層(DNSPOP)

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、如果這個英文字元猜中(在答案的英文單字中有出現),被猜中的字元就被翻