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

C 語言學生成績排序:輸入 n 筆資料,結構體陣列 + qsort 降序輸出

     編輯:程式設計綜合問答

需求:輸入 n 位學生的學號、姓名、3 門成績,按平均分從高到低輸出。

完整代碼(含動態記憶體、qsort、格式化輸出)

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

typedef struct {
    long id;
    char name[32];
    float scores[3];
    float avg;
} Student;

int cmp_desc(const void *a, const void *b) {
    const Student *s1 = (const Student *)a;
    const Student *s2 = (const Student *)b;
    return (s2->avg > s1->avg) - (s2->avg < s1->avg); // 降序
}

int main() {
    int n;
    printf("請輸入學生人數 n: ");
    if (scanf("%d", &n) != 1 || n <= 0) return 1;

    Student *stu = malloc(n * sizeof(Student));
    if (!stu) return 1;

    for (int i = 0; i < n; i++) {
        printf("第 %d 位: 學號 姓名 成績1 成績2 成績3\n", i + 1);
        scanf("%ld %31s %f %f %f", &stu[i].id, stu[i].name,
              &stu[i].scores[0], &stu[i].scores[1], &stu[i].scores[2]);
        stu[i].avg = (stu[i].scores[0] + stu[i].scores[1] + stu[i].scores[2]) / 3.0f;
    }

    qsort(stu, n, sizeof(Student), cmp_desc);

    printf("\n%-10s %-10s %6s %6s %6s %6s\n", "學號", "姓名", "成績1", "成績2", "成績3", "平均分");
    for (int i = 0; i < n; i++) {
        printf("%-10ld %-10s %6.1f %6.1f %6.1f %6.2f\n",
               stu[i].id, stu[i].name,
               stu[i].scores[0], stu[i].scores[1], stu[i].scores[2], stu[i].avg);
    }

    free(stu);
    return 0;
}

關鍵知識點

  • 結構體陣列動態分配:`malloc(n * sizeof(Student))`,用完 `free`。
  • qsort 比較函數:回傳負/0/正決定順序,浮點數比較避免直接相減溢位,用三元運算。
  • scanf 格式字串:`%31s` 防止姓名緩衝區溢位。
  • 平均分計算:浮點數除法 `/ 3.0f` 保證精度。

進階擴充

  • 同分按學號升序:比較函數加入 `if (avg 相等) return s1->id - s2->id;`。
  • 檔案輸入/輸出:`fscanf`/`fprintf` 對接 CSV。
  • 鏈結串列實現:動態增刪不需預知 n。

掌握「結構體 + qsort + 動態記憶體」是 C 語言處理結構化資料排序的標準範式。

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