流程控制(條件判斷與迴圈)
掌握條件判斷與迴圈結構,讓程式具備決策能力與高效執行方式,實現更靈活的控制流程。
目標
- 了解條件判斷敘述如何根據不同情況決定程式流程。
- 學會使用
if
,else if
,else
,switch
進行條件判斷。 - 掌握
for
與while
迴圈結構,了解如何重複執行程式碼。 - 使用條件判斷與迴圈結構解決實際問題。
0. 推荐網站
1. 邏輯判斷與邏輯運算
邏輯運算子是進行布林值運算的工具。常見的邏輯運算子有:
運算子 | 說明 | 說明(簡述) |
---|---|---|
&& |
邏輯與(AND) | 當兩個條件都為真時,結果為真。 |
|| |
邏輯或(OR) | 當任一條件為真時,結果為真。 |
! |
邏輯非(NOT) | 反轉條件的真值,若為真則變為假,反之亦然。 |
> |
大於 | 判斷左邊數字是否大於右邊數字。 |
>= |
大於等於 | 判斷左邊數字是否大於或等於右邊數字。 |
== |
等於 | 判斷左右兩個數字是否相等。 |
< |
小於 | 判斷左邊數字是否小於右邊數字。 |
<= |
小於等於 | 判斷左邊數字是否小於或等於右邊數字。 |
1.1 邏輯判斷與邏輯運算
布林值:
- 布林值只有兩種可能:
true
(真)或false
(假)。 - 在 C 語言中,
true
通常用1
表示,false
用0
表示。 - 範例:
int isRaining = 1; // 1 表示 true -> 下雨 int isSunny = 0; // 0 表示 false -> 沒出太陽
- 布林值只有兩種可能:
邏輯運算子:
&&
(AND):兩個條件都為真時,結果為真。if (isRaining && isSunny) { printf("下雨又出太陽,可能有彩虹!\n"); }
||
(OR):任一條件為真時,結果為真。if (isRaining || isSunny) { printf("要麼下雨,要麼出太陽,帶傘吧!\n"); }
!
(NOT):反轉條件的真值。if (!isRaining) { printf("今天沒下雨,可以出門散步! (但注意防曬)\n"); }
- 混合使用範例
其結果等同if ((!isRaining) && (!isSunny)) { printf("今天沒下雨,也沒有太陽,可以出門散步!\n"); }
if (!isRaining) { if (!isSunny) { printf("今天沒下雨,也沒有太陽,可以出門散步!\n"); } }
比較運算子:
>
:大於。>=
:大於等於。<
:小於。<=
:小於等於。==
:等於。!=
:不等於。- 範例:
int a = 5, b = 10; if (a < b) { printf("a 小於 b\n"); } if (a == b) { printf("a 等於 b\n"); } else { printf("a 不等於 b\n"); }
1.2 條件判斷:if
, else if
, else
if
敘述:- 當條件為真時,執行程式碼塊。
- 範例:
int age = 18; if (age >= 18) { printf("你已經成年了!\n"); }
else if
與else
敘述:- 用於處理多種條件。
- 範例:
int score = 85; //成績 if (score >= 90) { printf("成績等級:A\n"); } else if (score >= 80) { printf("成績等級:B\n"); } else if (score >= 70) { printf("成績等級:C\n"); } else { printf("成績等級:D\n"); }
巢狀
if
敘述:- 在
if
內部再使用if
,處理更複雜的條件。 - 範例:
int age = 20; //年齡 int hasLicense = 1; //架照 if (age >= 18) { if (hasLicense) { printf("你可以合法開車!\n"); } else { printf("你成年了,但沒有駕照,不能合法開車!\n"); } } else { printf("你還未成年,不能合法開車!\n"); }
- 在
1.3 補充範例
範例 1:判斷輸入的數字是否為偶數或奇數。
#include <stdio.h> int main() { int num; printf("輸入一個數字: "); scanf("%d", &num); if (num % 2 == 0) { printf("%d 是偶數!\n", num); } else { printf("%d 是奇數!\n", num); } return 0; }
範例 2:判斷輸入的三個數字中最大的數字。
#include <stdio.h> int main() { int a, b, c; printf("輸入三個數字: "); scanf("%d %d %d", &a, &b, &c); if ((a >= b) && (a >= c)) { printf("最大的數字是: %d\n", a); } else if ((b >= a) && (b >= c)) { printf("最大的數字是: %d\n", b); } else { printf("最大的數字是: %d\n", c); } return 0; }
2. 條件判斷與迴圈結構
2.1 switch
敘述
switch
敘述:- 用於處理多種條件,適合處理固定值的情況。
- 語法結構:
switch (變數) { case 值1: // 當變數等於值1時執行的程式碼 break; case 值2: // 當變數等於值2時執行的程式碼 break; default: // 當變數不等於任何 case 時執行的程式碼 }
break
:用於跳出switch
區塊,避免執行後續的case
。default
:當變數不符合任何case
時執行的程式碼。
範例 1:判斷星期幾。
#include <stdio.h> int main() { int day; printf("輸入一個數字 (1-7): "); scanf("%d", &day); switch (day) { case 1: printf("星期一\n"); break; case 2: printf("星期二\n"); break; case 3: printf("星期三\n"); break; case 4: printf("星期四\n"); break; case 5: printf("星期五\n"); break; case 6: printf("星期六\n"); break; case 7: printf("星期日\n"); break; default: printf("輸入錯誤!請輸入 1 到 7 之間的數字。\n"); } return 0; }
範例 2:判斷月份的天數。
#include <stdio.h> int main() { int month; printf("輸入一個月份 (1-12): "); scanf("%d", &month); switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: printf("這個月有 31 天\n"); break; case 4: case 6: case 9: case 11: printf("這個月有 30 天\n"); break; case 2: printf("這個月有 28 或 29 天(閏年)\n"); break; default: printf("輸入錯誤!請輸入 1 到 12 之間的數字。\n"); } return 0; }
2.2 for
迴圈
for
迴圈:- 用於重複執行程式碼,適合已知次數的情況。
- 語法結構:
for (初始化; 條件; 更新) { // 重複執行的程式碼 }
- 初始化:設定迴圈變數的初始值。
- 條件:每次迴圈開始前檢查條件,若為真則繼續執行。
- 更新:每次迴圈結束後更新迴圈變數。
範例 1:輸出 1 到 5 的數字。
#include <stdio.h> int main() { for (int i = 1; i <= 5; i++) { printf("%d\n", i); } return 0; }
範例 2:計算 1 到 10 的總和。
#include <stdio.h> int main() { int sum = 0; for (int i = 1; i <= 10; i++) { sum += i; // sum = sum + i; } printf("1 到 10 的總和是: %d\n", sum); return 0; }
範例 3:輸出九九乘法表。
#include <stdio.h> int main() { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { printf("%d * %d = %d\n", i, j, i * j); } printf("\n"); } return 0; }
2.3 補充範例
範例 1:輸出 1 到 100 的偶數。
#include <stdio.h> int main() { for (int i = 1; i <= 100; i++) { if (i % 2 == 0) { printf("%d\n", i); } } // 也可以這樣 //for (int i = 2; i <= 100; i += 2) { // printf("%d\n", i); //} return 0; }
範例 2:計算 N 的階層(N!)。
#include <stdio.h> int main() { int N, factorial = 1; printf("輸入一個正整數 N: "); scanf("%d", &N); for (int i = 1; i <= N; i++) { factorial *= i; } // 也可以這樣 //for (int i = N; i > 0; i--) { // factorial *= i; //} printf("%d 的階層是: %d\n", N, factorial); return 0; }
3. 迴圈結構與進階應用**
3.1
while
迴圈while
迴圈:- 當條件為真時,重複執行程式碼。
- 語法結構:
while (條件) { // 重複執行的程式碼 }
- 注意:如果條件一開始就為假,則迴圈內的程式碼不會執行。
範例 1:輸出 1 到 5 的數字。
#include <stdio.h> int main() { int i = 1; while (i <= 5) { printf("%d\n", i); i++; } //for (int i = 1; i <= 5; i++) { // printf("%d\n", i); //} return 0; }
範例 2:計算 1 到 N 的總和。
#include <stdio.h> int main() { int N, sum = 0, i = 1; printf("輸入一個正整數 N: "); scanf("%d", &N); while (i <= N) { sum += i; i++; } printf("1 到 %d 的總和是: %d\n", N, sum); return 0; }
範例 3:猜數字遊戲。
#include <stdio.h> int main() { int secretNumber = 42; int guess; printf("猜一個數字 (1-100): "); while (1) { scanf("%d", &guess); if (guess == secretNumber) { printf("恭喜!你猜對了!\n"); break; } else if (guess < secretNumber) { printf("太小了,再試一次!\n"); } else { printf("太大了,再試一次!\n"); } } return 0; }
3.2 do while
迴圈
do while
迴圈:- 先執行一次程式碼,然後檢查條件是否為真。
- 語法結構:
do { // 重複執行的程式碼 } while (條件);
- 注意:即使條件一開始就為假,程式碼至少會執行一次。
範例 1:輸出 1 到 5 的數字。
#include <stdio.h> int main() { int i = 1; do { printf("%d\n", i); i++; } while (i <= 5); return 0; }
範例 2:輸入數字直到輸入 0 為止。
#include <stdio.h> int main() { int num; do { printf("輸入一個數字 (輸入 0 結束): "); scanf("%d", &num); printf("你輸入的數字是: %d\n", num); } while (num != 0); printf("程式結束!\n"); return 0; }
3.3 break
與 continue
break
:- 立即終止迴圈,跳出迴圈區塊。
- 範例:
for (int i = 1; i <= 10; i++) { if (i == 5) { break; // 當 i 等於 5 時終止迴圈 } printf("%d\n", i); }
continue
:- 跳過這一圈,進入下一圈。
- 範例:
for (int i = 1; i <= 10; i++) { if (i % 2 == 0) { continue; // 跳過偶數 } printf("%d\n", i); }
範例:輸出 1 到 10 的奇數。
#include <stdio.h> int main() { for (int i = 1; i <= 10; i++) { if (i % 2 == 0) { continue; // 跳過偶數 } printf("%d\n", i); } return 0; }
3.4 補充範例
範例 1:計算 N 的階層(N!)。
#include <stdio.h> int main() { int N, factorial = 1, i = 1; printf("輸入一個正整數 N: "); scanf("%d", &N); while (i <= N) { factorial *= i; i++; } printf("%d 的階層是: %d\n", N, factorial); return 0; }
範例 2:使用
do while
迴圈判斷輸入的數字是否為質數。 PS. 質數: 除了1與自己外不能被其他數字整除#include <stdio.h> int main() { int num, i = 2; //除了1以外所以從2開始 int isPrime = 1; printf("輸入一個正整數: "); scanf("%d", &num); do { if (num % i == 0) { //可不可以被 i 整除? isPrime = 0; break; } i++; } while (i <= (num / 2)); //只需要檢查到 自己的一半 if (isPrime) { printf("%d 是質數!\n", num); } else { printf("%d 不是質數!\n", num); } return 0; }
課堂作業
以下是結合 高中幾何 與 程式設計 的課堂作業,讓學生在完成作業的同時複習高中幾何知識,並練習條件判斷與迴圈的應用。
課堂互動與練習
題目描述
設計一個程式,讓使用者輸入三角形的三邊長,並計算以下性質:
- 判斷三角形的類型:
- 類型
- 正三角形(三邊相等)
- 等腰三角形(兩邊相等)
- 一般三角形
- 不可能是三角形 PS. 最長邊C 比其餘兩個邊AB 加起來還長
- 什麼角
- 直角三角形(滿足畢氏定理)a^2 + b^2 = c^2 Ps. 要自行判斷 c 為最長邊喔!
- 銳角三角形(不滿足畢氏定理)a^2 + b^2 > c^2
- 頓角三角形(不滿足畢氏定理)a^2 + b^2 < c^2
- 類型
程式應具備以下功能:
- 輸入:
- 讓使用者輸入三角形的三邊長。
- 輸出:
- 判斷三角形的類型。
- 判斷什麼角。
- 額外要求:
- 使用
if
、else if
、else
判斷三角形的類型。 - 使用
while
迴圈讓使用者可以重複輸入,直到輸入0 0 0
為止。
- 使用
範例輸出
輸入三角形的三邊長 (輸入 0 0 0 結束): 3 4 5
類型: 一般三角型
角度: 直角
輸入三角形的三邊長 (輸入 0 0 0 結束): 3 3 5
類型: 等腰三角型
角度: 頓角
輸入三角形的三邊長 (輸入 0 0 0 結束): 5 5 5
類型: 正三角型
角度: 銳角
輸入三角形的三邊長 (輸入 0 0 0 結束): 3 3 7
類型: 不是三角形
角度: 都說不是三角形了,哪還會有角度?
輸入三角形的三邊長 (輸入 0 0 0 結束): 0 0 0
程式結束!