簡述:
“自頂向下”的算法設計,就是先概要地設計算法的第一層(頂層),然后步步深入,逐層細分,逐步細分,逐步求精,直到整個問題可用程序設計語言明確的描述出來為止。
設計步驟:
1.首先對問題進行仔細分析,寫出程序的主要過程和任務。 2.把大問題分解為幾個子問題。 3.處理子問題,形成單獨的模塊。
【例題】:一個數如果恰好等於它的因子之和(包括1,但不包括這個數本身),這個數就稱為“完數”。求1000以內的“完數”,並按要求輸出。
- 例如:28的因子為1,2,4,7,14,且28 = 1 + 2 + 4 + 7 + 14,則28是“完數”。
- 輸出格式:
28 it's factors are 1,2,4,7,14
問題分析:
因數的定義:整數a除以整數b(b≠0) 的商正好是整數而沒有余數,我們就說b是a的因數(這題有要求不能去本身)。第一步通過問題可知判斷一個數是不是“完數”,若是完數則按格式輸出。第二部怎么判斷是不是完數?則可知要因子相加等於其本身。
自頂向下算法設計:
- 頂層算法
for(i = 2; i <= n; i++) { if(i是完數) { 按格式輸出; } }
- 判斷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; }
- 輸出算法----------------------------分解模塊二
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; }
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:

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