C 語言另外一種多重選擇的方式就是 switch-case 陳述,由於數字遊戲最後的狀態判斷是常數值相等性測試,所以很容易就能用 switch-case 來改寫。
我們另外提供 switch-case 的版本如下
#include <stdio.h> #include <time.h> #include <math.h> enum STATE {RIGHT = 1, BIG_FOUR ,BIG_FIVE, SMALL_FOUR, SMALL_FIVE}; int main(void) { int answer = time(NULL); int guess; int diff; int state = 0; answer %= 25; if (answer == 0) { answer = 25; } printf("請猜一個數字 1 到 25: "); scanf("%d", &guess); diff = guess - answer; diff = (int) fabs(diff); if (guess == answer) { state = RIGHT; } else { if (guess > answer) { if (diff > 5) { state = BIG_FIVE; } else { state = BIG_FOUR; } } else { if (diff > 5) { state = SMALL_FIVE; } else { state = SMALL_FOUR; } } } switch (state) { case RIGHT: printf("猜對囉!\n"); break; case BIG_FIVE: printf("猜的數字比答案大....還很遠,再加把勁!\n"); break; case BIG_FOUR: printf("猜的數字比答案大....不錯喔!很接近了\n"); break; case SMALL_FIVE: printf("猜的數字比答案小....還很遠,再加把勁!\n"); break; case SMALL_FOUR: printf("猜的數字比答案小....不錯喔!很接近了\n"); break; default: printf("猜錯囉!\n"); } return 0; } /* 《程式語言教學誌》的範例程式 http://pydoing.blogspot.com/ 檔名:gn5.c 功能:簡單的猜數字遊戲 作者:張凱慶 時間:西元2010年7月 */
編譯執行的結果會完全一樣,這只是個用不同方法改寫的例子。
我們已經看過很多不同寫法,但是具有相同執行結果的程式。其實很多程式的功能大致上都相同,但是程式內部怎麼實現卻多有不同,有些差異在語法,如上述 if-else if... 用 switch-case 改寫的例子,有些差異則是演算法的不同。
會有不同演算法的原因,大多是長久以來程式設計師為了尋找更有效率的演算法,所以累積了很多概念不同的演算法,對大量資料來說,有些會有效率,執行的很快,有些則是不太有效率,需要多點執行時間。如果資料量非常的大,例如原本一千筆,逐漸累積到上萬筆甚至幾十幾百萬筆的時候,有效率的演算法就變得相當重要。
我們對寫程式需要認識的是演算法沒有絕對,就算當今最有效率的演算法,也可能是對某種資料或某種資料結構有效,通常得看資料的種類跟所用的資料結構,如果有人開發出新的演算法,舊的有效率的演算法就可能被束之高閣,藏在教材中當作教學範例。
然而語法是絕對的,編譯器總是會告訴我們這樣寫合不合法,因此,自己嘗試寫程式時,不要覺得自己想的邏輯對就是對,直接編譯讓編譯器告訴我們這樣行不行得通,這會是練習寫程式最佳的助手。
問題與討論
- 為什麼會有很多寫法不同,卻有相同執行結果的程式?
- 為何要選擇有效率的演算法?
- 誰是寫程式的最佳助手?
- 資料結構是指什麼?陣列算不算是一種資料結構?
沒有留言:
張貼留言