c语言课程设计-学生成绩管理系统

查成绩时不能按成绩查询,

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
struct gread
{
    int English; //鑻辫??鎴愮哗
    int c;       //c璇?瑷€鎴愮哗
    int math;    //鏁板?︽垚缁?
    int score;   //瀛︽湡鎬诲垎
};
struct student
{
    int id;
    char name[10];
    char class[20];
    int semter;
    struct gread stugread;
};
struct manament
{
    struct student me[MAX];
    int size;
};
void initstu(struct manament *m);
void save(struct manament *m);
void findclassstu(struct manament *m, char class[20]);
void findscoreorder(struct manament *m, char class[20], char course[20]);
void findscoreEorder(struct manament *m, char class[20]);
void findscoreSorder(struct manament *m, char class[20]);
void findscoreMorder(struct manament *m, char class[20]);
void findscoreCorder(struct manament *m, char class[20]);
int ishaved(struct manament *m, int id);
void findstu(struct manament *m, int id);
void addstu(struct manament *m);
int updatestu(struct manament *m, int id);
int deletestu(struct manament *m, int id);
void findallstu(struct manament *m);
void savestu(struct manament *m);
void readstu(struct manament *m);
void menu1() //主界面,负责人:王豪杰
{
    int id = 0;
    struct manament stu;
    initstu(&stu);
    readstu(&stu);
    int flag = 1;
    while (flag) //死循环确保系统一直运行,当退出系统时flag=0,跳出循环
    {
        printf("\t\t\t\t学生成绩管理系统\n");
        printf("\t----------------------------------------------------------------\n");
        printf(" \t| 0:退出系统\t\t\t");
        printf("| 1:添加学生成绩\n");
        printf("\t----------------------------------------------------------------\n");
        printf("  \t| 2:修改学生成绩\t\t");
        printf("| 3:查找学生成绩\n");
        printf("\t----------------------------------------------------------------\n");
        printf(" \t| 4:查看所有学生成绩\t\t");
        printf("| 5:删除学生成绩\n");
        printf("\t----------------------------------------------------------------\n");
        printf("  \t| 6:按班级查找学生成绩\t");
        printf("  \t| 7:降序输出某班某课程的成绩。\n");
        printf("\t----------------------------------------------------------------\n");
        printf("\n请选择操作数来完成你的操作:");
        int a;
        scanf("%d", &a);
        switch (a)
        {
        case 1:
            system("CLS"); //system函数清空屏幕,
            addstu(&stu);
            break;
        case 2:
            /* code */
            system("CLS");    //system函数清空屏幕,
            findallstu(&stu); //显示所有学生函数,之说以在这里显示所有学生是为了修改方便,防止记错id;
            printf("请输入所要修改成绩的学生id: (-1返回上一级)\n");
            scanf("%d", &id);
            if (id >= 0)
            {
                updatestu(&stu, id); //修改成绩函数
            }
            id = 0;

            break;
        case 3:
            system("CLS"); //system函数清空屏幕,
            printf("请输入所要查找的学生id: (-1返回上一级)\n");
            scanf("%d", &id);
            if (id >= 0)
            {
                findstu(&stu, id); //调用findstu()函数,显示指定id的学生信息
            }
            id = 0;
            break;
        case 4:
            system("CLS"); //system函数清空屏幕,
            printf("查看所有学生成绩:\n");
            findallstu(&stu); //显示所有学生的信息
            break;
        case 5:
            system("CLS");    //system函数清空屏幕,
            findallstu(&stu); //显示所有学生函数,之说以在这里显示所有学生是为了删除方便,防止记错id;
            printf("请输入所要删除的学生id: (-1返回上一级)\n");
            scanf("%d", &id); //输入id
            if (id >= 0)
            {
                int shanchu = deletestu(&stu, id);
                if (shanchu == 1)
                {
                    printf("删除成功\n");
                }
                else if (shanchu == 0)
                {
                    // system("CLS"); //system函数清空屏幕,

                    printf("查无此人\n");
                }
                else
                {
                    printf("退出,不进行删除\n");
                }
            }
            id = 0;
            /* code */
            break;
        case 6:
            system("CLS"); //system函数清空屏幕,
            printf("请输入班级:\n");
            char cla[20];
            scanf("%s", cla);
            findscoreSorder(&stu, cla);
            break;
        case 0:
            system("CLS"); //system函数清空屏幕,
            printf("谢谢使用,欢迎下次光临:");
            flag = 0; //flag=0,不满足循环条件,跳出大循环,
            break;
        case 7:
            system("CLS"); //system函数清空屏幕,
            printf("降序输出某班某课程的成绩。\n");
            printf("请输入班级\n");
            char clas[20];
            scanf("%s", clas);
            printf("请输入需要排序的课程名称,也可按输入“总分”,按总分排序,输入课程名的可以为中文全称、英文全称或者英文的首字母(大小写都可以)\n");
            char co[20];
            scanf("%s", co);
            findscoreorder(&stu, clas, co);
            break;
        default:
            system("CLS"); //system函数清空屏幕,
            printf("输入错误,请重新输入!\n");
            break;
        }
    }
}
int main()
{
    // void addstu(&stu);
    // initstu(&stu);
    menu1();
    system("pause"); //vscode防止输出窗口一闪而过,
    return 0;
}
void initstu(struct manament *m) //初始化数组函数,完成人:王豪杰
{                                //初始化
    if (m->size == MAX)
    {
        return;
    }
    else
    {
        memset(m->me, 0, sizeof(m->me)); //使用string.h中的mamect()函数将结构数组的所有初始化为0
    }
    m->size = 0; //size初始化为0
}
void addstu(struct manament *m) //添加函数,完成人:侯航宇
{
    printf("添加学生成绩:\n");
    printf("请输入学生学号:\n");
    int id, tu;
    while (scanf("%d", &id))
    {
        if (ishaved(m, id)) //判断,id是否已存在,存在返回1,不存在返回0
        {
            printf("学号已存在,请选择,1、重新输入,0、退出输入\n");
            scanf("%d", &tu);
            if (tu) //判断tu,tu=1继续输入,否则退出该函数
            {
                printf("请输入学生学号:\n");
                continue;
            }
            else
            {
                printf("退出添加函数\n");
                return;
            }
        }
        break;
    }

    // do
    // {
    //     scanf("%d", &id);
    // } while (ishaved(m, id));
    m->me[m->size].id = id; //m是传入的结构指针,m->me[m->size]是manament结构中定义的student结构数组,m->size是当前系统中保存的学生信息的数目 ,m->me[m->size].id是manament结构中定义的student结构数组中定义的id
    printf("请输入学生姓名\n");
    scanf("%s", m->me[m->size].name); // //m是传入的结构指针,m->me[m->size]是manament结构中定义的student结构数组,m->size是当前系统中保存的学生信息的数目 ,m->me[m->size].name是manament结构中定义的student结构数组中定义的name
    printf("请输入学生的班级:\n");
    scanf("%s", (m->me[m->size].class)); //m是传入的结构指针,m->me[m->size]是manament结构中定义的student结构数组,m->size是当前系统中保存的学生信息的数目 ,m->me[m->size].class是manament结构中定义的student结构数组中定义的class
    printf("请输入考试学期:\n");
    int se;                                     //学期
    while (scanf("%d", &se), se > 2 || se <= 0) //判断输入的数是否符合常规
    {
        printf("输入错误!请重新输入\n");
    }
    m->me[m->size].semter = se; //m是传入的结构指针,m->me[m->size]是manament结构中定义的student结构数组,m->size是当前系统中保存的学生信息的数目 ,m->me[m->size].semter是manament结构中定义的student结构数组中定义的学期
    printf("请输入学生的英语成绩:\n");
    int en;                                      //英语分数
    while (scanf("%d", &en), en > 100 || en < 0) //判断英语成绩输入是否在范围内
    {
        printf("英语满分只有100!,最低0分!,请重新输入\n");
    }
    m->me[m->size].stugread.English = en; //m是传入的结构指针,m->me[m->size]是manament结构中定义的student结构数组,m->size是当前系统中保存的学生信息的数目 ,m->me[m->size].stugread.c是manament结构中定义的student结构数组中定义的gread结构中的英语成绩
    printf("请输入学生的数学成绩:\n");
    int mt;                                      //数学分数
    while (scanf("%d", &mt), mt > 100 || mt < 0) //判断数学成绩输入是否在范围内
    {
        printf("数学满分只有100!,最低0分请重新输入\n");
    }
    m->me[m->size].stugread.math = mt; //m是传入的结构指针,m->me[m->size]是manament结构中定义的student结构数组,m->size是当前系统中保存的学生信息的数目 ,m->me[m->size].stugread.math是manament结构中定义的student结构数组中定义的gread结构中的数学成绩
    printf("请输入学生的C语言成绩:\n");
    int c;
    while (scanf("%d", &c), c > 100 || c < 0) //判断c语言成绩输入是否在范围内
    {
        printf("C语言满分只有100!,最低0分请重新输入\n");
    }
    m->me[m->size].stugread.c = c;               //m是传入的结构指针,m->me[m->size]是manament结构中定义的student结构数组,m->size是当前系统中保存的学生信息的数目 ,m->me[m->size].stugread.c是manament结构中定义的student结构数组中定义的gread结构中的c语言成绩
    m->me[m->size].stugread.score = c + mt + en; //总成绩
    // m->me[m->size].stugread.score = m->me[m->size].stugread.c + m->me[m->size].stugread.math + m->me[m->size].stugread.English; //计算总分
    savestu(m); //调用保存函数
    m->size++;  //添加后,size加一
    // system("CLS"); //system函数清空屏幕, //清空输出
    printf("添加成功\n");
}
int updatestu(struct manament *m, int id) //更新成绩函数,完成人:李函磊
{
    int j = -1;
    for (int i = 0; i < m->size; i++)
    {
        if (m->me[i].id == id)
        {
            j = i; //找到对应id在数组的位置,用j记录,
            break;
        }
    }
    if (j == -1)
    {
        printf("查无此人\n");
        return 0;
    }
    findstu(m, id); //调用find()函数,m是传入的显示要更改的学生的信息,容易操作,
    printf("输入新的英语成绩,如不更改,请输入-1:\n");
    int Eng;
    while (scanf("%d", &Eng), Eng > 100) //判断更改的英语成绩是否超出范围,若失误将成绩输为负数,系统将不做更改
    {
        printf("英语成绩满分100,请检查后再次输入,如不更改,请输入-1:\n");
    }
    if (Eng >= 0)
    {
        m->me[j].stugread.English = Eng; //m是传入的结构指针,m->me[m->size]是manament结构中定义的student结构数组,m->size是当前系统中保存的学生信息的数目 ,m->me[m->size].English是manament结构中定义的student结构数组中定义的英语成绩
    }
    printf("输入新的数学成绩,如不更改,请输入-1:\n");
    int M;
    while (scanf("%d", &M), M > 100) //判断更改的成绩是否超出范围,若失误将成绩输为负数,系统将不做更改
    {
        printf("数学成绩满分100,请检查后再次输入,如不更改,请输入-1:\n");
    }
    if (M >= 0)
    {
        m->me[j].stugread.math = M; //m是传入的结构指针,m->me[m->size]是manament结构中定义的student结构数组,m->size是当前系统中保存的学生信息的数目 ,m->me[m->size].math是manament结构中定义的student结构数组中定义的数学成绩
    }
    printf("输入新的C语言成绩,如不更改,请输入-1:\n");
    int C;
    while (scanf("%d", &C), C > 100)
    //判断更改的成绩是否超出范围,若失误将成绩输为负数,系统将不做更改
    {
        printf("C语言成绩满分100,,请检查后再次输入,如不更改,请输入-1:\n");
    }
    if (C >= 0)
    {
        m->me[j].stugread.c = C; //m是传入的结构指针,m->me[m->size]是manament结构中定义的student结构数组,m->size是当前系统中保存的学生信息的数目 ,m->me[m->size].c是manament结构中定义的student结构数组中定义的c语言成绩
    }
    m->me[j].stugread.score = m->me[j].stugread.c + m->me[j].stugread.math + m->me[j].stugread.English; //计算总分
    printf("更改成功!\n");
    save(m); //保存删除后的数组
}
int deletestu(struct manament *m, int id) //根据id删除学生信息,完成人:郭鑫宇
{
    int j = -1;
    for (int i = 0; i < m->size; i++)
    {
        if (m->me[i].id == id) //循环,遍历数组,查找是否有这个id
        {
            j = i; //找到对应id在数组的位置,用j记录,
            break; //找到这个id后跳出循环
        }
    }
    if (j == -1)
    {
        return 0;
    }
    printf("要删除的学生信息如下:\n");
    findstu(m, id); //显示要删除的学生信息,防止误删,错删
    printf("确认要删除的信息,确认无误后输入1,删除这个信息..若不想删除,输入0,返回上一层,不进行删除\n");
    int fl;
    scanf("%d", &fl); //
    if (fl)
    {
        if (j != -1) //判断是否找到了对应id
        {
            for (j; j < m->size; j++)
            {
                m->me[j] = m->me[j + 1];
                //将所要删除的id后面的数据迁移一位,达到删除的目的
                //m是传入的结构指针,m->me[m->size]是manament结构中定义的student结构数组,m->size是当前系统中保存的学生信息的数目 ,通过数据向前移位来删除指定id处的数据
            }
            m->size--; //删除了一个学生的信息,学生数减少1位,size-1
            save(m);   //保存删除后的数组
            return 1;  //删除成功返回1
        }
        return 0; //删除失败返回0
    }
    return -1; //不进行删除返回-1
}
void findstu(struct manament *m, int id) //完成人:董辰宇
{
    int j = -1;
    for (int i = 0; i < m->size; i++) //循环,遍历数组,查找是否有这个id
    {
        if (m->me[i].id == id)
        {
            j = i; //找到对应id在数组的位置,用j记录,
            break; //找到这个id后跳出循环
        }
    }
    if (j != -1) //判断是否找到了对应id
    {
        printf("学号:%-4d 姓名:%-4s 班级:%-3s 学期:%-3d 英语:%-3d 数学:%-3d C语言:%-3d 总分:%-3d\n ", m->me[j].id, m->me[j].name, m->me[j].class, m->me[j].semter, m->me[j].stugread.English, m->me[j].stugread.math, m->me[j].stugread.c, m->me[j].stugread.score); //输出对应id的学生信息
    }
    else
    {
        printf("查无此人\n"); //j=-1说明没说找到id所对应的人,
    }
}
void findallstu(struct manament *m) //显示所有的学生信息,完成人:董辰宇
{
    printf("学 号\t姓名\t   班   级\t学期\t英语\t数学\tC语言\t总分\n"); //打印表头

    for (int j = 0; j < m->size; j++) //循环结构体,输出
    {
        printf("%d\t%s\t %s\t %d\t%d\t%d\t%d\t%d\n", m->me[j].id, m->me[j].name, m->me[j].class, m->me[j].semter, m->me[j].stugread.English, m->me[j].stugread.math, m->me[j].stugread.c, m->me[j].stugread.score);
    }
}
void findclassstu(struct manament *m, char class[20])
{
    printf("学 号\t姓名\t   班   级\t学期\t英语\t数学\tC语言\t总分\t排名\n"); //打印表头
    int ii = 0;
    for (int j = 0; j < m->size; j++)
    {
        int a;
        a = strcmp(m->me[j].class, class);
        if (a == 0)
        {
            ii++;
            printf("%d\t%s\t %s \t%d\t%d\t%d\t%d\t%d\t%d\n", m->me[j].id, m->me[j].name, m->me[j].class, m->me[j].semter, m->me[j].stugread.English, m->me[j].stugread.math, m->me[j].stugread.c, m->me[j].stugread.score, ii);
        }
    }
}
void savestu(struct manament *m) //完成人:王豪杰
{
    FILE *fp;         //创建文件指针
    if (m->size == 0) //判断是否已经有数据,有数据进行追加写入,无数据直接写入
    {
        if ((fp = fopen("managent1.txt", "w")) == NULL) //判断文件是否打开失败
        {
            printf("文件打开失败"); //文件打开失败提示
            exit(0);                //退出系统
        }
    }
    else
    {
        if ((fp = fopen("managent1.txt", "a")) == NULL) //判断函数是否打开失败
        {
            printf("文件打开失败"); //文件打开失败提示
            exit(0);                //退出系统
        }
    }
    fprintf(fp, "%d %s %s %d %d %d %d %d\n", m->me[m->size].id, m->me[m->size].name, m->me[m->size].class, m->me[m->size].semter, m->me[m->size].stugread.English, m->me[m->size].stugread.math, m->me[m->size].stugread.c, m->me[m->size].stugread.score); //fprint()函数将数据写入文件
    if (fclose(fp))                                                                                                                                                                                                                                         //文件关闭
    {
        printf("文件关闭失败,"); //文件打开失败提示
        exit(0);                  //退出系统
    }
}
void save(struct manament *m) //完成人:王豪杰
{
    FILE *fp;                                       //文件指针
    if ((fp = fopen("managent1.txt", "w")) == NULL) //判断是否打开文件
    {
        printf("文件打开失败"); //文件打开失败提示
        exit(0);                //退出系统
    }
    for (int a = 0; a < m->size; a++) //把结构数组重新保存一遍
    {
        fprintf(fp, "%d %s %s %d %d %d %d %d\n", m->me[a].id, m->me[a].name, m->me[a].class, m->me[a].semter, m->me[a].stugread.English, m->me[a].stugread.math, m->me[a].stugread.c, m->me[a].stugread.score);
        //fprintf()函数格式化写进文件
    }

    if (fclose(fp)) //判断文件是否关闭
    {
        printf("文件关闭失败,"); //文件关闭失败提示
        exit(0);                  //退出系统
    }
}
void readstu(struct manament *m) //初始化读取文件,初始化数组,负责人:王豪杰
{
    FILE *fp;                                       //定义稳健指针
    if ((fp = fopen("managent1.txt", "r")) == NULL) //判断是否打开
    {
        FILE *fp1;                                       //文件指针
        if ((fp1 = fopen("managent1.txt", "w")) == NULL) //判断是否打开文件
        {
            printf("文件打开失败"); //文件打开失败提示
            exit(0);                //退出系统
        }
        fclose(fp1);
        //退出系统
        fp = fopen("managent1.txt", "r");
    }
    while (fscanf(fp, "%d %s %s %d %d %d %d %d", &(m->me[m->size].id), m->me[m->size].name, &(m->me[m->size].class), &(m->me[m->size].semter), &(m->me[m->size].stugread.English), &(m->me[m->size].stugread.math), &(m->me[m->size].stugread.c), &(m->me[m->size].stugread.score)) > 0)
    //判断是否读到最后一位,每读一位保存在结构数组一位
    {
        m->size++;
    }

    if (fclose(fp)) //判断文件是否关闭
    {
        printf("文件关闭失败,"); //文件打开失败提示
        exit(0);                  //退出系统
    }
}
int ishaved(struct manament *m, int id) //判断id是否已经存在,存在返回1,不存在返回0,负责人:王豪杰
{
    int j = -1;
    for (int i = 0; i < m->size; i++) //循环,遍历数组,查找是否有这个id
    {
        if (m->me[i].id == id)
        {
            j = i; //找到对应id在数组的位置,用j记录,
            break; //找到这个id后跳出循环
        }
    }
    if (j == -1)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}
void findscoreorder(struct manament *m, char class[20], char course[20])
{
    int flag = 0;
    if (strcmp(course, "English") == 0 || strcmp(course, "english") == 0 || strcmp(course, "英语") == 0 || strcmp(course, "外") == 0 || strcmp(course, "E") == 0 || strcmp(course, "e") == 0)
    {
        flag = 1;
    }
    else if (strcmp(course, "Math") == 0 || strcmp(course, "math") == 0 || strcmp(course, "数学") == 0 || strcmp(course, "M") == 0 || strcmp(course, "m") == 0)
    {
        flag = 2;
    }
    else if (strcmp(course, "C语言") == 0 || strcmp(course, "C") == 0 || strcmp(course, "c") == 0)
    {
        flag = 3;
    }
    else if (strcmp(course, "总分") == 0)
    {
        flag = 4;
    }
    switch (flag)
    {
    case 1:
        findscoreEorder(m, class);
        break;
    case 2:
        findscoreMorder(m, class);
        break;
    case 3:
        findscoreCorder(m, class);
        break;
    case 4:
        findscoreSorder(m, class);
        break;
    default:
        printf("没有这个课程\n");
        break;
    }
}
void findscoreEorder(struct manament *m, char class[20])
{
    for (int i = 0; i < m->size - 1; i++)
    {
        for (int j = 0; j < m->size - 1; j++)
        {
            if (m->me[j].stugread.English < m->me[j + 1].stugread.English) //根据成绩冒泡排序
            {
                struct student st;
                st = m->me[j];
                m->me[j] = m->me[j + 1];
                m->me[j + 1] = st;
            }
        }
    }
    findclassstu(m, class); //打印数据
    save(m);                //保存数据
}
void findscoreMorder(struct manament *m, char class[20])
{
    for (int i = 0; i < m->size - 1; i++)
    {
        for (int j = 0; j < m->size - 1; j++)
        {
            if (m->me[j].stugread.math < m->me[j + 1].stugread.math) //根据成绩冒泡排序
            {
                struct student st;
                st = m->me[j];
                m->me[j] = m->me[j + 1];
                m->me[j + 1] = st;
            }
        }
    }
    findclassstu(m, class); //打印数据
    save(m);
    //保存数据
}
void findscoreCorder(struct manament *m, char class[20])
{
    for (int i = 0; i < m->size - 1; i++)
    {
        for (int j = 0; j < m->size - 1; j++)
        {
            if (m->me[j].stugread.c < m->me[j + 1].stugread.c) //根据成绩冒泡排序
            {
                struct student st;
                st = m->me[j];
                m->me[j] = m->me[j + 1];
                m->me[j + 1] = st;
            }
        }
    }
    findclassstu(m, class); //打印数据
    save(m);
    //保存数据
}
void findscoreSorder(struct manament *m, char class[20])
{
    for (int i = 0; i < m->size - 1; i++)
    {
        for (int j = 0; j < m->size - 1; j++)
        {
            if (m->me[j].stugread.score < m->me[j + 1].stugread.score) //根据成绩冒泡排序
            {
                struct student st;
                st = m->me[j];
                m->me[j] = m->me[j + 1];
                m->me[j + 1] = st;
            }
        }
    }
    findclassstu(m, class); //打印数据
    save(m);
    //保存数据
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值