只不過,無窮迴圈是真的不會結束,因此會造成程式當掉或系統崩潰的麻煩。因此,幾乎我們常用的任何 GUI 軟體都有設計結束的機制,不然的話,就得呼叫作業系統來強制關閉囉!作業系統也關閉不了的話,就會有當機的風險。
for 迴圈雖然有明確重複的控制機制,但也可以規劃成像是無窮迴圈的執行模式,例如,所需要的三個運算式之中,只有結束條件是必須的,這是說其他兩個可以留空白,如下
for (;1;) { printf("0"); }
如果程式中加入了上面三行程式碼,這個程式執行到這裡就會一直在印幕上印 0 ,一直印下去不會結束。
接下來,我們繼續把猜數字遊戲的 for 迴圈改成無窮迴圈,結束的機制很簡單,猜對了就會用 break 陳述跳出迴圈
#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; } /* 《程式語言教學誌》的範例程式 http://pydoing.blogspot.com/ 檔名:gn8.c 功能:簡單的猜數字遊戲 作者:張凱慶 時間:西元2010年7月 */
我們刪除原先 counter == 10 的那一段,然後將 counter > 5 所要顯示的訊息更改如下
printf("\n\n總算有猜對,一共猜了 %d 次,下次加油喔!\n", counter + 1);
這樣結束都會顯示猜測的次數。
好了,來編譯玩玩看吧!不必怕猜了十次猜不到就被遊戲程式虧了說。
問題與討論
- 為什麼說無窮迴圈是陷阱?
- 什麼情況需要用到無窮迴圈?
- 說明這個猜數字遊戲的結束機制。
沒有留言:
張貼留言