算法學習 四 >> "自頂向下"的設計方法


簡述:

  “自頂向下”的算法設計,就是先概要地設計算法的第一層(頂層),然后步步深入,逐層細分,逐步細分,逐步求精,直到整個問題可用程序設計語言明確的描述出來為止。

 

設計步驟:

1.首先對問題進行仔細分析,寫出程序的主要過程和任務。 2.把大問題分解為幾個子問題。 3.處理子問題,形成單獨的模塊。

 

【例題】:一個數如果恰好等於它的因子之和(包括1,但不包括這個數本身),這個數就稱為“完數”。求1000以內的“完數”,並按要求輸出。

  1. 例如:28的因子為1,2,4,7,14,且28 = 1 + 2 + 4 + 7 + 14,則28是“完數”。
  2. 輸出格式:
    28 it's factors are 1,2,4,7,14

     

問題分析:

  因數的定義:整數a除以整數b(b≠0) 的商正好是整數而沒有余數,我們就說b是a的因數(這題有要求不能去本身)。第一步通過問題可知判斷一個數是不是“完數”,若是完數則按格式輸出。第二部怎么判斷是不是完數?則可知要因子相加等於其本身。

 

自頂向下算法設計:

  1. 頂層算法
        for(i = 2; i <= n; i++)
        {
            if(i是完數)
            {
                按格式輸出;
            }
        }

     

  2. 判斷i是否為完數的算法-----------分解模塊1
    bool isPerfect(int n, int &flag, int a[])    //判斷是否為完數的方法
    {
        int s = 1;
        for(int i = 2; i < n; i++)
            if(n%i == 0)        //判斷i是否為i的因子
            {
                s += i;            //求因子之和
                a[flag++] = i;    //存儲n的因子,為輸出算法提供條件
            }
        if(s == n)                //判斷因子是否與n本身相等
            return true;
        return false;
    }
     
  3. 輸出算法----------------------------分解模塊二 
    void print(int i,int a[], int flag)            //輸出函數---------模塊二
    {
        cout << i << " it's facors are: 1";
        for(int i = 0; i < flag; i++)        //循環打印完數的因子
            cout << "," << a[i];
        cout << "\n";
    }

      

  4. 在主函數中調用算法模塊
    int main()
    {
        int a[1000];    //定義數組a存儲因子
        for(int i = 2; i <= 1000; i++)
        {
            int flag = 0;    //初始化數組下標
            if(isPerfect(i, flag, a))    //調用模塊一,判斷i是否為完數
                print(i,a,flag);            //調用模塊二,打印輸出
        }
        return 0;
    }

      

s-code:

#include<iostream>
using namespace std;
bool isPerfect(int n, int &flag, int a[])    //判斷是否為完數的方法------模塊一
{
    int s = 1;
    for(int i = 2; i < n; i++)
        if(n%i == 0)        //判斷i是否為i的因子
        {
            s += i;            //求因子之和
            a[flag++] = i;    //存儲n的因子,為輸出算法提供條件
        }
    if(s == n)                //判斷因子是否與n本身相等
        return true;
    return false;
}
void print(int i,int a[], int flag)            //輸出函數---------模塊二
{
    cout << i << " it's facors are: 1";
    for(int i = 0; i < flag; i++)        //循環打印完數的因子
        cout << "," << a[i];
    cout << "\n";
}
int main()
{
    int a[1000];    //定義數組a存儲因子
    for(int i = 2; i <= 1000; i++)
    {
        int flag = 0;    //初始化數組下標
        if(isPerfect(i, flag, a))    //調用模塊一,判斷i是否為完數
            print(i,a,flag);            //調用模塊二,打印輸出
    }
    return 0;
}

 

output:

 

總結:

   自頂向下設計的特點:先整體后局部,先抽象后具體(培養模塊化思想)。。。。。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM