首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C語言學生成績統計程序錯誤全解析:邏輯、類型、格式化多維修復

     編輯:程式設計疑難解答

原始代碼錯誤清單

行號錯誤代碼問題修正
1#include缺少頭文件名#include <stdio.h>
8for(i=0;i條件不完整for(i=0; i<N; i++)
11sum=sum+Num[i]累加學號而非成績sum += score[i]
12Maxscore=0初始值 0 可能大於負分首次賦值或設極小值
18Minscore=0初始值 0 導致無法捕獲正分最小值設極大值 9999999 或首次賦值
22Maxnum=Num[i]最小值分支錯誤賦值學號Minnum = Num[i]
26ave=sum/10整數除法截斷小數ave = sum / N (sum 為 float)
27printf("%d", ave)平均分用 %d 輸出 floatprintf("%f", ave)
27Minnum 未初始化若無更新則輸出垃圾值初始化或首次賦值邏輯保證

修正後完整代碼


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

關鍵修復解析

1. 極值初始化策略


// 方案一:首元素初始化(推薦,通用性強)
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;

2. 獨立 if 而非 else if

當所有成績相同時,else if 會導致最小值分支不執行。獨立 if 確保最大值、最小值邏輯互不干擾。

3. 格式化輸出精度控制


printf("%.2f", ave);  // 保留兩位小數,比 %f 默認 6 位更友好

4. 輸入格式健壯性


// 推薦:空格分隔,更寬容
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;
}

調試技巧總結

  1. 邊界初始化:極值變量必須合理初始化
  2. 累加對象:確認累加的是目標數值(成績而非學號)
  3. 分支互斥:最大/最小值判斷用獨立 if
  4. 格式匹配:printf 格式符與變量類型嚴格對應
  5. 變量命名:Maxnum/ Minnum 區分度不夠,建議 maxId / minId

總結

該程序暴露了初學者常見的初始化缺失、邏輯分支錯誤、類型格式不匹配、輸入解析脆弱四大問題。通過系統性修復並引入結構體、函數模塊化,不僅修正錯誤,更提升了代碼可讀性、可維護性與擴展性。建議初學者養成「先設計數據結構、再寫邏輯、最後處理 I/O」的編程習慣。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved