C 語言初學教材 - 第三章 加入 for 迴圈多猜幾次

每次玩猜數字遊戲都得重新執行,會不會很無趣呢?我們來利用 for 迴圈讓一次執行就可以猜個十次囉!



所謂的迴圈就是可以讓程式重複執行某項特定工作的機制,典型的 for 迴圈如下圖示



for 為關鍵字之一,後面接的小括弧內需要三個運算式,三個運算式用兩個分號隔開。迴圈需要有控制變數,第一個運算式就是給控制變數設置初值,第二個運算式則是迴圈的結束條件,通常是控制變數大於或小於某個數字,第三個運算式則是調整控制變數的值,使迴圈持續進行。


由於 for 迴圈有明確的重複控制的機制,因此常用於確定重複次數的迴圈。我們以 gn4.c 為藍本,加入 for 迴圈給使用者最多猜 10 次,全部的程式碼如下
#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 i;
    int counter = 0;
    
    answer %= 25;
    if (answer == 0) {
        answer = 25;
    }
    
    for (i = 0; i < 10; i++) {
        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 == 10) {
        printf("\n\n一次都沒猜對,很遜欸!\n");
    }
    else if (counter > 5) {
        printf("\n\n總算有猜對,下次加油喔!\n");
    }
    else {
        printf("\n\n猜了 %d 次,不錯不錯!\n", counter + 1);
    }
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:gn7.c
    功能:簡單的猜數字遊戲
    作者:張凱慶
    時間:西元2010年7月 */


for 迴圈從第 21 行開始
for (i = 0; i < 10; i++) {


到第 74 行的左大括弧結束。我們在第 13 行宣告整數變數 i 作為 for 迴圈的控制變數,另外在第 14 行宣告另一個整數變數 counter ,並同時設初值為 0 ,這個 counter 是準備用來累計使用者猜錯次數的
int counter = 0;


此外須注意接受使用者輸入,也就是要輸入猜測數字必須放在 for 迴圈之內,也就是 for 後面的大括弧之中,這樣才可以在使用者猜錯的時候,重新接受使用者的輸入猜測數字。


變數 counter 放在第 32 行,
counter++;


這是說,只要猜錯, counter 就會遞增 1 。


我們在第 54 行加入了 break 陳述
break;


因此,只要猜對就會提前離開 for 迴圈。


來吧!來編譯玩玩看這新版本的猜數字遊戲吧!



問題與討論
  1. 所謂的迴圈是什麼?
  2. 為什麼 for 迴圈常用於確定重複次數的情況?




沒有留言: