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

C語言實現學生成績管理:輸入表格、計算個人/專業平均分完整方案

     編輯:C 語言問答

需求分析

題目要求:

  1. 錄入學生信息:學號、姓名、專業、英語、高數、C語言成績。
  2. 預置兩個專業(網絡、會計)各5名學生,學號按 A01-A05、B01-B05 分配。
  3. 計算並輸出:每個學生的三科平均分、每個專業每科的平均分。

數據結構設計

#define MAX_STU 100

typedef struct {
    char id[10];      // 學號
    char name[20];    // 姓名
    char major[20];   // 專業
    float eng;        // 英語
    float math;       // 高數
    float c_lang;     // C語言
    float avg;        // 個人平均分
} Student;

Student stu[MAX_STU];
int stu_count = 0;

核心功能模塊

1. 數據初始化/輸入 (inputData)

void inputData() {
    // 預置專業與學號前綴
    char *majors[] = {"網絡", "會計"};
    char *prefix[] = {"A", "B"};
    int per_major = 5;

    for (int m = 0; m < 2; m++) {
        for (int i = 1; i <= per_major; i++) {
            Student *s = &stu[stu_count++];
            sprintf(s->id, "%s%02d", prefix[m], i); // A01, A02... B01, B02...
            strcpy(s->major, majors[m]);
            printf("請輸入 %s (%s) 的姓名 英語 高數 C語言: ", s->id, s->major);
            scanf("%s %f %f %f", s->name, &s->eng, &s->math, &s->c_lang);
            s->avg = (s->eng + s->math + s->c_lang) / 3.0f;
        }
    }
}

2. 計算專業每科平均分 (calcMajorAvg)

// 返回指定專業指定科目的平均分,無學生返回 -1
float calcMajorAvg(const char *major, int subject) {
    // subject: 0=英語, 1=高數, 2=C語言
    float sum = 0;
    int cnt = 0;
    for (int i = 0; i < stu_count; i++) {
        if (strcmp(stu[i].major, major) == 0) {
            switch (subject) {
                case 0: sum += stu[i].eng; break;
                case 1: sum += stu[i].math; break;
                case 2: sum += stu[i].c_lang; break;
            }
            cnt++;
        }
    }
    return (cnt == 0) ? -1.0f : (sum / cnt);
}

3. 顯示所有結果 (displayResults)

void displayResults() {
    printf("\n===== 學生個人平均分 =====\n");
    printf("%-8s %-10s %-8s %6s %6s %6s %6s\n", "學號", "姓名", "專業", "英語", "高數", "C語言", "平均");
    for (int i = 0; i < stu_count; i++) {
        Student *s = &stu[i];
        printf("%-8s %-10s %-8s %6.1f %6.1f %6.1f %6.2f\n",
               s->id, s->name, s->major, s->eng, s->math, s->c_lang, s->avg);
    }

    printf("\n===== 專業每科平均分 =====\n");
    char *majors[] = {"網絡", "會計"};
    char *subjects[] = {"英語", "高數", "C語言"};
    for (int m = 0; m < 2; m++) {
        printf("\n--- %s 專業 ---\n", majors[m]);
        for (int sub = 0; sub < 3; sub++) {
            float avg = calcMajorAvg(majors[m], sub);
            if (avg >= 0)
                printf("%s平均分: %.2f\n", subjects[sub], avg);
            else
                printf("%s平均分: 無數據\n", subjects[sub]);
        }
    }
}

主函數整合

int main() {
    inputData();
    displayResults();
    return 0;
}

關鍵點總結

知識點應用位置
結構體數組管理多條記錄Student stu[MAX_STU]
字符串操作 (strcpy, strcmp, sprintf)學號生成、專業比較、輸入輸出
浮點數運算與格式化輸出平均分計算、%.2f 顯示
模塊化函數設計inputData / calcMajorAvg / displayResults
巢狀循環遍歷專業與學生數據初始化、統計計算

擴展建議

  • 添加文件存取(fprintf/fscanf),實現數據持久化。
  • 實現動態增刪改查菜單,參考學生管理系統經典框架。
  • 引入 qsort 按平均分排名輸出。
  • 使用鏈表替代固定數組,支持不限量學生。
  • 增加輸入驗證(分數範圍 0-100、學號唯一性等)。

總結

本題核心是結構體數組建模實體數據、巢狀循環批量處理、分組統計計算。代碼結構清晰分離「數據輸入、業務計算、結果展示」三層,易於維護擴展。掌握此模式,可快速構建各類「分組統計」類控制台應用(如銷售報表、實驗數據分析、員工績效統計等)。

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