目前我們把結果只用一種狀態記錄,其實可以依三層的巢狀 if-else 陳述詳細解析成三種狀態,分別是記錄答對或對錯的狀態、大於答案或小於答案的狀態、差值超過 5 或小於 5 的狀態。
因此,我們宣告三個列舉型態來分別記入這些狀態,全部的程式碼如下
#include <stdio.h> #include <time.h> #include <math.h> enum RW {RIGHT = 1, WRONG}; enum BS {BIG = 1, SMALL}; enum DI {FOUR = 1, FIVE}; int main(void) { int answer = time(NULL); int guess; int diff; int STATE_RW = 0; int STATE_BS = 0; int STATE_DI = 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_RW = RIGHT; } else { STATE_RW = WRONG; } if (answer > guess) { STATE_BS = SMALL; } else { STATE_BS = BIG; } if (diff > 5) { STATE_DI = FIVE; } else { STATE_DI = FOUR; } if (STATE_RW == RIGHT) { printf("猜對囉!\n"); } else if (STATE_BS == BIG && STATE_DI == FIVE) { printf("猜的數字比答案大....還很遠,再加把勁!\n"); } else if (STATE_BS == BIG && STATE_DI == FOUR) { printf("猜的數字比答案大....不錯喔!很接近了\n"); } else if (STATE_BS == SMALL && STATE_DI == FIVE) { printf("猜的數字比答案小....還很遠,再加把勁!\n"); } else if (STATE_BS == SMALL && STATE_DI == FOUR) { printf("猜的數字比答案小....不錯喔!很接近了\n"); } else { printf("猜錯囉!\n"); } return 0; } /* 《程式語言教學誌》的範例程式 http://pydoing.blogspot.com/ 檔名:gn6.c 功能:簡單的猜數字遊戲 作者:張凱慶 時間:西元2010年7月 */
因此,第 28 行到第 47 行為三個單一的 if-else 陳述,依據條件判斷設定狀態。第 52 行、第 55 行、第 58 行、第 61 行的狀態判斷,我們都用邏輯運算子 && 將兩種狀態做且運算,這是猜錯的時候,所以如果兩種狀態都相符,程式才會顯示該訊息。
請自行編譯執行,結果會是相同的。
問題與討論
- 為什麼太多層的巢狀 if-else 陳述會讓程式變得不好理解?
- 把狀態拆成用三個變數來儲存,有什麼優點跟缺點?
- 邏輯運算子有哪些?
- if 陳述中利用邏輯運算子有什麼方便的地方?
沒有留言:
張貼留言