C 語言初學教材 - 第三章 巢狀的 if-else

寫好猜錯有提示訊息的猜數字遊戲了嗎?沒寫好也沒關係,因為用巢狀的 if-else 陳述會比較簡單,我們現在才要介紹巢狀的 if-else 陳述。



所謂巢狀的 if-else 陳述就是在 if-else 陳述當中,還有另一組 if-else 陳述,如下圖做兩次條件判斷,程式最後會執行 A 、 B 、 C 、 D 其中一項工作



巢狀的的意思就是像巢凹陷下去,當然,這要轉 90 度來看。 if-else 並沒有限制裡頭可以有幾組 if-else ,或是有幾層 if-else ,通常這會依需要做多少條件判斷而定,像我們提供提示訊息的猜數字遊戲需要判斷三個條件,就需要三層的巢狀 if-else 。


三個判斷條件分別是答案與猜測數字是否相同,若不同的話答案跟猜測數字哪個較大,然後大小差距是否超過 5 。


我們提供的版本如下
#include <stdio.h>
#include <time.h>
#include <math.h>

int main(void)
{
    int answer = time(NULL);
    int guess;
    int diff; //計算答案和猜測數字的差值
    
    answer %= 25;
    if (answer == 0) { 
        answer = 25;
    }
    
    printf("請猜一個數字 1 到 25: ");
    scanf("%d", &guess);
    diff = guess - answer;
    diff = (int) fabs(diff);
    
    if (guess == answer) {
        printf("猜對囉!\n");
    }
    else {
        if (guess > answer) {
            printf("猜的數字比答案大....");
            
            if (diff > 5) {
                printf("還很遠,再加把勁!\n");
            }
            else {
                printf("不錯喔!很接近了\n");
            }
        }
        else {
            printf("猜的數字比答案小....");
            
            if (diff > 5) {
                printf("還很遠,再加把勁!\n");
            }
            else {
                printf("不錯喔!很接近了\n");
            }
        }
    }
    
    return 0;
}

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


第 9 行,我們宣告了整數變數 diff ,用來計算答案跟猜測數字的差值
int diff;


第 18 行就是計算差值的陳述
diff = guess - answer;


但由於可能會是負數,因為我們不知道答案跟猜測數字哪個比較大,所以,接下來的第 19 行
diff = (int) fabs(diff);


利用標準函數庫 math.h 的函數 fabs() 取得 diff 的絕對值,由於 fabs() 回傳浮點數型態,所以用 cast 運算子強制轉換成 int 型態,再回存到 diff 之中。


別忘了,用到 math.h ,所以第 3 行要先引入
#include <math.h>


第 11 行到第 14 行,如果答案計算為 0 ,就將答案設成 25 ,以使猜測數字保持在 1 到 25 之間
answer %= 25;
if (answer == 0) { 
    answer = 25;
}


整個三層的巢狀迴圈在第 21 行到第 45 行
if (guess == answer) {
    printf("猜對囉!\n");
}
else {
    if (guess > answer) {
        printf("猜的數字比答案大....");
            
        if (diff > 5) {
            printf("還很遠,再加把勁!\n");
        }
        else {
            printf("不錯喔!很接近了\n");
        }
    }
    else {
        printf("猜的數字比答案小....");
            
        if (diff > 5) {
            printf("還很遠,再加把勁!\n");
        }
        else {
            printf("不錯喔!很接近了\n");
        }
    }
}


利用縮排可以很清楚看出程式的意義,所以就不再贅述了。


來編譯執行看看吧!



問題與討論
  1. 猜數字遊戲中利用什麼機制設置答案為 25 ?
  2. 用什麼方式可以替代函數 fabs() ?
  3. 說明什麼情況需要用到強制型態轉換。
  4. 說明將程式碼縮排的優點。




2 則留言:

Unknown 提到...

請問一下
在gn3.c的範例中
25行的條件判斷式中的運算式是甚麼意思?
或是打錯了嗎@@因為我直接複製整個範例去做編譯
編譯器顯示25行那有錯誤

Kaiching Chang 提到...

那是格式跑掉,應該是大於符號,已作修改,感謝指正 :)