專題 - 一週內學會基礎C語言 - 董家瑋
目錄
前言
因為我已經學過 Python 基礎,但在一些情境下 Python(或其他高階語言)並不容易,甚至做不到某些事情,所以我決定開始學第二個程式語言。
為什麼選擇 C 語言而不是其他語言呢?原因有三:
-
滲透範圍廣:C 語言在各種平台與系統中都有應用,影響力比多數語言更深遠。
-
語法有相似性:Python 在語法設計上部分參考了 C 語言,因此對我來說上手門檻較低。
-
應用場景獨特:C 語言廣泛應用於嵌入式系統、驅動程式、即時系統、資源極限環境,這些地方是 Python 幾乎無法直接勝任的領域,往往還需要「依賴 C」來實作。
動機
因為我現在是有學過 Python 基礎,但是 Python(或其他高階語言)不容易甚至做不到的事情,所以我就要開始學第二個程式語言,那位甚麼會學 C 語言而不是其他的呢 ? 因為 C 語言的「滲透範圍」確實比多數程式語言都廣,而且它還有一些相似之處,這是因為這種相似感主要來自於 Python 在語法設計上,部分參考了 C 語言,最後是 C 語言的生活應用大多出現在嵌入式系統、驅動程式、即時系統、資源極限環境,這些地方 Python 幾乎做不到,或只能「依賴 C」來完成。
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 語言環境與基礎輸出
知識重點
-
安裝 Dev-C++
-
下載網址(Dev-C++ 經典版):Dev-C++ download | SourceForge.net
-
安裝時選擇 TDM-GCC 編譯器(自帶的即可)。
-
-
建立專案 / 新檔案
-
開啟 Dev-C++ → File → New → Source File
-
檔案存成 .c(例如 hello.c)
-
-
C 語言結構
#include <stdio.h> // 標頭檔,讓你能用 printf
int main() { // 主程式入口
// 程式內容
return 0; // 程式結束
}
-
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 → 小數點後兩位
練習題
- 基礎題:寫一支程式,輸出你的名字、年齡和興趣。
- 挑戰題:輸出下列內容(注意換行)
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
後續內容,請看下個頁籤「Day2」
Day 2 — 變數、資料型態與輸入
主題:使用變數儲存資料,並用 scanf 接收使用者輸入。
知識重點
- 變數(Variable)
- 用來儲存資料,會佔用電腦記憶體。
- 必須先宣告才能用。
int age; // 整數
float pi; // 小數
char grade; // 單一字元
- 常見資料型態
型態 | 範例數值 | 格式化符號 |
---|---|---|
int | 10, -5 | %d |
float | 3.14, -0.5 | %f |
double | 3.14159265 | %lf |
char | ‘A’, ‘z’ | %c |
- 輸入 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
練習題
- 基礎題:輸入兩個整數,輸出它們的差(相減結果)。
- 挑戰題:輸入底和高,計算三角形面積(公式:面積 = 底 × 高 ÷ 2)。
常見錯誤與提示
- 忘記 &:scanf(“%d”, a); → 會錯,要改成 scanf(“%d”, &a);
- 輸入浮點數要用 %f,雙精度要用 %lf
- 記得 printf 輸出小數時可用 %.2f 控制小數位
如果你願意,Day 3 我就會教你 if 條件判斷,這樣你就能做「BMI 健康判斷」或「成績等級判斷」的互動程式。
要不要我直接幫你進 Day 3:條件判斷,讓你今天就能寫出帶判斷的程式?
你說:
好
ChatGPT 說:
好,那我們直接進到 Day 3:條件判斷 if / else
後續內容,請看下個頁籤「Day3」
Day 3 — 條件判斷 if / else
主題:讓程式能「判斷條件,依情況執行不同的程式碼」。
知識重點
- 基本語法
if (條件) {
// 條件為真時執行
} else {
// 條件為假時執行
}
- 比較運算子
運算子 | 意義 |
---|---|
== | 等於 |
!= | 不等於 |
> | 大於 |
< | 小於 |
>= | 大於等於 |
<= | 小於等於 |
- 邏輯運算子
| 運算子 | 意義 | 範例 |
|---------|----------|------|
| && | 且 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
練習題
-
基礎題:輸入一個整數,判斷它是否為正數、負數或 0。
-
挑戰題:修改 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
輸出: 平年
如果你要,我可以幫你把 這 5 題的完整解答程式碼 全部寫好,
你可以先自己嘗試,卡住再對答案。
你是想 自己先試做 還是 直接看完整解答?
你說:
我懂了,可以繼續
ChatGPT 說:
好,那我們直接進到 Day 4:迴圈 (for / while / do while)
後續內容,請看下個頁籤「Day4」
Day 4 — 迴圈
主題:讓程式可以自動重複執行相同的動作,避免手動重寫一堆相似程式碼。
知識重點
- for 迴圈
for (起始值; 條件; 更新) {
// 重複執行的內容
}
例:
for (int i = 1; i <= 5; i++) {
printf("%d\n", i);
}
- while 迴圈
while (條件) {
// 重複執行的內容
}
例:
int i = 1;
while (i <= 5) {
printf("%d\n", i);
i++;
}
- do while 迴圈
do {
// 先執行一次
} while (條件);
例:
int i = 1;
do {
printf("%d\n", i);
i++;
} while (i <= 5);
- 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
練習題
- 基礎題:使用 for 計算 1 到 N 的平方和(輸入 N)。
- 挑戰題:用 while 寫一個猜數字遊戲:
- 程式隨機產生 1~100 的數字
- 使用者輸入數字,提示「太大」「太小」直到猜中
常見錯誤與提示
- for 條件寫錯會造成 無限迴圈。
- 小心 while 內的計數器要自己更新。
- do while 至少會執行一次,即使條件一開始是假的。
如果你願意,我可以讓你今天直接衝到 Day 5:陣列與字串,
這樣你就可以做出「成績統計」、「名字處理」的程式,功能又會多一大塊。
你要我直接進 Day 5 嗎?這樣你明天就能做完整小專案了。
你說:
ok
ChatGPT 說:
好,那我們直接進到 Day 5:陣列與字串
後續內容,請看下個頁籤「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
練習題
- 基礎題:輸入 10 個整數,找出最大值與最小值。
- 挑戰題:輸入一行字串(不含空白),判斷它是否為「回文」(正反讀一樣)。
常見錯誤與提示
- 陣列索引 一定從 0 開始,[0] 到 [n-1]。
- scanf(“%s”, name) 不需要 &。
- 輸入字串時 %s 會遇到空白就結束,要讀整行可用 gets()(但有安全問題)或 fgets()。
如果你想繼續加速,Day 6 我會教你函式(自訂功能模組),
這樣你就能把常用的計算邏輯打包成可重複使用的「小工具」,程式會更乾淨。
要我直接進 Day 6 嗎?
這樣你下一步就能做出「多功能計算機」的程式了。
你說:
Day 5 以前我都會
ChatGPT 說:
那很好
既然你 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;
}
練習題
- 基礎題:寫一個函式 max(a, b) 回傳兩數中較大值。
- 挑戰題:寫一個函式 isPrime(n) 判斷一個整數是否為質數(質數:只能被 1 和自己整除)。
常見錯誤與提示
- 函式必須先宣告或定義才能在 main() 呼叫。
- 如果函式沒有回傳值,要用 void。
- 函式名稱不要和變數名稱衝突。
如果你想直接衝最終挑戰,Day 7 我會帶你做一個完整小專案,
用到 輸入、輸出、條件、迴圈、陣列、函式 一次整合。
我這邊有兩個小專案可以選:
- 成績計算器(輸入多科分數 → 平均、最高、最低)
- 猜數字遊戲(亂數產生 + 判斷 + 迴圈)
你想 Day 7 做哪一個?
你說:
都做
ChatGPT 說:
太好了!那我們直接進到 Day 7:綜合小專案,一次完成 成績計算器 + 猜數字遊戲,把前 6 天學的全部串起來。
後續內容,請看下個頁籤「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 你先休息一下,等你回來我們再繼續。
休息時可以想一下要不要把 兩個小專案做成選單版,
這樣就能一次啟動程式,想算成績或玩猜數字都可以直接選。
等你回來,我隨時可以幫你接著做。
你說:
OK那我懂了,先到這邊
ChatGPT 說:
ChatGPT 說:
好 那今天就先到這邊。
你現在已經掌握了 C 語言從基礎到小專案 的完整流程,
之後要自己練習或加強的話,可以從「延伸挑戰」開始。
等你想再進階,例如 檔案讀寫、結構體、指標,
我可以幫你安排 進階 7 天計畫。
加油 你已經比很多初學者進步快很多了!
心得
在這次嘗試「一週內學會基礎 C 語言」的過程中,我深刻感受到 C 語言與 Python 在思維上的差異。Python 對初學者非常友好,很多細節都被自動處理,而 C 語言則要求你更精準地掌控每一個變數的型態、記憶體的使用,以及程式的運行邏輯。
雖然一開始會覺得嚴格的語法和編譯錯誤很麻煩,但這也讓我更理解電腦的工作方式。尤其是在練習過程中,我發現除錯技巧和程式邏輯的嚴謹性,是從 C 語言中可以培養的核心能力,不但能獨立撰寫簡單的 C 程式,還為未來學習更進階的系統開發與嵌入式應用打下了堅實的基礎。