只不過,無窮迴圈是真的不會結束,因此會造成程式當掉或系統崩潰的麻煩。因此,幾乎我們常用的任何 GUI 軟體都有設計結束的機制,不然的話,就得呼叫作業系統來強制關閉囉!作業系統也關閉不了的話,就會有當機的風險。
for 迴圈雖然有明確重複的控制機制,但也可以規劃成像是無窮迴圈的執行模式,例如,所需要的三個運算式之中,只有結束條件是必須的,這是說其他兩個可以留空白,如下
for (;1;) { printf ( "0" ); } |
如果程式中加入了上面三行程式碼,這個程式執行到這裡就會一直在印幕上印 0 ,一直印下去不會結束。
接下來,我們繼續把猜數字遊戲的 for 迴圈改成無窮迴圈,結束的機制很簡單,猜對了就會用 break 陳述跳出迴圈
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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | #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; int counter = 0; answer %= 25; if (answer == 0) { answer = 25; } for (;1;) { printf ( "請猜一個數字 1 到 25: " ); scanf ( "%d" , &guess); diff = guess - answer; diff = ( int ) fabs (diff); if (guess == answer) { state = RIGHT; } else { counter++; if (guess > answer) { if (diff > 5) { state = BIG_FIVE; } else { state = BIG_FOUR; } } else { if (diff > 5) { state = SMALL_FIVE; } else { state = SMALL_FOUR; } } } if (state == RIGHT) { printf ( "猜對囉!\n" ); break ; } else if (state == BIG_FIVE) { printf ( "猜的數字比答案大....還很遠,再加把勁!\n" ); } else if (state == BIG_FOUR) { printf ( "猜的數字比答案大....不錯喔!很接近了\n" ); } else if (state == SMALL_FIVE) { printf ( "猜的數字比答案小....還很遠,再加把勁!\n" ); } else if (state == SMALL_FOUR) { printf ( "猜的數字比答案小....不錯喔!很接近了\n" ); } else { printf ( "猜錯囉!\n" ); } } if (counter == 0) { printf ( "\n\n很棒喔!一次就猜對!\n" ); } else if (counter > 5) { printf ( "\n\n總算有猜對,一共猜了 %d 次,下次加油喔!\n" , counter + 1); } else { printf ( "\n\n猜了 %d 次,不錯不錯!\n" , counter + 1); } return 0; } /* 《程式語言教學誌》的範例程式 檔名:gn8.c 功能:簡單的猜數字遊戲 作者:張凱慶 時間:西元2010年7月 */ |
我們刪除原先 counter == 10 的那一段,然後將 counter > 5 所要顯示的訊息更改如下
76 | printf ( "\n\n總算有猜對,一共猜了 %d 次,下次加油喔!\n" , counter + 1); |
這樣結束都會顯示猜測的次數。
好了,來編譯玩玩看吧!不必怕猜了十次猜不到就被遊戲程式虧了說。

問題與討論
- 為什麼說無窮迴圈是陷阱?
- 什麼情況需要用到無窮迴圈?
- 說明這個猜數字遊戲的結束機制。
沒有留言:
張貼留言