所謂巢狀的 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行那有錯誤
那是格式跑掉,應該是大於符號,已作修改,感謝指正 :)
張貼留言