科目成绩统计
本文最后更新于40 天前,其中的信息可能已经过时,如有错误请发送邮件到2428505532@qq.com
应用了qsort比较函数
#define _CRT_SECURE_NO_WARNINGS  
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 10000

struct Student {
    char name[20];
    int score;
};

// 比较函数:按成绩降序
int compare(const void* a, const void* b)
{
    const struct Student* s1 = (const struct Student*)a;
    const struct Student* s2 = (const struct Student*)b;

    // 分数高的排在前面
    if (s1->score < s2->score)
        return 1;
    else if (s1->score > s2->score)
        return -1;
    else
        return 0;
    
    // 其实更简单的写法是:return s2->score - s1->score;
}

int main()
{
    struct Student stu[MAX];
    int n;

    printf("输入该科目的学生数量:\n");  // 修正:/n 改为 \n
    scanf("%d", &n);

    // 防止输入人数为 0 或负数
    if (n <= 0 || n > MAX) {
        printf("人数输入错误!\n");
        return 1;
    }

    for (int i = 0; i < n; i++) {
        printf("输入第%d位学生的姓名与成绩:", i + 1); // 修正:&i + 1 改为 i + 1
        scanf("%s %d", stu[i].name, &stu[i].score);
    }

    // ===== 统计 =====
    int sum = 0;
    int max_score = stu[0].score;
    int min_score = stu[0].score;

    for (int i = 0; i < n; i++) {
        sum += stu[i].score;  
        if (stu[i].score > max_score)
            max_score = stu[i].score;
        if (stu[i].score < min_score)
            min_score = stu[i].score;
    }
    double avg = (double)sum / n;

    // ===== 排序(=====
    qsort(stu, n, sizeof(struct Student), compare);

    // ===== 输出 =====
    printf("\n==== 成绩统计 ====\n");
    printf("最高分:%d\n", max_score);
    printf("最低分:%d\n", min_score);
    printf("平均分:%.2f\n\n", avg);

    printf("排名\t姓名\t分数\n");
    for (int i = 0; i < n; i++) {
        printf("%d\t%s\t%d\n", i + 1, stu[i].name, stu[i].score);
    }

    return 0;
}
文末附加内容
上一篇