学生成绩管理系统(C语言版)

学生成绩管理系统
1 数据结构:学生信息:学号,姓名,年龄,性别,三科成绩
2 功能:
增加学生记录
删除学生记录
查找学生信息(学号,姓名)
修改学生信息
按照成绩排序,求平均值,最大值,最小值
3 用户界面
主菜单
子菜单

/*
学生成绩管理系统
1 数据结构:学生信息:学号,姓名,年龄,性别,三科成绩
2 功能:
    增加学生记录
    删除学生记录
    查找学生信息(学号,姓名)
    修改学生信息
    按照成绩排序,求平均值,最大值,最小值
3 用户界面
    主菜单
    子菜单
4 批量生成测试数据

原作者链接 https://www.cnblogs.com/XYQ-208910/p/4745371.html
*/

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

#define N 50
static int count = 10; // 定义静态全局变量,统计目前数组中的人数

struct Student
{
    char name[20];
    int sno;
    int age;
    char gender;
    float EnglishScore;
    float mathScore;
    float chineseScore;
}stu[N]= {{"zhao",1000,20,'M',98,99,97},
         {"zhao",1001,21,'F',97,96,95},
         {"qian",1002,23,'M',95,96,92},
         {"hong",1003,22,'F',91,93,97},
         {"zhou",1004,25,'M',90,90,90},
         {"feng",1005,21,'F',96,93,96},
         {"wang",1006,23,'M',97,91,90},
         {"chen",1007,21,'F',94,92,91},
         {"geng",1008,20,'F',90,99,91},
         {"tang",1009,24,'M',99,99,99}};


//添加数据
void add(struct Student stu[],int pos,int nums);


//删除数据
void Delete_name(struct Student *stu,char Name[]);//(按姓名)
void Delete_sno(struct Student *stu,int Sno);//(按学号)


//修改数据
void update(struct Student stu[],int Sno,int len);


//查询子菜单
void menu(struct Student stu[],int m);
void search(struct Student stu[],int n,char Name[]);//按姓名查询
void search1(struct Student stu[],int n,int Num);//按学号查询
void sort(struct Student stu[],int n); //按总分高低排序
void print(struct Student stu[],int n);
void My_print_sum(struct Student stu[],int n);
void max_min(struct Student stu[],int n);



// 主菜单
void PrintScreen()
{
    printf("------------------\n");
    printf("** 1.增加学生记录 **\n");
    printf("** 2.删除学生记录 **\n");
    printf("** 3.查找学生记录 **\n");
    printf("** 4.修改学生记录 **\n");
    printf("** 0.退出管理系统 **\n");
    printf("------------------\n");
}

// 删除子菜单
void deleteScreen()
{
    printf("------------------\n");
    printf("** 0.按姓名删除数据**\n");
    printf("** 1.按学号删除数据**\n");
    printf("** 2.返回主菜单   **\n");
    printf("------------------\n");
    printf("please select 0-1:");
}

// 查找子菜单
void seekScreen()
{
    printf("-------------------------\n");
    printf("****** 1.按姓名查找信息    *\n");
    printf("****** 2.按学号查找信息    *\n");
    printf("****** 3.查看所有学生成绩  *\n");
    printf("****** 4.成绩名次排序(总分)*\n");
    printf("****** 5.查看成绩最优最差  *\n");
    printf("****** 6.返回主菜单       *\n");
    printf("-------------------------\n");
    printf("please you select 1-6:");
}


int main(int argc, const char *argv[])
{
    int nums, temp;
    int snos;
    char names[20];
    while (1)
    {
        PrintScreen();
        printf("please press enter_key continue!\n");
        getchar();
        printf("please select 0-4:");
        char c = getchar();
        switch (c)
        {
        case '1':
            printf("please student'number you want to add:");
            scanf("%d",&nums);
            add(stu, count, nums); // 添加数据
            getchar();
            break;

        case'2':
            deleteScreen();
            scanf("%d",&temp);
            switch (temp)
            {
            case 0:
                printf("plseas input delete name:");
                scanf("%s",names);
                Delete_name(stu,names); // 按照姓名删除
                break;
            case 1:
                printf("plseas input delete sno:");
                scanf("%d",&snos);
                Delete_sno(stu,snos); // 按照学号删除
            default:
                break;
            }

        case '3':
            menu(stu, count); // 查找数据
            getchar();
            break;

        case '4':
            printf("please input uddate sno:");
            scanf("%d",&snos);
            update(stu, snos, count); // 修改数据
        case '0':
            exit(0); // 退出系统
        default:
            printf("data is illeagl !\n"); // 输入非法
            getchar();
            break;
        }
    }
    return 0;
}

//添加数据
void add(struct Student stu[], int pos, int nums) // 开始位置,添加的人数
{
    for (int i = pos; i < pos + nums; i++) { // 学号不能存在重复的
        printf("please input name:");
        scanf("%s",stu[i].name);
        int flag = 1, sno;
        while (flag)
        {
            printf("please input sno:");
            scanf("%d",&stu[i].sno);
            for (int j = 0; j < pos; j++) {
                if (stu[j].sno == sno) {
                    printf("sno is exit!\n");
                    break;
                } else {
                    flag =0;
                }
            }
            stu[i].sno = sno;
        }

        printf("please input age:");
        scanf("%d",&stu[i].age);
        printf("please input gender:(f/m or F/M)");
        getchar(); // 为何要有这个
        scanf("%c",&stu[i].gender);
        printf("please input EnglishScore:");
        scanf("%f",&stu[i].EnglishScore);
        printf("please input mathScore:");
        scanf("%f",&stu[i].mathScore);
        printf("please input ChineseScore:");
        scanf("%f",&stu[i].chineseScore);
        printf("学生信息添加成功!\n");
    }

    count += nums;
}


// 按学号删除
void Delete_sno(struct Student *stu, int Sno)
{
    if (count == 0) {
        printf("no student!\n");
        return;
    }
    int flag = 0;
    for (int i = 0; i < count; i++) {
        if ((stu + i)->sno == Sno) {
            for (int j = i; j < count; j++) {
                *(stu + j) = *(stu + j + 1); // 后面的数据前移动
            }
            printf("\n");
            printf("学号为%d的学生信息已被删除\n",Sno);
            flag = 1;
            count = count - 1;
            break;
        }
    }
    if (flag == 0) {
        printf("学号%d不存在.\n",Sno);
    }
}

// 按照姓名删除
void Delete_name(struct Student *stu, char Name[])
{
    if (count == 0) {
        printf("no student!\n");
        return;
    }
    int flag = 0;
    int n = count; // 可能存在多个姓名一样的学生
    for (int i = 0; i < n; i++) {
        if (strcmp((stu + i - flag)->name, Name) == 0) {
            for (int j = i - flag; j < count; j++) { // flag 存在的作用是减少循环次数
                *(stu + j) = *(stu + j + 1); // 后面的数据前移动
            }
            printf("\n");
            printf("学号为%s的学生信息已被删除\n",Name);
            flag += 1;
            count = count - 1;
            break;
        }
    }
    if (flag == 0) {
        printf("学生%s不存在.\n",Name);
    }
}

// 修改数据
void update(struct Student stu[], int sno, int len)
{
    char cs, cs1, cs2, cs3; // 标志
    char p[20];
    int grade, i;
    for (i = 0; i < len; i++) {
        if (sno == stu[i].sno) {
            printf("please ask update name?(y/n):");
            getchar();
            cs = getchar();
            if (cs == 'y') {
                printf("please input a new name:");
                scanf("%s",p);
                strcpy(stu[i].name, p);
                printf("update is succeed!\n");
            }

            printf("please ask update EnglishScore?(y/n):");
            getchar();
            cs1 = getchar();
            if (cs1 == 'y') {
                printf("please input a new EnglishScore:");
                scanf("%d",&grade);
                stu[i].EnglishScore = grade;
                printf("update is succeed!\n");
            }

            printf("please ask update mathScore?(y/n):");
            getchar();
            cs2 = getchar();
            if (cs2 == 'y') {
                printf("please input a new mathScore:");
                scanf("%d",&grade);
                stu[i].mathScore = grade;
                printf("update is succeed!\n");
            }

            printf("please ask update chineseScore?(y/n):");
            getchar();
            cs3 = getchar();
            if (cs3 == 'y') {
                printf("please input a new chineseScore:");
                scanf("%d",&grade);
                stu[i].chineseScore = grade;
                printf("update is succeed!\n");
                break;
            } else { // 是否应该存在
                getchar();
                break;
            }
        } else if ( i == len - 1){// 到达循环结束条件
            printf("error,don't have the sno!");
            break;
        } else {
            continue;
        }
    }
}


// 查询数据
void menu(struct Student stu[], int m)
{
    int logel = 1;
    while (logel)
    {
        seekScreen();
        int n;
        scanf("%d",&n);
        char name[20];
        int num;
        switch (n)
        {
        case 1:
            printf("请输入学生的姓名:");
            scanf("%s",name);
            search(stu, count, name);
            break;
         case 2:
            printf("请输入学生的学号:");
            scanf("%d",&num);
            search1(stu, count, num);
        case 3:
            print(stu, count);
            break;
        case 4:
            sort(stu, count);
            print(stu, count);
            break;
        case 5:
            max_min(stu, count);
            break;
        case 6:
            logel = 0;
            break;
        
        default:
            logel = 0;
            printf("输入的数字有无!\n");
            break;
        }
    }
    
}

void search(struct Student stu[], int n, char Name[])
{
    char *p = Name;
    int flag = 0;
    for (int i = 0; i < n; i++) {
        if (strcmp(stu[i].name, p) == 0) {
            flag = 1;
            My_print_sum(stu, i);
        }
    }
    if (flag == 0) {
        printf("the name is not!\n");
    }
}

void search1(struct Student stu[], int n, int Num)
{
     int flag = 0;
    for (int i = 0; i < n; i++) {
        if (stu[i].sno == Num) {
            flag = 1;
            My_print_sum(stu, i);
        }
    }
    if (flag == 0) {
        printf("the sno is not!\n");
    }
}

void sort(struct Student stu[],int n)
{
    float sum[N];
    for(int i=0;i<n;i++)
    {
        sum[i]=stu[i].EnglishScore+stu[i].mathScore+stu[i].chineseScore;
    }
    for(int i=0;i<n-1;i++)
    {
        for(int j=0;j<n-1-i;j++)
        {
            if(sum[j]<sum[j+1])
            {
                float temp1 = sum[j];
                sum[j] = sum[j+1];
                sum[j+1] = temp1;

                struct Student temp;
                temp=stu[j];
                stu[j]=stu[j+1];
                stu[j+1]=temp;
            }
        }
    }
}


void max_min(struct Student stu[], int n)
{
    sort(stu, n);
    printf("成绩最好的同学:"); 
    My_print_sum(stu, 0); // 没有排除存在成绩一样的同学

    printf("成绩最差的同学:"); 
    My_print_sum(stu, n - 1); // 没有排除存在成绩一样的同学
}

void print(struct Student stu[], int n)
{
    for(int i = 0; i < n; i++) {
        My_print_sum(stu, i);
    }
}

void My_print_sum(struct Student stu[], int n) 
{
    printf("\n姓名:%s,学号:%d,年龄:%d,性别:%c,英语:%.2f,数学:%.2f,语文: %.2f,总分:%.2f\n",// 保留2位小数
        stu[n].name,stu[n].sno,stu[n].age,stu[n].gender,
        stu[n].EnglishScore,stu[n].mathScore,stu[n].chineseScore,
        (stu[n].EnglishScore+stu[n].mathScore+stu[n].chineseScore));
}

郑重声明本文章的代码是我对照着 https://www.cnblogs.com/XYQ-208910/p/4745371.html 这位大佬的文章敲出来的,如有侵权,立刻删除。

这部分代码还可以完善。1 增加保存功能,2 更换排序算法
打算使用C++语言再次实现

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值