学生成绩管理系统

按要求定义结构体数据类型,包括num(学号),name(姓名),score[5](5门课成绩),aver(5门课平均成绩),和sum(5门课总成绩),要求将下面功能都编写成独立的函数。

1.输入n个学生5门成绩的函数。

2.计算每个学生5门课程总成绩和平均成绩的函数。

3.计算n个学生中最高总分和最高平均分的函数。

4.输入一个学号,输出该学生的学号、姓名和总分的函数。

5.编写主函数集成上面4项功能。

6.程序能够进行异常处理,检查用户输入数据的有效性,在用户输入数据有错误(如类型错误)或无效时,不会中断程序的执行,程序具有一定的健壮性。

完整代码实现:

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

#define NUM 100

typedef struct Student {
    char id[10];    //学号
    char name[20];  //姓名
    int score[5];   //5门课程分数
    double sum;     //总成绩
} Student;
typedef struct Com {
    int count;
    Student student[NUM];
} Com;

void menu() {
    printf("~~~学生成绩管理系统~~~\n");
    printf("    1.添加学生信息\n");
    printf("    2.计算总成绩和平均分\n");
    printf("    3.显示最高总分和最高平均分\n");
    printf("    4.查找学生信息\n");
    printf("    0.退出\n");
}

//添加学生信息
void addStudent(Com *pCom) {
    //判断是否已满
    if (pCom->count == NUM) {
        printf("已满无法添加\n");
        //直接结束该函数
        return;
    }
    int num = 0;    //添加学生个数
    printf("请输入添加学生的个数->");
    scanf("%d", &num);
    //判断是否存得下
    if (pCom->count + num > NUM) {
        printf("添加学生个数较多,无法存下!\n");
        return;
    }
    //添加学生信息
    int i = 0;
    for (i = 0; i < num; i++) {
        //输入学号是可是适当发挥,对学号进行唯一性判断,此处省略
        printf("请输入第%d个学生的学号->", pCom->count + 1);
        scanf("%s", pCom->student[pCom->count].id);
        printf("请输入第%d个学生的姓名->", pCom->count + 1);
        scanf("%s", pCom->student[pCom->count].name);
        printf("请输入第%d个学生的5门课程分数->", pCom->count + 1);
        int sum = 0;
        int j = 0;
        for (j = 0; j < 5; j++) {
            scanf("%d", &(pCom->student[pCom->count].score[j]));
            sum += pCom->student[pCom->count].score[j];
        }
        pCom->student[pCom->count].sum = sum;
        pCom->count++;
    }
    printf("添加成功\n");
}

//初始化结构体
void initCom(Com *pCom) {
    pCom->count = 0;
}

//显示函数
//添加const防止误修改数据
void showStudent(const Com *pCom) {
    if (pCom->count == 0) {
        printf("列表为空");
        return;
    }
    int i = 0;
    printf("%11s %20s %3s %3s %3s %3s %3s %6s %4s\n",
           "学号", "姓名", "分数1", "分数2", "分数3", "分数4", "分数5", "总分", "平均分");
    for (i = 0; i < pCom->count; i++) {
        printf("%11s %20s %3d %3d %3d %3d %3d %4.2lf %2.2lf\n", pCom->student[i].id, pCom->student[i].name,
               pCom->student[i].score[0], pCom->student[i].score[1], pCom->student[i].score[2],
               pCom->student[i].score[3], pCom->student[i].score[4], pCom->student[i].sum, pCom->student[i].sum / 5);
    }
}

//显示最高分
void showHighScore(const Com *pCom) {
    if (pCom->count == 0) {
        printf("列表为空!\n");
        return;
    }
    int maxIndex = 0;//记录小标
    int i = 0;
    for (i = 1; i < pCom->count; i++) {
        if (pCom->student[maxIndex].sum < pCom->student[i].sum) {
            maxIndex = i;
        }
    }
    //显示最高分
    printf("~~~~最高总分和最高平均分~~~~\n");
    printf("%11s %20s %3s %3s %3s %3s %3s %6s %4s\n",
           "学号", "姓名", "分数1", "分数2", "分数3", "分数4", "分数5", "总分", "平均分");
    printf("%11s %20s %3d %3d %3d %3d %3d %4.2lf %2.2lf\n", pCom->student[maxIndex].id, pCom->student[maxIndex].name,
           pCom->student[maxIndex].score[0], pCom->student[maxIndex].score[1], pCom->student[maxIndex].score[2],
           pCom->student[maxIndex].score[3], pCom->student[maxIndex].score[4], pCom->student[maxIndex].sum,
           pCom->student[maxIndex].sum / 5);
}

int getIndex(const Com *pCom, char id[10]) {
    int i = 0;
    for (i = 0; i < pCom->count; i++) {
        if(strcmp(pCom->student[i].id,id)==0){
            return i;
        }
    }
    return -1;
}

//查找学生信息
void searchStudent(const Com *pCom) {
    //根据学号查找信息
    char id[10];
    printf("请输入要查找的学生的学号->");
    scanf("%s", id);
    //判断是否存在,如果存在获取下表
    int index = getIndex(pCom, id);
    if(index>=0){
        printf("~~~~最高总分和最高平均分~~~~\n");
        printf("%11s %20s %3s %3s %3s %3s %3s %6s %4s\n",
               "学号", "姓名", "分数1", "分数2", "分数3", "分数4", "分数5", "总分", "平均分");
        printf("%11s %20s %3d %3d %3d %3d %3d %4.2lf %2.2lf\n", pCom->student[index].id, pCom->student[index].name,
               pCom->student[index].score[0], pCom->student[index].score[1], pCom->student[index].score[2],
               pCom->student[index].score[3], pCom->student[index].score[4], pCom->student[index].sum,
               pCom->student[index].sum / 5);
    }else{
        printf("不存在");
    }
}

int main() {
    //定义结构体
    Com com;
    //初始化结构体
    initCom(&com);
    char choice[10];
    do {
        menu();
        //异常处理
        while (1) {
            //为了防止输入字符串获取掉多余的字符串
            printf("请选择->");
            scanf("%s", choice);
            if (strlen(choice) != 1) {
                printf("输入异常,请重新输入\n");
                continue;
            }
            break;
        }

        //选择语句
        switch (choice[0]) {
            case '1':
                addStudent(&com);
                break;
            case '2':
                showStudent(&com);
                break;
            case '3':
                showHighScore(&com);
                break;
            case '4':
                searchStudent(&com);
                break;
            case '0':
                printf("退出\n");
                break;
            default:
                printf("输入无效,请重新输入\n");
                break;
        }
    } while (choice[0] != '0');    //输入的不是0就不退出
    return 0;
}

tips:

1.在学习编程的路上有什么问题,欢迎留言讨论或私信我呦。

2.祝您学习愉快,如果有什么问题乐意和您探讨。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

晨露02

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

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

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

打赏作者

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

抵扣说明:

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

余额充值