目前我們把結果只用一種狀態記錄,其實可以依三層的巢狀 if-else 陳述詳細解析成三種狀態,分別是記錄答對或對錯的狀態、大於答案或小於答案的狀態、差值超過 5 或小於 5 的狀態。
因此,我們宣告三個列舉型態來分別記入這些狀態,全部的程式碼如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #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; } /* 《程式語言教學誌》的範例程式 檔名:gn6.c 功能:簡單的猜數字遊戲 作者:張凱慶 時間:西元2010年7月 */ |
因此,第 28 行到第 47 行為三個單一的 if-else 陳述,依據條件判斷設定狀態。第 52 行、第 55 行、第 58 行、第 61 行的狀態判斷,我們都用邏輯運算子 && 將兩種狀態做且運算,這是猜錯的時候,所以如果兩種狀態都相符,程式才會顯示該訊息。
請自行編譯執行,結果會是相同的。
問題與討論
- 為什麼太多層的巢狀 if-else 陳述會讓程式變得不好理解?
- 把狀態拆成用三個變數來儲存,有什麼優點跟缺點?
- 邏輯運算子有哪些?
- if 陳述中利用邏輯運算子有什麼方便的地方?
沒有留言:
張貼留言