风在归途 2024-06-17 08:46 采纳率: 66.7%
浏览 12
已结题

#学生成绩管理系统(用c语言实现)#

学生成绩管理系统(用c语言实现)
1、问题描述设计一个简单的学生成绩管理系统,可录入、保存一个班级学生多门课程的成绩,并对成绩进行分析。2、基本要求(1)输入各学生多门课程的成绩,并存储;(2)按各门课程成绩排序,并生成相应的文件输出;(3)计算每人的平均成绩,按平均成绩排序,并生成文件;(4)求出各门课程的平均成绩、最高分、最低分、不及格人数、60-69 分人数,70-79 分人数、80-89 分人数、90 分以上人数;(5)根据姓名或学号查询某人的各门课成绩,重名情况也能处理
解题思路:1. 数据结构选择:可以使用二维数组存储学生成绩。2. 信息输入与存储:录入学生多门课程成绩,存储在二维数组中。3. 排序与文件输出:按课程成绩排序,生成文件;按平均成绩排序,生成文件。4. 统计分析:计算并输出各课程的平均成绩、最高分、最低分及各分数段人数。5. 查询功能:按姓名或学号查询学生成绩,需处理重名情况。

  • 写回答

4条回答 默认 最新

  • 小魏冬琅 2024-06-17 09:00
    关注

    这个代码应该能实现你的要求,就是不知道版本环境是否适配。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX_STUDENTS 100
    #define MAX_SUBJECTS 10
    #define NAME_LEN 50
    
    // 学生结构体
    typedef struct {
        char name[NAME_LEN];
        int student_id;
        float scores[MAX_SUBJECTS];
        float average;
    } Student;
    
    // 科目结构体
    typedef struct {
        char name[NAME_LEN];
        float scores[MAX_STUDENTS];
        float average;
        float max_score;
        float min_score;
        int count_60_69;
        int count_70_79;
        int count_80_89;
        int count_90_above;
        int fail_count;
    } Subject;
    
    // 全局变量存储学生和课程信息
    Student students[MAX_STUDENTS];
    Subject subjects[MAX_SUBJECTS];
    int student_count = 0;
    int subject_count = 0;
    
    // 录入课程信息
    void input_subjects() {
        printf("请输入课程数量: ");
        scanf("%d", &subject_count);
        for (int i = 0; i < subject_count; i++) {
            printf("请输入课程名称: ");
            scanf("%s", subjects[i].name);
            subjects[i].max_score = 0;
            subjects[i].min_score = 100;
            subjects[i].count_60_69 = 0;
            subjects[i].count_70_79 = 0;
            subjects[i].count_80_89 = 0;
            subjects[i].count_90_above = 0;
            subjects[i].fail_count = 0;
            subjects[i].average = 0.0;
        }
    }
    
    // 录入学生成绩信息
    void input_student_scores() {
        printf("请输入学生姓名: ");
        scanf("%s", students[student_count].name);
        printf("请输入学生学号: ");
        scanf("%d", &students[student_count].student_id);
        
        float total = 0.0;
        for (int j = 0; j < subject_count; j++) {
            printf("请输入%s成绩: ", subjects[j].name);
            scanf("%f", &students[student_count].scores[j]);
        
            // 更新学科成绩信息
            subjects[j].scores[student_count] = students[student_count].scores[j];
            
            // 更新课程平均分
            subjects[j].average += students[student_count].scores[j] / student_count;
    
            // 更新课程最高分、最低分
            if (students[student_count].scores[j] > subjects[j].max_score) {
                subjects[j].max_score = students[student_count].scores[j];
            }
    
            if (students[student_count].scores[j] < subjects[j].min_score) {
                subjects[j].min_score = students[student_count].scores[j];
            }
    
            // 统计各分数段人数
            if (students[student_count].scores[j] >= 90) {
                subjects[j].count_90_above++;
            } else if (students[student_count].scores[j] >= 80) {
                subjects[j].count_80_89++;
            } else if (students[student_count].scores[j] >= 70) {
                subjects[j].count_70_79++;
            } else if (students[student_count].scores[j] >= 60) {
                subjects[j].count_60_69++;
            } else {
                subjects[j].fail_count++;
            }
    
            // 更新学生成绩总分
            total += students[student_count].scores[j];
        }
    
        // 计算并存储学生平均分
        students[student_count].average = total / subject_count;
        student_count++;
    }
    
    // 按课程成绩排序
    void sort_by_subject(int subject_index) {
        for (int i = 0; i < student_count - 1; ++i) {
            for (int j = 0; j < student_count - 1 - i; ++j) {
                if (students[j].scores[subject_index] < students[j + 1].scores[subject_index]) {
                    Student temp = students[j];
                    students[j] = students[j + 1];
                    students[j + 1] = temp;
                }
            }
        }
    }
    
    // 按平均成绩排序
    void sort_by_average() {
        for (int i = 0; i < student_count - 1; ++i) {
            for (int j = 0; j < student_count - 1 - i; ++j) {
                if (students[j].average < students[j + 1].average) {
                    Student temp = students[j];
                    students[j] = students[j + 1];
                    students[j + 1] = temp;
                }
            }
        }
    }
    
    // 统计各科目的统计数据
    void calculate_statistics() {
        for (int i = 0; i < subject_count; ++i) {
            subjects[i].average = 0.0;
            for (int j = 0; j < student_count; ++j) {
                subjects[i].average += subjects[i].scores[j];
            }
            subjects[i].average /= student_count;
        }
    }
    
    // 导出成绩到文件
    void export_scores(const char *filename, int by_subject) {
        FILE *fp = fopen(filename, "w");
        if (fp == NULL) {
            printf("无法创建文件\n");
            return;
        }
    
        if (by_subject) {
            for (int i = 0; i < subject_count; ++i) {
                fprintf(fp, "课程:%s\n", subjects[i].name);
                for (int j = 0; j < student_count; ++j) {
                    fprintf(fp, "学生:%s,成绩:%.2f\n", students[j].name, students[j].scores[i]);
                }
                fprintf(fp, "\n");
            }
        } else {
            for (int i = 0; i < student_count; ++i) {
                fprintf(fp, "学生:%s,平均成绩:%.2f\n", students[i].name, students[i].average);
            }
        }
    
        fclose(fp);
    }
    
    // 查询某个学生的成绩
    void query_student() {
        char query[NAME_LEN];
        printf("请输入要查询的学生姓名或学号:");
        scanf("%s", query);
    
        for (int i = 0; i < student_count; ++i) {
            if (strcmp(students[i].name, query) == 0 || atoi(query) == students[i].student_id) {
                printf("学生:%s,学号:%d\n", students[i].name, students[i].student_id);
                for (int j = 0; j < subject_count; ++j) {
                    printf("%s:%.2f\n", subjects[j].name, students[i].scores[j]);
                }
                return;
            }
        }
    
        printf("未找到该学生\n");
    }
    
    int main() {
        int choice;
    
        // 录入课程信息
        input_subjects();
    
        // 主循环
        while (1) {
            printf("\n1. 录入学生成绩\n");
            printf("2. 按成绩排序并导出\n");
            printf("3. 按平均成绩排序并导出\n");
            printf("4. 统计各科目数据\n");
            printf("5. 查询学生成绩\n");
            printf("6. 退出\n");
    
            printf("请选择操作: ");
            scanf("%d", &choice);
    
            switch (choice) {
                case 1:
                    input_student_scores();
                    break;
                case 2:
                    for (int i = 0; i < subject_count; ++i) {
                        sort_by_subject(i);
                    }
                    export_scores("subject_scores.txt", 1);
                    break;
                case 3:
                    sort_by_average();
                    export_scores("average_scores.txt", 0);
                    break;
                case 4:
                    calculate_statistics();
                    for (int i = 0; i < subject_count; ++i) {
                        printf("\n课程:%s\n", subjects[i].name);
                        printf("平均成绩:%.2f\n", subjects[i].average);
                        printf("最高成绩:%.2f\n", subjects[i].max_score);
                        printf("最低成绩:%.2f\n", subjects[i].min_score);
                        printf("不及格人数:%d\n", subjects[i].fail_count);
                        printf("60-69分人数:%d\n", subjects[i].count_60_69);
                        printf("70-79分人数:%d\n", subjects[i].count_70_79);
                        printf("80-89分人数:%d\n", subjects[i].count_80_89);
                        printf("90分以上人数:%d\n", subjects[i].count_90_above);
                    }
                    break;
                case 5:
                    query_student();
                    break;
                case 6:
                    exit(0);
                    break;
                default:
                    printf("无效输入,请重试\n");
                    break;
            }
        }
    
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 6月25日
  • 已采纳回答 6月17日
  • 创建了问题 6月17日

悬赏问题

  • ¥15 plus模型贡献度为nan
  • ¥25 使用cube ai 导入onnx模型时报错
  • ¥15 关于#微信小程序#的问题:用一个网页显示所有关联的微信小程序数据,包括每个小程序的用户访问量
  • ¥15 root的安卓12系统上,如何使apk获得root或者高级别的系统权限?
  • ¥20 关于#matlab#的问题:如果用MATLAB函数delayseq可以对分数延时,但是延时后波形较原波形有幅度上的改变
  • ¥15 使用华为ENSP软件模拟实现该实验拓扑
  • ¥15 通过程序读取主板上报税口的数据
  • ¥15 matlab修改为并行
  • ¥15 尝试访问%1服务的windows注册表时遇到问题。必须先解决此问题,然后才能运行安装过程。(请确认您正在使用管理员权限运行)373
  • ¥15 (关键词-运算放大器)