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

C 語言結構體陣列實作:學生成績統計完整修正版

     編輯:程式設計綜合問答

題目需求回顧

輸入 5 位學生的學號、姓名、三科成績;計算個人平均、全班總平均;找出最高平均分學生並輸出其姓名與平均。要求模組化:輸入、計算平均、找最高分分別為函式。

原始碼主要問題分析

  1. scanf("%d%c", &stu[i].num, &stu[i].name) 格式錯誤:%c 只讀單一字元,且會讀取殘留換行符。應用 %s 讀字串,並在 %d 後加空格跳過空白字元。
  2. 結構體未包含 average 欄位,導致平均分另存全域陣列 ave[3],大小不足且易混淆。
  3. max() 回傳 maxi 為索引+1,主函式未使用回傳值輸出結果。
  4. 缺少 stdio.h、stdlib.h 標頭檔;main 未回傳 int。
  5. 無輸入提示與結果輸出,使用者無法互動。

修正後完整程式碼

#include <stdio.h>
#include <stdlib.h>

#define N 5

typedef struct {
    int num;
    char name[20];
    int score[3];
    float average;
} Student;

Student stu[N];

void input();
void calculate_average();
int find_highest();

int main() {
    input();
    calculate_average();
    int idx = find_highest();

    // 輸出總平均
    float total_avg = 0;
    for (int i = 0; i < N; i++) total_avg += stu[i].average;
    total_avg /= N;
    printf("\n全班總平均:%.2f\n", total_avg);

    // 輸出最高分學生
    printf("最高分學生:%s  平均:%.2f\n", stu[idx].name, stu[idx].average);
    return 0;
}

void input() {
    for (int i = 0; i < N; i++) {
        printf("\n第 %d 位學生:\n", i+1);
        printf("學號:"); scanf("%d", &stu[i].num);
        printf("姓名:"); scanf("%19s", stu[i].name);  // 防止緩衝區溢位
        for (int j = 0; j < 3; j++) {
            printf("第 %d 科成績:", j+1);
            scanf("%d", &stu[i].score[j]);
        }
    }
}

void calculate_average() {
    for (int i = 0; i < N; i++) {
        int sum = 0;
        for (int j = 0; j < 3; j++) sum += stu[i].score[j];
        stu[i].average = sum / 3.0f;
    }
}

int find_highest() {
    int max_idx = 0;
    for (int i = 1; i < N; i++) {
        if (stu[i].average > stu[max_idx].average) max_idx = i;
    }
    return max_idx;
}

關鍵修正說明

  • 結構體新增 average 欄位,資料封裝性更好。
  • 使用 scanf("%19s", ...) 限制字串長度,避免緩衝區溢位。
  • 主函式完整輸出總平均與最高分學生資訊。
  • 函式職責單一,符合模組化要求。

延伸練習建議

  1. 加入動態記憶體配置(malloc/free)支援任意人數。
  2. 實作成績排序(依平均高低輸出名單)。
  3. 嘗試將資料存入檔案(fprintf/fscanf)實現持久化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved