Back
Clang & Wasm 教學

流程控制(條件判斷與迴圈)

掌握條件判斷與迴圈結構,讓程式具備決策能力與高效執行方式,實現更靈活的控制流程。

目標

  • 了解條件判斷敘述如何根據不同情況決定程式流程。
  • 學會使用 if, else if, else, switch 進行條件判斷。
  • 掌握 forwhile 迴圈結構,了解如何重複執行程式碼。
  • 使用條件判斷與迴圈結構解決實際問題。

0. 推荐網站

C語言程式碼視覺化網站

1. 邏輯判斷與邏輯運算

邏輯運算子是進行布林值運算的工具。常見的邏輯運算子有:

運算子 說明 說明(簡述)
&& 邏輯與(AND) 當兩個條件都為真時,結果為真。
|| 邏輯或(OR) 當任一條件為真時,結果為真。
! 邏輯非(NOT) 反轉條件的真值,若為真則變為假,反之亦然。
> 大於 判斷左邊數字是否大於右邊數字。
>= 大於等於 判斷左邊數字是否大於或等於右邊數字。
== 等於 判斷左右兩個數字是否相等。
< 小於 判斷左邊數字是否小於右邊數字。
<= 小於等於 判斷左邊數字是否小於或等於右邊數字。

1.1 邏輯判斷與邏輯運算

  • 布林值

    • 布林值只有兩種可能:true(真)或 false(假)。
    • 在 C 語言中,true 通常用 1 表示,false0 表示。
    • 範例:
      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 ifelse 敘述

    • 用於處理多種條件。
    • 範例:
      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 breakcontinue

  • 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;
    }
    

課堂作業

以下是結合 高中幾何程式設計 的課堂作業,讓學生在完成作業的同時複習高中幾何知識,並練習條件判斷與迴圈的應用。


課堂互動與練習

題目描述

設計一個程式,讓使用者輸入三角形的三邊長,並計算以下性質:

  1. 判斷三角形的類型
    • 類型
      • 正三角形(三邊相等)
      • 等腰三角形(兩邊相等)
      • 一般三角形
      • 不可能是三角形 PS. 最長邊C 比其餘兩個邊AB 加起來還長
    • 什麼角
      • 直角三角形(滿足畢氏定理)a^2 + b^2 = c^2 Ps. 要自行判斷 c 為最長邊喔!
      • 銳角三角形(不滿足畢氏定理)a^2 + b^2 > c^2
      • 頓角三角形(不滿足畢氏定理)a^2 + b^2 < c^2

程式應具備以下功能:

  1. 輸入
    • 讓使用者輸入三角形的三邊長。
  2. 輸出
    • 判斷三角形的類型。
    • 判斷什麼角。
  3. 額外要求
    • 使用 ifelse ifelse 判斷三角形的類型。
    • 使用 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
程式結束!
SNPQ © 2025