自頂向下,逐步求精------一條程式設計的捷徑
阿新 • • 發佈:2019-02-13
引言
第一次聽到這個思想時,我覺得這和那些形而上的指導方針是一個套路,就是說來聽聽,沒有任何實際的應用價值。事實似乎也驗證了我的這個猜想,在開始學習碼程式碼的前兩個月,我從來沒有應用過這個思想,然而這也沒有給我造成什麼困擾。究其原因,大概就是題目簡單,程式碼不長。終於,在前兩天我完成了一個200行的程式,才第一次感受到了這個思想的重要性。
200行的程式碼,如果不通過“自頂向下,逐步求精”,將問題具體化,那麼找bug,修改引數將是一件痛苦得不能再痛苦的事情。至此,才終於後悔“不聽老人言”,沒有在一開始就養成這個好習慣。
自頂向下,逐步求精
那麼,什麼叫自頂向下逐步求精呢?
簡單來說,就是將問題分化,將大的問題分成小的問題,將每一個要實現的操作轉變為一個函式,然後再在函式中繼續這個過程。
圖片來自網路
這樣的程式設計思路,有助於我們修正程式碼,檢查中間量,同時也有助於將問題分工,實現合作。下面我就通過一個具體的例子來解釋一下。
舉個例子
比如現在我們想要解決這樣一個問題:將使用者輸入的10進位制數轉化為16進位制數。(為了更好地體現這個思想,這裡選擇的方法可能較為複雜,請讀者不要在意這些細節,體會思想就好)
首先我們敲出main函式,即這個程式的主體。
int main() {
int number1;
char number[10];
scanf("%d", &number1);
if (number1 >= 0) {
translate(number1, 0, number);
}
else {
number[0] = '-';
number1 = -number1;
translate(number1, 1, number);
}
print(number);
system("pause");
}
這裡我們呼叫了兩個函式,分別是translate—具體的轉換函式,以及print—列印字元組的函式。下面我們分別敲出這兩個函式。
void translate(int n, int i, char text[]) {
int j;
int y = len(n);
for (j = 0; j < y; j++) {
int x = n % 16;
n = n / 16;
if (x < 10) text[i + y - j - 1] = '0' + x;
else text[i + y - j - 1] = 'A' + x - 10;
//printf("%c ",text[i + j]);
}
text[i + y ] = '\0';
}
void print(char text[]) {
for (int i = 0; ; i++) {
if (text[i] == '\0') break;
printf("%c", text[i]);
}
}
在實現translate函式時,我們又用到了這個一個10進位制的數在16進位制下的位數。遇到這樣一個問題時不急,我們先擱置,繼續完成為剩下的部分。然後再轉過頭來實現這個新的函式len。
int len(int n) {
if (n == 0) return 1;
int count = 0;
while (n != 0) {
n = n / 16;
count++;
}
return count;
}
至此,這道題終於完成了,程式碼具有很高的可讀性,而且我們完成題目的過程中思路也很清晰,不至於出現碼著碼著忘了自己要幹嘛的情況。這就是“自頂向下,逐步求精”的程式碼思路了。怎麼樣,您學會了嗎?