| 行號 | 錯誤代碼 | 問題 | 修正 |
|---|---|---|---|
| 1 | #include | 缺少頭文件名 | #include <stdio.h> |
| 8 | for(i=0;i | 條件不完整 | for(i=0; i<N; i++) |
| 11 | sum=sum+Num[i] | 累加學號而非成績 | sum += score[i] |
| 12 | Maxscore=0 | 初始值 0 可能大於負分 | 首次賦值或設極小值 |
| 18 | Minscore=0 | 初始值 0 導致無法捕獲正分最小值 | 設極大值 9999999 或首次賦值 |
| 22 | Maxnum=Num[i] | 最小值分支錯誤賦值學號 | Minnum = Num[i] |
| 26 | ave=sum/10 | 整數除法截斷小數 | ave = sum / N (sum 為 float) |
| 27 | printf("%d", ave) | 平均分用 %d 輸出 float | printf("%f", ave) |
| 27 | Minnum 未初始化 | 若無更新則輸出垃圾值 | 初始化或首次賦值邏輯保證 |
#include <stdio.h>
#define N 10
int main() {
float score[N], Maxscore = 0, Minscore = 9999999, sum = 0, ave;
int Num[N], Maxnum, Minnum, i;
for (i = 0; i < N; i++) {
printf("請輸入第%d個學生的學號和成績:\n", i + 1);
scanf("%d,%f", &Num[i], &score[i]);
sum += score[i]; // 累加成績
if (score[i] > Maxscore) {
Maxscore = score[i];
Maxnum = Num[i];
}
if (score[i] < Minscore) { // 獨立 if,非 else if
Minscore = score[i];
Minnum = Num[i];
}
}
ave = sum / N;
printf("平均分為%.2f, 最高分及其學號為%.2f,%d, 最低分及其學號為%.2f,%d\n",
ave, Maxscore, Maxnum, Minscore, Minnum);
return 0;
}
// 方案一:首元素初始化(推薦,通用性強)
float Maxscore = score[0], Minscore = score[0];
int Maxnum = Num[0], Minnum = Num[0];
for (i = 1; i < N; i++) { ... }
// 方案二:極值常量(簡單場景適用)
float Maxscore = -1e9, Minscore = 1e9;
當所有成績相同時,else if 會導致最小值分支不執行。獨立 if 確保最大值、最小值邏輯互不干擾。
printf("%.2f", ave); // 保留兩位小數,比 %f 默認 6 位更友好
// 推薦:空格分隔,更寬容
scanf("%d %f", &Num[i], &score[i]);
// 或讀取整行解析
char line[100];
fgets(line, sizeof(line), stdin);
sscanf(line, "%d %f", &Num[i], &score[i]);
typedef struct {
int id;
float score;
} Student;
void inputStudents(Student arr[], int n) { ... }
void findMaxMin(Student arr[], int n, Student *max, Student *min) { ... }
float calcAverage(Student arr[], int n) { ... }
int main() {
Student students[N];
inputStudents(students, N);
Student max, min;
findMaxMin(students, N, &max, &min);
float ave = calcAverage(students, N);
printf("平均分:%.2f\n最高分:%d - %.2f\n最低分:%d - %.2f\n",
ave, max.id, max.score, min.id, min.score);
return 0;
}
ifprintf 格式符與變量類型嚴格對應Maxnum/ Minnum 區分度不夠,建議 maxId / minId該程序暴露了初學者常見的初始化缺失、邏輯分支錯誤、類型格式不匹配、輸入解析脆弱四大問題。通過系統性修復並引入結構體、函數模塊化,不僅修正錯誤,更提升了代碼可讀性、可維護性與擴展性。建議初學者養成「先設計數據結構、再寫邏輯、最後處理 I/O」的編程習慣。