C语言班级考试成绩数据管理系统

班级考试成绩据管系统(1:中 学个班级 A个学生,每个学生每学期有 B 门课,共C个学期。高中B 门课的学分,语数外为 1.5,物化生为 1。大学 B 门课的学分依次为1至BA的范围:41-45 (41为A1,42为A243为A3,44为A445为A5)B的范围:5-6(5为B1.6为B2)
C的范围:4-8(4为C1.5为C2.6为C3.7为C4.8为C5)
请自行编制“某班成绩数据库.txt”文件,内含各门课原始成绩,并完成以下程序要求。程序功能要求:
a 可从自行编制的“某班成绩数据库.txt”文件中读取学生的全部成绩数据。b 可计算出每个学生的加权平均成绩,然后由高到底排序输出全班总成绩表(内含全班同学各科成绩及加权平均成绩)
c 可计算出各科平均成绩,然后按科目难度排序输出。
d 可计算出某门课的各分数段成绩分布,例如 90-100 分,8 人。依次类推。
e 可查询、修改某人某学期某课的成绩。
f 可查询并输出某学生的全部成绩。
g可查询并输出某学生不及格科目名称
h 可查询并输出某门课不及格学生名单。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 学生结构体,包括学号、姓名、成绩和加权平均分
typedef struct
{
    char student_id[20];
    char name[100];
    float scores[6][3];
    float weightedAverage;
} Student;
// 科目平均成绩结构体
typedef struct
{
    char name[100];
    float average;
} Avg;

Student students[43];
int studentNum = 0;

// 计算学生的加权平均成绩,考虑不同课程的 double 类型权重
void cal(Student *student)
{
    double Sum = 0.0;
    double total = 0.0;
    int i, j;
    double creditWeight;
    for (i = 0; i < 6; i++)
    {
        for (j = 0; j < 3; j++)
        {
            creditWeight = 1.0; // 默认为1.0,即每门课程的学分权重为1.0
            if (i < 3)
            {
                creditWeight = 1.5; // 前三门课程每学期1.5学分
            }

            Sum += student->scores[i][j] * creditWeight;
            total += creditWeight;
        }
    }

    student->weightedAverage = Sum / total;
}
void sort(Student students[])
{
    int i, j;
    Student temp;

    for (i = 0; i < studentNum - 1; i++)
    {
        for (j = 0; j < studentNum - i - 1; j++)
        {
            if (students[j].weightedAverage < students[j + 1].weightedAverage)
            {
                // 交换学生数据
                temp = students[j];
                students[j] = students[j + 1];
                students[j + 1] = temp;
            }
        }
    }
}

void display(Student students[])
{
    int i;
    int semester, course;
    printf("按加权平均成绩排序的学生列表:\n");
    printf("学号\t\t姓名\t\t加权平均成绩\n");

    sort(students);

    for (i = 0; i < studentNum; i++)
    {
        printf("%s\t\t%s\t\t%.2f\n", students[i].student_id, students[i].name, students[i].weightedAverage);
        printf("学期\t语文\t数学\t英语\t物理\t化学\t生物\n");
        for (semester = 0; semester < 3; semester++)
        {
            printf("%d\t", semester + 1);
            for (course = 0; course < 6; course++)
            {
                printf("%.2f\t", students[i].scores[course][semester]);
            }
            printf("\n");
        }
        printf("\n");
    }
}

// 从文件中读取学生数据并初始化数组
void read(Student students[])
{
    FILE *fp = fopen("修改后的数据.txt", "r");
    int semester, course;

    if (fp == NULL)
    {
        printf("无法打开文件。\n");
        return;
    }
    while (!feof(fp))
    {
        if (fscanf(fp, "%s %s", students[studentNum].student_id, students[studentNum].name) != 2)
        {

            break;
        }
        // 读取18个成绩数据,依次存储到成绩数组中
        for (course = 0; course < 6; course++)
        {
            for (semester = 0; semester < 3; semester++)
            {
                if (fscanf(fp, "%f", &students[studentNum].scores[course][semester]) != 1)
                {
                    // 读取成绩失败,可能到达文件末尾或文件格式不匹配
                    break;
                }
            }
        }

        // 计算学生的加权平均成绩
        cal(&students[studentNum]);

        studentNum++;
    }
    fclose(fp);
}
// 计算各科平均成绩并按科目难度排序后输出
// 计算各门科目的平均成绩并排序
void calculateAndSortSubjectAverages(Student students[])
{
    Avg subjectAverages[6];

    // 初始化科目名称
    strcpy(subjectAverages[0].name, "语文");
    strcpy(subjectAverages[1].name, "数学");
    strcpy(subjectAverages[2].name, "英语");
    strcpy(subjectAverages[3].name, "物理");
    strcpy(subjectAverages[4].name, "化学");
    strcpy(subjectAverages[5].name, "生物");

    // 计算每门课程的平均成绩
    for (int course = 0; course < 6; course++)
    {
        float courseTotal = 0.0;

        for (int i = 0; i < studentNum; i++)
        {
            for (int semester = 0; semester < 3; semester++)
            {
                courseTotal += students[i].scores[course][semester];
            }
        }

        subjectAverages[course].average = courseTotal / (studentNum * 3);
    }

    // 使用冒泡排序按平均成绩排序
    for (int i = 0; i < 6 - 1; i++)
    {
        for (int j = 0; j < 6 - i - 1; j++)
        {
            if (subjectAverages[j].average > subjectAverages[j + 1].average)
            {
                // 交换科目平均成绩
                Avg temp = subjectAverages[j];
                subjectAverages[j] = subjectAverages[j + 1];
                subjectAverages[j + 1] = temp;
            }
        }
    }

    // 输出排序后的科目平均成绩
    printf("按平均成绩排序的科目平均成绩:\n");
    for (int course = 0; course < 6; course++)
    {
        printf("%s 平均成绩:%.2f\n", subjectAverages[course].name, subjectAverages[course].average);
    }
}
const char *getCourseName(int courseIndex)
{
    switch (courseIndex)
    {
    case 0:
        return "语文";
    case 1:
        return "数学";
    case 2:
        return "英语";
    case 3:
        return "物理";
    case 4:
        return "化学";
    case 5:
        return "生物";
    default:
        return "未知科目";
    }
}
void tongji(Student students[], int courseIndex, int sID)
{
    int numStudents = studentNum;
    int numRanges = 5; // 分数段的数量
    int fenshuduan[5];
    int i, score;
    // 初始化分数段人数统计数组
    for (i = 0; i < numRanges; i++)
    {
        fenshuduan[i] = 0;
    }

    // 统计各分数段人数
    for (i = 0; i < numStudents; i++)
    {
        score = students[i].scores[courseIndex][sID];

        if (score >= 90)
        {
            fenshuduan[0]++;
        }
        else if (score >= 80)
        {
            fenshuduan[1]++;
        }
        else if (score >= 70)
        {
            fenshuduan[2]++;
        }
        else if (score >= 60)
        {
            fenshuduan[3]++;
        }
        else
        {
            fenshuduan[4]++;
        }
    }

    // 输出分数段成绩分布
    printf("课程 %d:%s学期 %d 的成绩分布:\n", courseIndex + 1, getCourseName(courseIndex), sID + 1);
    printf("90-100 分:%d 人\n", fenshuduan[0]);
    printf("80-89 分:%d 人\n", fenshuduan[1]);
    printf("70-79 分:%d 人\n", fenshuduan[2]);
    printf("60-69 分:%d 人\n", fenshuduan[3]);
    printf("0-59 分:%d 人\n", fenshuduan[4]);
}

// 查询和修改学生成绩
void update(Student students[])
{
    char studentID[10];
    int sID;
    int courseIndex;
    float score;
    int studentIndex = -1;
    char choice;
    float newScore;
    int i;
    printf("请输入要查询/修改的学生学号:");
    scanf("%s", studentID);

    // 查找匹配学号的学生
    for (i = 0; i < studentNum; i++)
    {
        if (strcmp(students[i].student_id, studentID) == 0)
        {
            studentIndex = i;
            break;
        }
    }

    if (studentIndex != -1)
    {
        printf("请输入要查询/修改的学期索引(0-%d):", 3 - 1);
        scanf("%d", &sID);

        printf("请输入要查询/修改的课程索引(0-%d):", 6 - 1);
        scanf("%d", &courseIndex);

        if (sID >= 0 && sID < 3 && courseIndex >= 0 && courseIndex < 6)
        {
            // 查询成绩
            score = students[studentIndex].scores[courseIndex][sID];
            printf("学生 %s 第 %d 学期第 %d 门课成绩为:%.2f\n", students[studentIndex].name, sID + 1, courseIndex + 1, score);

            // 询问用户是否要修改成绩
            printf("是否要修改成绩(Y/N):");
            scanf(" %c", &choice);

            if (choice == 'Y' || choice == 'y')
            {

                printf("请输入新的成绩:");
                scanf("%f", &newScore);
                students[studentIndex].scores[courseIndex][sID] = newScore;
                printf("成绩已修改为 %.2f\n", newScore);
            }
            else
            {
                printf("未修改成绩。\n");
            }
        }
        else
        {
            printf("无效的学期或课程索引。\n");
        }
    }
    else
    {
        printf("未找到匹配学号的学生。\n");
    }
}

// 查询并显示某学生的全部成绩(根据姓名)
void search2(Student students[])
{
    char searchName[100];
    int found = 0;
    int i;
    int semester, course;
    printf("请输入要查询的学生姓名:");
    scanf("%s", searchName);

    for (i = 0; i < studentNum; i++)
    {
        if (strcmp(students[i].name, searchName) == 0)
        {
            found = 1;
            printf("学生 %s(学号:%s)的全部成绩:\n", students[i].name, students[i].student_id);

            for (semester = 0; semester < 3; semester++)
            {
                printf("第 %d 学期成绩:\n", semester + 1);
                printf("课程\t成绩\n");
                for (course = 0; course < 6; course++)
                {
                    printf("%s\t%.2f\n", getCourseName(course), students[i].scores[course][semester]);
                }
                printf("\n");
            }
        }
    }

    if (!found)
    {
        printf("未找到姓名为 %s 的学生。\n", searchName);
    }
}

void search1(Student students[])
{
    char ID[100];
    int found = 0;
    int i;
    int semester, course;
    float score;
    printf("请输入要查询的学生学号:");
    scanf("%s", ID);

    for (i = 0; i < studentNum; i++)
    {
        if (strcmp(students[i].student_id, ID) == 0)
        {
            found = 1;
            printf("学生 %s(学号:%s)的不及格科目:\n", students[i].name, students[i].student_id);

            for (semester = 0; semester < 3; semester++)
            {
                for (course = 0; course < 6; course++)
                {
                    score = students[i].scores[course][semester];
                    if (score < 60.0) // 假设及格分数为60
                    {
                        printf("第 %d 学期,课程 %d 不及格(成绩:%.2f)\n", semester + 1, course + 1, score);
                    }
                }
            }
        }
    }

    if (!found)
    {
        printf("未找到学号为 %s 的学生。\n", ID);
    }
}
// 查询并按学期显示某门课不及格的学生名单
void search3(Student students[])
{
    int courseIndex, sID;
    int found = 0; // 用于标记是否找到不及格学生
    int i, j;
    float score;
    printf("请输入要查询的科目索引(0-4)和学期索引(1-3):");
    scanf("%d %d", &courseIndex, &sID);

    if (courseIndex < 0 || courseIndex >= 5 || sID < 1 || sID > 3)
    {
        printf("无效的科目或学期索引。\n");
        return;
    }

    printf("第 %d 学期,课程 %d(%s)不及格的学生名单:\n", sID, courseIndex, getCourseName(courseIndex));

    printf("| %-15s | %-12s | %-6s |\n", "学生姓名", "学号", "成绩");
    printf("|---------------|--------------|--------|\n");

    for (i = 0; i < studentNum; i++)
    {
        score = students[i].scores[courseIndex][sID - 1]; // 注意学期索引需要减1
        if (score < 60.0)                                 // 假设及格分数为60
        {
            found = 1;
            printf("| %-15s | %-12s | %-6.2f |\n", students[i].name, students[i].student_id, score);
        }
    }

    if (!found)
    {
        printf("该门课程在指定学期没有不及格学生。\n");
    }
}

int main()
{
    read(students);
    int course;
    int sID;
    int choice;
    while (1)
    {
        system("cls");
        printf("╭──────────────────────────────╮\n");
        printf("│                              │\n");
        printf("│        学生菜单            │\n");
        printf("│                              │\n");
        printf("│   1. 计算并排序每个学生的   │\n");
        printf("│      加权平均成绩          │\n");
        printf("│                              │\n");
        printf("│   2. 计算并排序各科平均成绩 │\n");
        printf("│                              │\n");
        printf("│   3. 计算并显示某门课的     │\n");
        printf("│      分数段分布              │\n");
        printf("│                              │\n");
        printf("│   4. 查询和修改学生成绩     │\n");
        printf("│                              │\n");
        printf("│   5. 查询并显示某学生的     │\n");
        printf("│      全部成绩              │\n");
        printf("│                              │\n");
        printf("│   6. 查询并显示某学生不及格 │\n");
        printf("│      科目                    │\n");
        printf("│                              │\n");
        printf("│   7. 查询并显示某门课不及格 │\n");
        printf("│      学生名单                │\n");
        printf("│                              │\n");
        printf("│   8. 退出                   │\n");
        printf("│                              │\n");
        printf("╰──────────────────────────────╯\n");
        printf("请选择操作:");

        scanf("%d", &choice);

        switch (choice)
        {
        case 1:
            cal(students);
            display(students);
            break;
        case 2:
            calculateAndSortSubjectAverages(students);
            break;
        case 3:
            printf("请输入您要查找的科目: 0.语文 1.数学 2.英语 3.物理 4.化学 5.生物");
            scanf("%d", &course);
            printf("请输入您要查找的学期:");
            scanf("%d", &sID);
            tongji(students, course, sID);
            break;
        case 4:
            update(students);
            break;
        case 5:
            search2(students);
            break;
        case 6:
            search1(students);
            break;
        case 7:
            search3(students);
            break;
        case 8:
            printf("谢谢使用,再见!\n");
            return 0;
        default:
            printf("无效选项,请重新选择。\n");
        }
        system("pause");
    }

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_45230280

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值