
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 改寫的例子,有些差異則是演算法的不同。
會有不同演算法的原因,大多是長久以來程式設計師為了尋找更有效率的演算法,所以累積了很多概念不同的演算法,對大量資料來說,有些會有效率,執行的很快,有些則是不太有效率,需要多點執行時間。如果資料量非常的大,例如原本一千筆,逐漸累積到上萬筆甚至幾十幾百萬筆的時候,有效率的演算法就變得相當重要。
我們對寫程式需要認識的是演算法沒有絕對,就算當今最有效率的演算法,也可能是對某種資料或某種資料結構有效,通常得看資料的種類跟所用的資料結構,如果有人開發出新的演算法,舊的有效率的演算法就可能被束之高閣,藏在教材中當作教學範例。
然而語法是絕對的,編譯器總是會告訴我們這樣寫合不合法,因此,自己嘗試寫程式時,不要覺得自己想的邏輯對就是對,直接編譯讓編譯器告訴我們這樣行不行得通,這會是練習寫程式最佳的助手。
問題與討論
- 為什麼會有很多寫法不同,卻有相同執行結果的程式?
- 為何要選擇有效率的演算法?
- 誰是寫程式的最佳助手?
- 資料結構是指什麼?陣列算不算是一種資料結構?
沒有留言:
張貼留言