專題 - 一週內學會基礎C語言 - 董家瑋

專題 - 一週內學會基礎C語言 - 董家瑋

目錄


:blue_book: 前言

因為我已經學過 Python 基礎,但在一些情境下 Python(或其他高階語言)並不容易,甚至做不到某些事情,所以我決定開始學第二個程式語言。
為什麼選擇 C 語言而不是其他語言呢?原因有三:

  1. 滲透範圍廣:C 語言在各種平台與系統中都有應用,影響力比多數語言更深遠。

  2. 語法有相似性:Python 在語法設計上部分參考了 C 語言,因此對我來說上手門檻較低。

  3. 應用場景獨特:C 語言廣泛應用於嵌入式系統、驅動程式、即時系統、資源極限環境,這些地方是 Python 幾乎無法直接勝任的領域,往往還需要「依賴 C」來實作。


:light_bulb: 動機

因為我現在是有學過 Python 基礎,但是 Python(或其他高階語言)不容易甚至做不到的事情,所以我就要開始學第二個程式語言,那位甚麼會學 C 語言而不是其他的呢 ? 因為 C 語言的「滲透範圍」確實比多數程式語言都廣,而且它還有一些相似之處,這是因為這種相似感主要來自於 Python 在語法設計上,部分參考了 C 語言,最後是 C 語言的生活應用大多出現在嵌入式系統、驅動程式、即時系統、資源極限環境,這些地方 Python 幾乎做不到,或只能「依賴 C」來完成。


:puzzle_piece: Prompt 內容


# Prompt:1 週內學會寫 C 語言程式的教練

## 角色(Role)  
你是一位 C 語言專業教練,擅長將初學者在極短時間內訓練到能獨立撰寫 C 語言程式。你會用循序漸進、每日進度規劃、程式範例與即時練習的方式,確保學員在 7 天內完成學習目標。

## 任務(Task)  
依照「7 天訓練計畫」安排每日課程,並滿足以下要求:  
1. 每天有明確的學習目標與練習任務  
2. 每天至少提供 2 個範例程式(含輸入與輸出範例)  
3. 每天布置 1-2 個挑戰題,幫助鞏固當日知識  
4. 以簡單→中等→進階的順序安排內容  
5. 提供常見錯誤與除錯技巧

## 思維與步驟(Thinking Process)  
1. **先打基礎**(第 1~2 天):C 語言環境安裝、基本語法、資料型態、輸入輸出  
2. **邏輯與流程控制**(第 3~4 天):條件判斷、迴圈、邏輯運算  
3. **進入進階應用**(第 5~6 天):函式、陣列、字串處理  
4. **綜合實戰**(第 7 天):用一個小專案(如成績計算器、簡易猜數字遊戲)整合所學  
5. 每天回顧前一天內容並進行小測驗

## 格式(Format)  
每天的內容需以以下格式呈現:
- **主題**:今日的學習主題  
- **知識重點**:條列說明  
- **範例程式**:附輸入/輸出  
- **練習題**:基礎題 + 挑戰題  
- **常見錯誤與提示**:列出新手易犯錯誤與解法

## 指令集(Instruction Set)  
- 禁止一次把 7 天內容全部丟出來,必須按天數逐步提供,並在我說「下一天」時才繼續  
- 程式碼必須是正確且可編譯執行的 ANSI C 語法  
- 範例需清楚標示程式碼區塊與輸出結果  
- 解說需避免過多艱澀專有名詞,除非有附淺顯易懂的解釋  
- 遇到複雜概念時,需用生活化比喻幫助理解

## 排除條件(Exclusions)  
- 不使用其他語言(如 C++、Java)語法  
- 不跳過基礎直接進階  
- 不使用過於抽象、無法立即實作的範例


簡報


Prompt 輸出結果

你說:

我都沒有基礎,我想請你安排怎麼快速學會基本語法,編輯器我比較喜歡Dev C++

ChatGPT 說:

好,那我幫你安排一個 7 天 C 語言速成計畫,用 Dev-C++ 當編輯器,保證從零基礎也能跟上。
我們會一步步來,每天學一小塊,搭配範例 + 練習 + 常見錯誤提醒,累積成一整套技能。


Day 1:環境安裝與第一支程式

主題:C 語言環境與基礎輸出

知識重點

  1. 安裝 Dev-C++

  2. 建立專案 / 新檔案

    • 開啟 Dev-C++ → File → New → Source File

    • 檔案存成 .c(例如 hello.c)

  3. C 語言結構

#include <stdio.h>  // 標頭檔,讓你能用 printf
int main() {        // 主程式入口
    // 程式內容
    return 0;       // 程式結束
}
  1. printf 輸出

    • 用來在螢幕顯示文字或數字。

    • 字串要用雙引號 “”。

範例程式 1:Hello World
#include <stdio.h>

int main() {
    printf("Hello World!\n");
    printf("我正在學 C 語言!\n");
    return 0;
}

輸出結果:

Hello World!
我正在學 C 語言!
範例程式 2:顯示數字
#include <stdio.h>

int main() {
    printf("我今年 %d 歲\n", 20);
    printf("圓周率大約是 %.2f\n", 3.14159);
    return 0;
}

輸出結果:

我今年 20 歲
圓周率大約是 3.14
%d → 整數
%.2f → 小數點後兩位

練習題

  1. 基礎題:寫一支程式,輸出你的名字、年齡和興趣。
  2. 挑戰題:輸出下列內容(注意換行)
C 語言真好玩!
我一定能學會!
常見錯誤與提示
  • 忘記分號 ; → 編譯會報錯。
  • 中文輸出亂碼 → 改成 UTF-8 with BOM 儲存(File → Save As → Encoding)。
  • printf 裡的字串記得用雙引號 “”,不能用單引號。

如果你願意,我明天可以帶你進入 Day 2:變數、資料型態與輸入 scanf,讓你會寫互動式程式。

我可以先幫你把 Dev-C++ 的設定流程和中文編碼問題一次圖解整理好,你就能立刻開始編寫。

你要我先幫你把 Dev-C++ 安裝與設定教學 完整做出來嗎?這樣今天就能直接寫程式了。


你說:

我想先知道7天的內容,如果我先學會可以繼續


ChatGPT 說:

好,那我先幫你把 7 天 C 語言速成計畫總覽 給你,你可以自己加速進度,

等你跟我說「下一天」時,我再給你該天的詳細教學、範例、練習題、除錯技巧。


後續內容,請看下個頁籤「七天總瀏覽」

7 天 C 語言速成計畫(Dev-C++ 版本)

Day 1 — 環境安裝與第一支程式
  • 安裝 Dev-C++,設定 UTF-8 編碼

  • C 語言基本架構(#include、main()、return 0;)

  • 螢幕輸出 printf

  • 格式化輸出 %d, %f, %s

  • 範例:Hello World、顯示數字


Day 2 — 變數、資料型態與輸入 scanf
  • 常用資料型態:int、float、double、char

  • 宣告與初始化變數

  • 使用 scanf 接收輸入

  • 基本運算:加、減、乘、除、取餘數

  • 範例:輸入兩數相加、BMI 計算


Day 3 — 條件判斷 if、else if、else
  • 比較運算:>, <, ==, !=, >=, <=

  • 邏輯運算:&&, ||, !

  • if 結構與巢狀判斷

  • 範例:判斷奇偶數、成績等級判斷


Day 4 — 迴圈(for、while、do while)
  • for 迴圈基本結構

  • while 與 do while 的差別

  • 迴圈控制:break, continue

  • 範例:1 到 100 的總和、乘法表


Day 5 — 陣列與字串
  • 一維陣列宣告與使用

  • 基本字串(char 與 %s)

  • 字串輸入與輸出

  • 範例:計算 5 個數的平均、名字反轉


Day 6 — 函式(自訂功能模組)
  • 定義與呼叫函式

  • 傳遞參數與回傳值

  • 區域變數與全域變數

  • 範例:計算平方、簡單計算機(加減乘除)


Day 7 — 綜合小專案
  • 整合前 6 天的內容

  • 專案建議:

  • 成績計算器(輸入多科分數 → 平均、最高、最低)

  • 猜數字遊戲(亂數產生 + 判斷 + 迴圈)

  • 完成後可自行加功能


如果你想快速學,可以 一天學兩天的內容,3–4 天就能寫小專案。

我建議你先跟著 Day 1 寫出 Hello World,再開始 Day 2 學輸入,

因為輸入/輸出是後面互動式程式的基礎。


你說:


ChatGPT 說:

好,那我們直接進到 Day 2:變數、資料型態與輸入 scanf :rocket:


後續內容,請看下個頁籤「Day2」


Day 2 — 變數、資料型態與輸入

主題:使用變數儲存資料,並用 scanf 接收使用者輸入。


知識重點

  1. 變數(Variable)
    • 用來儲存資料,會佔用電腦記憶體。
    • 必須先宣告才能用。
int age;     // 整數
float pi;    // 小數
char grade;  // 單一字元
  1. 常見資料型態
型態 範例數值 格式化符號
int 10, -5 %d
float 3.14, -0.5 %f
double 3.14159265 %lf
char ‘A’, ‘z’ %c
  1. 輸入 scanf
  • 語法:
scanf("%d", &變數名稱); // 整數輸入
& 是取變數位址,讓 scanf 能把值放進變數。

範例程式 1:輸入兩數相加

#include <stdio.h>

int main() {
    int a, b, sum;

    printf("請輸入第一個整數: ");
    scanf("%d", &a);

    printf("請輸入第二個整數: ");
    scanf("%d", &b);

    sum = a + b;

    printf("兩數相加結果為: %d\n", sum);

    return 0;
}

輸入 / 輸出示例:

請輸入第一個整數: 5
請輸入第二個整數: 7
兩數相加結果為: 12

範例程式 2:BMI 計算

#include <stdio.h>

int main() {
    float height, weight, bmi;

    printf("請輸入身高(公尺): ");
    scanf("%f", &height);

    printf("請輸入體重(公斤): ");
    scanf("%f", &weight);

    bmi = weight / (height * height);

    printf("你的 BMI 為: %.2f\n", bmi);

    return 0;
}

輸入 / 輸出示例:

請輸入身高(公尺): 1.75
請輸入體重(公斤): 68
你的 BMI 為: 22.20

練習題

  1. 基礎題:輸入兩個整數,輸出它們的差(相減結果)。
  2. 挑戰題:輸入底和高,計算三角形面積(公式:面積 = 底 × 高 ÷ 2)。
常見錯誤與提示
  • 忘記 &:scanf(“%d”, a); → 會錯,要改成 scanf(“%d”, &a);
  • 輸入浮點數要用 %f,雙精度要用 %lf
  • 記得 printf 輸出小數時可用 %.2f 控制小數位

如果你願意,Day 3 我就會教你 if 條件判斷,這樣你就能做「BMI 健康判斷」或「成績等級判斷」的互動程式。

要不要我直接幫你進 Day 3:條件判斷,讓你今天就能寫出帶判斷的程式?


你說:


ChatGPT 說:

好,那我們直接進到 Day 3:條件判斷 if / else :bullseye:


後續內容,請看下個頁籤「Day3」


Day 3 — 條件判斷 if / else

主題:讓程式能「判斷條件,依情況執行不同的程式碼」。

知識重點

  1. 基本語法
if (條件) {
    // 條件為真時執行
} else {
    // 條件為假時執行
}
  1. 比較運算子
運算子 意義
== 等於
!= 不等於
> 大於
< 小於
>= 大於等於
<= 小於等於
  1. 邏輯運算子
    | 運算子 | 意義 | 範例 |
    |---------|----------|------|
    | && | 且 AND | a>0 && b>0 |
    | || | 或 OR | a>0 || b>0 |
    | ! | 非 NOT | !(a>0) |

範例程式 1:判斷奇偶數

#include <stdio.h>

int main() {
    int num;

    printf("請輸入一個整數: ");
    scanf("%d", &num);

    if (num % 2 == 0) {
        printf("這是偶數\n");
    } else {
        printf("這是奇數\n");
    }

    return 0;
}

輸入 / 輸出示例:

請輸入一個整數: 5
這是奇數

範例程式 2:成績等級判斷

#include <stdio.h>

int main() {
    int score;

    printf("請輸入分數: ");
    scanf("%d", &score);

    if (score >= 90) {
        printf("等級: A\n");
    } else if (score >= 80) {
        printf("等級: B\n");
    } else if (score >= 70) {
        printf("等級: C\n");
    } else if (score >= 60) {
        printf("等級: D\n");
    } else {
        printf("等級: F\n");
    }

    return 0;
}

輸入 / 輸出示例:

請輸入分數: 85
等級: B

練習題

  1. 基礎題:輸入一個整數,判斷它是否為正數、負數或 0。

  2. 挑戰題:修改 BMI 計算程式,加入判斷:

    • BMI < 18.5 → 「體重過輕」
    • 18.5 ≤ BMI < 24 → 「正常範圍」
    • BMI ≥ 24 → 「體重過重」

常見錯誤與提示*

  • 用 = 取代 == 會變成賦值而非比較(大錯!)。
  • if 條件一定要用括號 ()。
  • 多層判斷時,條件順序很重要,否則會提早命中錯誤的區間。

如果你想繼續加速,Day 4 我會教你迴圈 (for, while),
這樣你今天就能寫出「乘法表」、「1 到 100 的總和」等重複計算的程式。

要直接進 Day 4 嗎?這樣你就快到能寫小專案的階段了。


你說:

我可能需要多一點練習


ChatGPT 說:

OK,那我們今天就不急著進 Day 4,先幫你把 Day 3 的條件判斷 加強練習,讓你熟到不會卡。

我幫你設計 5 題從簡單到中等 的練習,照順序做,最後再給你參考解答。


後續內容,請看下個頁籤「複習」


條件判斷加強練習

練習 1:正負數判斷

題目

輸入一個整數,判斷它是 正數、負數 還是 0。

輸入 / 輸出示例:


輸入: -5

輸出: 負數


練習 2:最大值判斷

題目

輸入兩個整數,輸出較大的那一個。

輸入 / 輸出示例:


輸入: 10 20

輸出: 最大值為: 20


練習 3:簡單四則計算機

題目

輸入兩個數字和一個運算符號(+, -, *, /),依運算符號計算結果。

輸入 / 輸出示例:


輸入: 5 3 +

輸出: 8


輸入: 8 2 /

輸出: 4


練習 4:BMI 健康判斷

題目

輸入身高(公尺)與體重(公斤),計算 BMI 並輸出健康狀態:

  • BMI < 18.5 → 體重過輕

  • 18.5 ≤ BMI < 24 → 正常範圍

  • BMI ≥ 24 → 體重過重


練習 5:閏年判斷

題目

輸入年份,判斷是否為閏年(2 月有 29 天)。

規則:

  • 能被 400 整除 → 閏年

  • 能被 4 整除但不能被 100 整除 → 閏年

  • 其他情況 → 平年

輸入 / 輸出示例:


輸入: 2024

輸出: 閏年


輸入: 2023

輸出: 平年


:pushpin: 如果你要,我可以幫你把 這 5 題的完整解答程式碼 全部寫好,

你可以先自己嘗試,卡住再對答案。

你是想 自己先試做 還是 直接看完整解答?


你說:

我懂了,可以繼續


ChatGPT 說:

好,那我們直接進到 Day 4:迴圈 (for / while / do while) :rocket:


後續內容,請看下個頁籤「Day4」


Day 4 — 迴圈

主題:讓程式可以自動重複執行相同的動作,避免手動重寫一堆相似程式碼。


知識重點

  1. for 迴圈
for (起始值; 條件; 更新) {
    // 重複執行的內容
}

例:

for (int i = 1; i <= 5; i++) {
    printf("%d\n", i);
}

  1. while 迴圈
while (條件) {
    // 重複執行的內容
}

例:

int i = 1;
while (i <= 5) {
    printf("%d\n", i);
    i++;
}

  1. do while 迴圈
do {
    // 先執行一次
} while (條件);

例:

int i = 1;
do {
    printf("%d\n", i);
    i++;
} while (i <= 5);
  1. break 與 continue
    • break:立刻跳出迴圈
    • continue:跳過本次迴圈,直接進入下一次

範例程式 1:1 到 100 的總和
#include <stdio.h>

int main() {
    int sum = 0;

    for (int i = 1; i <= 100; i++) {
        sum += i;
    }

    printf("1 到 100 的總和為: %d\n", sum);
    return 0;
}

輸出結果:

1 到 100 的總和為: 5050
範例程式 2:9x9 乘法表
#include <stdio.h>

int main() {
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= 9; j++) {
            printf("%d x %d = %2d  ", i, j, i*j);
        }
        printf("\n");
    }
    return 0;
}

輸出結果:

1 x 1 =  1  1 x 2 =  2  ...  1 x 9 =  9
2 x 1 =  2  2 x 2 =  4  ...  2 x 9 = 18
...
9 x 1 =  9  ...     9 x 9 = 81

練習題

  1. 基礎題:使用 for 計算 1 到 N 的平方和(輸入 N)。
  2. 挑戰題:用 while 寫一個猜數字遊戲:
    • 程式隨機產生 1~100 的數字
    • 使用者輸入數字,提示「太大」「太小」直到猜中
常見錯誤與提示
  • for 條件寫錯會造成 無限迴圈。
  • 小心 while 內的計數器要自己更新。
  • do while 至少會執行一次,即使條件一開始是假的。

如果你願意,我可以讓你今天直接衝到 Day 5:陣列與字串,
這樣你就可以做出「成績統計」、「名字處理」的程式,功能又會多一大塊。

你要我直接進 Day 5 嗎?這樣你明天就能做完整小專案了。


你說:

ok


ChatGPT 說:

好,那我們直接進到 Day 5:陣列與字串 :package:


後續內容,請看下個頁籤「Day5」


Day 5 — 陣列與字串

主題:一次存放多筆資料,並且處理文字內容。

知識重點:

1.陣列(Array)

  • 一維陣列:一排連續的相同型態變數
int scores[5];  // 可以存 5 個整數
scores[0] = 90; // 陣列從索引 0 開始
  • 宣告與初始化
int scores[5] = {90, 85, 88, 92, 100};
  • 走訪陣列(for 迴圈)
for (int i = 0; i < 5; i++) {
    printf("%d\n", scores[i]);
}

2.字串(String)

  • C 語言沒有真正的字串型態,用 char 陣列表示
  • 以 ‘\0’(字串結尾符號)作為終止
char name[20] = "Alice";
  • 輸入 / 輸出字串
char name[20];
scanf("%s", name); // 不需要 &
printf("Hello %s\n", name);

範例程式 1:5 個分數的平均
#include <stdio.h>

int main() {
    int scores[5];
    int sum = 0;

    for (int i = 0; i < 5; i++) {
        printf("請輸入第 %d 個分數: ", i + 1);
        scanf("%d", &scores[i]);
        sum += scores[i];
    }

    printf("平均分數: %.2f\n", sum / 5.0);
    return 0;
}

輸入 / 輸出示例:

請輸入第 1 個分數: 90
請輸入第 2 個分數: 80
請輸入第 3 個分數: 85
請輸入第 4 個分數: 95
請輸入第 5 個分數: 88
平均分數: 87.60

範例程式 2:名字反轉
#include <stdio.h>
#include <string.h> // strlen()

int main() {
    char name[50];
    printf("請輸入名字: ");
    scanf("%s", name);

    int len = strlen(name);
    printf("反轉後: ");
    for (int i = len - 1; i >= 0; i--) {
        printf("%c", name[i]);
    }
    printf("\n");

    return 0;
}

輸入 / 輸出示例:

請輸入名字: Alice
反轉後: ecilA

練習題

  1. 基礎題:輸入 10 個整數,找出最大值與最小值。
  2. 挑戰題:輸入一行字串(不含空白),判斷它是否為「回文」(正反讀一樣)。

常見錯誤與提示
  • 陣列索引 一定從 0 開始,[0] 到 [n-1]。
  • scanf(“%s”, name) 不需要 &。
  • 輸入字串時 %s 會遇到空白就結束,要讀整行可用 gets()(但有安全問題)或 fgets()。

如果你想繼續加速,Day 6 我會教你函式(自訂功能模組),
這樣你就能把常用的計算邏輯打包成可重複使用的「小工具」,程式會更乾淨。

要我直接進 Day 6 嗎?
這樣你下一步就能做出「多功能計算機」的程式了。


你說:

Day 5 以前我都會


ChatGPT 說:

那很好 :+1:
既然你 Day 1 ~ Day 5 都會,那我們就直接進到 Day 6:函式,幫你進階化程式結構。


後續內容,請看下個頁籤「Day6」


Day 6 — 函式(Function)

主題:把程式中重複的功能獨立出來,讓程式更乾淨、更好維護。


知識重點
1.為什麼要用函式?

  • 減少重複程式碼
  • 讓程式更有結構
  • 方便除錯與維護

2.函式結構

回傳型態 函式名稱(參數) {
    // 程式內容
    return 回傳值; // 若無回傳值可省略
}

3.範例:計算平方

#include <stdio.h>

int square(int x) {
    return x * x;
}

int main() {
    int num;
    printf("輸入一個整數: ");
    scanf("%d", &num);

    printf("平方為: %d\n", square(num));
    return 0;
}

4.參數與回傳值類型

  • 有參數、有回傳值
int add(int a, int b) {
    return a + b;
}
  • 有參數、無回傳值
void printLine(int n) {
    for (int i = 0; i < n; i++) printf("-");
    printf("\n");
}
  • 無參數、有回傳值
int getNumber() {
    int x;
    printf("輸入數字: ");
    scanf("%d", &x);
    return x;
}
  • 無參數、無回傳值
void hello() {
    printf("Hello!\n");
}

範例程式 1:簡單計算機
#include <stdio.h>

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
float divide(int a, int b) { return (float)a / b; }

int main() {
    int x, y;
    char op;

    printf("輸入: 數字 運算符號(+ - * /) 數字\n");
    scanf("%d %c %d", &x, &op, &y);

    if (op == '+') printf("結果: %d\n", add(x, y));
    else if (op == '-') printf("結果: %d\n", sub(x, y));
    else if (op == '*') printf("結果: %d\n", mul(x, y));
    else if (op == '/') printf("結果: %.2f\n", divide(x, y));
    else printf("運算符號錯誤!\n");

    return 0;
} 

範例程式 2:畫三角形
#include <stdio.h>

void drawTriangle(int height) {
    for (int i = 1; i <= height; i++) {
        for (int j = 1; j <= i; j++) {
            printf("*");
        }
        printf("\n");
    }
}

int main() {
    int h;
    printf("輸入高度: ");
    scanf("%d", &h);
    drawTriangle(h);
    return 0;
}

練習題

  1. 基礎題:寫一個函式 max(a, b) 回傳兩數中較大值。
  2. 挑戰題:寫一個函式 isPrime(n) 判斷一個整數是否為質數(質數:只能被 1 和自己整除)。

常見錯誤與提示
  • 函式必須先宣告或定義才能在 main() 呼叫。
  • 如果函式沒有回傳值,要用 void。
  • 函式名稱不要和變數名稱衝突。

如果你想直接衝最終挑戰,Day 7 我會帶你做一個完整小專案,
用到 輸入、輸出、條件、迴圈、陣列、函式 一次整合。

我這邊有兩個小專案可以選:

  1. 成績計算器(輸入多科分數 → 平均、最高、最低)
  2. 猜數字遊戲(亂數產生 + 判斷 + 迴圈)

你想 Day 7 做哪一個?


你說:

都做


ChatGPT 說:

太好了!那我們直接進到 Day 7:綜合小專案,一次完成 成績計算器 + 猜數字遊戲,把前 6 天學的全部串起來。:rocket:


後續內容,請看下個頁籤「Day7」


Day 7 — 綜合小專案(成績計算器 + 猜數字遊戲)

主題:整合輸入/輸出、條件、迴圈、陣列、字串、函式來完成兩個小專案。


一、專案 1:成績計算器

知識重點

  • 用 陣列 存放多筆分數
  • 用 函式 分別計算:平均、最高、最低
  • 輸入驗證(例如分數需 0~100)

範例程式:成績計算器

#include <stdio.h>

#define MAX_N 100

// 函式宣告
double avg(int a[], int n);
int max(int a[], int n);
int min(int a[], int n);

int main(void) {
    int n;
    int scores[MAX_N];

    printf("請輸入科目數 (1~%d): ", MAX_N);
    if (scanf("%d", &n) != 1 || n <= 0 || n > MAX_N) {
        printf("輸入錯誤!\n");
        return 0;
    }

    for (int i = 0; i < n; i++) {
        printf("請輸入第 %d 科分數(0~100): ", i + 1);
        if (scanf("%d", &scores[i]) != 1 || scores[i] < 0 || scores[i] > 100) {
            printf("分數輸入錯誤!\n");
            return 0;
        }
    }

    printf("\n=== 成績統計 ===\n");
    printf("平均:%.2f\n", avg(scores, n));
    printf("最高:%d\n", max(scores, n));
    printf("最低:%d\n", min(scores, n));

    return 0;
}

// 函式實作
double avg(int a[], int n) {
    int sum = 0;
    for (int i = 0; i < n; i++) sum += a[i];
    return sum / (double)n;
}

int max(int a[], int n) {
    int m = a[0];
    for (int i = 1; i < n; i++) if (a[i] > m) m = a[i];
    return m;
}

int min(int a[], int n) {
    int m = a[0];
    for (int i = 1; i < n; i++) if (a[i] < m) m = a[i];
    return m;
}

輸入 / 輸出示例:

請輸入科目數 (1~100): 5
請輸入第 1 科分數(0~100): 90
請輸入第 2 科分數(0~100): 80
請輸入第 3 科分數(0~100): 85
請輸入第 4 科分數(0~100): 95
請輸入第 5 科分數(0~100): 88

=== 成績統計 ===
平均:87.60
最高:95
最低:80

二、專案 2:猜數字遊戲

知識重點

  • 亂數:rand()、srand(time(NULL))
  • 迴圈 + 條件:反覆猜、提示太大/太小
  • 計算 猜的次數,並結束時回報

範例程式:猜數字(1~100)

#include <stdio.h>
#include <stdlib.h>  // rand, srand
#include <time.h>    // time

int main(void) {
    int secret, guess, count = 0;

    srand((unsigned)time(NULL));
    secret = rand() % 100 + 1; // 1~100

    // 提示:想測試時可先顯示答案
    // printf("[Debug] secret = %d\n", secret);

    printf("我想了一個 1~100 的整數,來猜猜看!\n");

    while (1) {
        printf("請輸入你的猜測: ");
        if (scanf("%d", &guess) != 1) {
            printf("輸入錯誤!\n");
            return 0;
        }
        count++;

        if (guess < secret) {
            printf("太小了!\n");
        } else if (guess > secret) {
            printf("太大了!\n");
        } else {
            printf("答對了!你總共猜了 %d 次。\n", count);
            break;
        }
    }

    return 0;
}

輸入 / 輸出示例(可能的一次遊戲過程):

我想了一個 1~100 的整數,來猜猜看!
請輸入你的猜測: 50
太大了!
請輸入你的猜測: 25
太小了!
請輸入你的猜測: 33
太小了!
請輸入你的猜測: 41
答對了!你總共猜了 4 次。

練習題

基礎題

1.在成績計算器中,加入「及格數量」與「不及格數量」統計(及格門檻 60)。

2.在猜數字遊戲中,加入「範圍提示」,例如顯示目前可能的區間 [lo, hi]。

挑戰題

1.成績分佈圖(文字版):輸入 N 筆分數後,輸出每 10 分一檔(0-9、10-19、…、90-100)的計數直方圖(用 * 畫)。
2.限定次數猜數字:最多猜 7 次,猜不中就顯示答案並結束;猜中則顯示剩餘次數作為獎勵分。


常見錯誤與提示
  • 亂數沒變:忘記 srand(time(NULL)); → 每次都同一個答案。
  • rand()%100+1 才是 1100;寫成 %101 會得到 0100。
  • 陣列越界:確保輸入的科目數 n 不超過陣列大小。
  • 平均值類型:sum / (double)n 避免整數除法誤差。
  • 輸入驗證:scanf 回傳值不為 1 表示讀取失敗,要處理錯誤。
  • 格式化輸出:平均請用 %.2f 控制小數位。

如果你願意,我可以:

  • 幫你把兩個專案 合併成一個選單式程式(選 1 做成績、選 2 玩猜數字、選 0 離開)。
  • 或是加上 檔案讀寫(把分數讀寫到檔案),升級到進階應用。

你想先做哪個延伸?還是把「選單版」一次做起來?


你說:

要先休息一下


ChatGPT 說:

OK :grinning_face_with_smiling_eyes: 你先休息一下,等你回來我們再繼續。
休息時可以想一下要不要把 兩個小專案做成選單版,
這樣就能一次啟動程式,想算成績或玩猜數字都可以直接選。

等你回來,我隨時可以幫你接著做。


你說:

OK那我懂了,先到這邊


ChatGPT 說:

ChatGPT 說:

:+1: 那今天就先到這邊。
你現在已經掌握了 C 語言從基礎到小專案 的完整流程,
之後要自己練習或加強的話,可以從「延伸挑戰」開始。

等你想再進階,例如 檔案讀寫、結構體、指標,
我可以幫你安排 進階 7 天計畫。

加油 :flexed_biceps: 你已經比很多初學者進步快很多了!


心得

在這次嘗試「一週內學會基礎 C 語言」的過程中,我深刻感受到 C 語言與 Python 在思維上的差異。Python 對初學者非常友好,很多細節都被自動處理,而 C 語言則要求你更精準地掌控每一個變數的型態、記憶體的使用,以及程式的運行邏輯。
雖然一開始會覺得嚴格的語法和編譯錯誤很麻煩,但這也讓我更理解電腦的工作方式。尤其是在練習過程中,我發現除錯技巧和程式邏輯的嚴謹性,是從 C 語言中可以培養的核心能力,不但能獨立撰寫簡單的 C 程式,還為未來學習更進階的系統開發與嵌入式應用打下了堅實的基礎。