所謂巢狀的 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");
}
}
}利用縮排可以很清楚看出程式的意義,所以就不再贅述了。
來編譯執行看看吧!

問題與討論
- 猜數字遊戲中利用什麼機制設置答案為 25 ?
- 用什麼方式可以替代函數 fabs() ?
- 說明什麼情況需要用到強制型態轉換。
- 說明將程式碼縮排的優點。
2 則留言:
請問一下
在gn3.c的範例中
25行的條件判斷式中的運算式是甚麼意思?
或是打錯了嗎@@因為我直接複製整個範例去做編譯
編譯器顯示25行那有錯誤
那是格式跑掉,應該是大於符號,已作修改,感謝指正 :)
張貼留言