学生管理系统(初级)

    #include
    #include
    #include
    #define Size sizeof(struct Student)
    struct Student *p = NULL;
    typedef struct Student
    {
        int grade;
        long student_number;
        char name[20];
        char course[20];
        float usual_score;
        float test_score;
        float total_score;
        struct Student *next;
    } S;
    void print_char()
    {
        printf("********************************************************************************\n");
    }
    void print_menu()
    {
        printf("学生成绩管理系统\n\n");
        printf("1、输入学生信息\n");
        printf("2、修改学生信息\n");
        printf("3、删除学生信息\n");
        printf("4、按姓名查询\n");
        printf("5、按班级查询\n");
        printf("6、按学号查询\n");
        printf("7、按课程名称查询\n");
        printf("8、按总分高低排序\n");
        printf("9、单科成绩排名\n");
        printf("10、查询班级优秀率\n");
        printf("11、查询课程最高分,最低分\n");
        printf("12、输出文件学生信息\n");
        printf("13、退出系统\n");
    }
    void print(S *head)
    {
        printf("所有信息如下:\n");
        printf("班级 \t 学号\t 姓名\t         科目         平时成绩      考试成绩    总成绩\n");
        S *ptr = head;
        while( ptr  != NULL)
        {
            printf("%d\t%ld\t%-10s       %-10s    %.2f         %.2f       %.2f\n",ptr->grade,ptr->student_number,ptr->name,ptr->course,ptr->usual_score,ptr->test_score,ptr->total_score);
            ptr = ptr->next;
        }
    }
    S *creat_file()
    {
        void print();
        unsigned n;
        S *head,*node,*end;
        FILE *fp;
        if((fp = fopen("date_students.txt","r")) == NULL)
        {
            printf("connot open the file\n");
            exit(0);
        }
        fscanf(fp,"%d",&n);
        printf("文件学生信息:\n");
        head = (S*)malloc(Size);
        fscanf(fp,"%d%ld%s%s%f%f",&head->grade,&head->student_number,head->name,head->course,&head->usual_score,&head->test_score);
        head->total_score = head->usual_score*0.2 + head->test_score*0.8;
        end = head;
        for(int i = 2; i  n; i++)
        {
            node = (S*)malloc(Size);
            end->next = node;
            end = node;
            fscanf(fp,"%d%ld%s%s%f%f",&node->grade,&node->student_number,node->name,node->course,&node->usual_score,&node->test_score);
            node->total_score =node->usual_score*0.2 +node->test_score*0.8;
        }
        end->next = NULL;

        return head;
    }
    S *creat()
    {
        void print();
        FILE *fp;
        unsigned n;
        if((fp = fopen("T_date.txt","w")) == NULL)
        {
            printf("connot open the file\n");
            exit(0);
        }
        printf("有多少组学生数据:\n");

        scanf("%u",&n);
        if(n == 0)
            exit(0);
        printf("请依次输入%d组数据:",n);
        printf("班级  学号  姓名   科目  平时成绩  考试成绩\n");
        fprintf(fp,"班级  学号  姓名   科目  平时成绩  考试成绩\n");
        S *head,*node,*end;
        head = (S*)malloc(Size);
        scanf("%d%ld%s%s%f%f",&head->grade,&head->student_number,head->name,head->course,&head->usual_score,&head->test_score);
        head->total_score = head->usual_score*0.2 + head->test_score*0.8;
        fprintf(fp,"%d\t%ld\t%-10s       %-10s    %.2f         %.2f       %.2f\n",head->grade,head->student_number,head->name,head->course,head->usual_score,head->test_score,head->total_score);
        end = head;
        for(int i = 2; i  n; i++)
        {
            node = (S*)malloc(Size);
            end->next = node;
            end = node;
            scanf("%d%ld%s%s%f%f",&node->grade,&node->student_number,node->name,node->course,&node->usual_score,&node->test_score);
            node->total_score =node->usual_score*0.2 +node->test_score*0.8;
            fprintf(fp,"%d\t%ld\t%-10s       %-10s    %.2f         %.2f       %.2f\n",node->grade,node->student_number,node->name,node->course,node->usual_score,node->test_score,node->total_score);
        }
        end->next = NULL;
        fclose(fp);
        return head;
    }
    S* change(S *head)
    {
        int i = 1,n = 0;
        S *t = head;
        printf("修改第几个学生的信息\n");
        scanf("%d",&n);
        while(i < n && t != NULL )
        {
            t = t->next;
            i++;
        }
        if(n != 0 && t != NULL)
        {
            printf("请输入要修改学生的信息:\n");
            scanf("%d%ld%s%s%f%f",&t->grade,&t->student_number,t->name,t->course,&t->usual_score,&t->test_score);
            t->total_score =t->usual_score*0.2 +t->test_score*0.8;

        }
        else
            puts("结点不存在!\n");
        return head;
    }
    S * delet(S *head)
    {
        int i = 1,n = 0;
        printf("删除第几个学生信息:\n");
        scanf("%d",&n);
        S* t = head, *in;
        if(n == 1)
        {
            in  = t;
            head  = head->next;
            free(in);
        }
        else
        {
            while (i < n && t != NULL)
            {
                in = t;
                t = t->next;
                i++;
            }
            if (n != 0 && n != 1&& t != NULL)
            {
                in->next = t->next;
                free(t);
            }
            else
            {
                puts("结点不存在");
            }
        }
        return head;
    }
    void serch_number(S *head)
    {
        long student_number;
        int  flag = 1,i = 1;
        printf("请输入需要查询的学号:\n");
        scanf("%ld",&student_number);
        S *t = head;
        while(t != NULL)
        {
            while(t != NULL  &&  t->student_number != student_number   )
                t = t->next;
            if(t != NULL)
            {
                if(i)
                {
                    printf("班级 \t 学号\t 姓名\t         科目         平时成绩      考试成绩    总成绩\n");
                    i = 0;
                }
                printf("%d\t%ld\t%-10s       %-10s    %.2f         %.2f       %.2f\n",t->grade,t->student_number,t->name,t->course,t->usual_score,t->test_score,t->total_score);
                flag = 0;
            }
            else
                break;
            t = t->next;
        }
        if(flag)
            printf("没有学号为%ld学生信息\n",student_number);
    }

    void serch_date(S *head,char date[])
    {
        S *t = head;
        int flag = 1,i = 1;
        while( t != NULL )
        {
            while( t != NULL && strcmp(t->name,date) != 0  )
                t = t->next;
            if(t != NULL)
            {
                if(i)
                {
                    printf("班级 \t 学号\t 姓名\t         科目         平时成绩      考试成绩    总成绩\n");
                    i = 0;
                }
                printf("%d\t%ld\t%-10s       %-10s    %.2f         %.2f       %.2f\n",t->grade,t->student_number,t->name,t->course,t->usual_score,t->test_score,t->total_score);
                flag = 0;
            }
            else
                break;
            t = t->next;
        }
        if(flag)
            printf("没有%s信息\n",date);
    }
    void serch_grade(S *head,int grade)
    {
        S *t = head;
        int  flag = 1,i = 1;
        while(t != NULL)
        {
            while(  t != NULL && t->grade != grade )
                t = t->next;
            if(t != NULL)
            {
                if(i)
                {
                    printf("班级 \t 学号\t 姓名\t         科目         平时成绩      考试成绩    总成绩\n");
                    i = 0;
                }
                printf("%d\t%ld\t%-10s       %-10s    %.2f         %.2f       %.2f\n",t->grade,t->student_number,t->name,t->course,t->usual_score,t->test_score,t->total_score);
                flag = 0;
            }
            else
                break;
            t = t->next;
        }
        if(flag)
            printf("没有%d班信息\n",grade);
    }
    void serch_date_course(S *head,char date[])
    {
        S *t = head;
        int  flag = 1,i = 1;
        while(t != NULL)
        {
            while( t != NULL && strcmp(t->course,date) != 0  )
                t = t->next;
            if(t != NULL)
            {
                if(i)
                {
                    printf("班级 \t 学号\t 姓名\t         科目         平时成绩      考试成绩    总成绩\n");
                    i = 0;
                }
                printf("%d\t%ld\t%-10s       %-10s    %.2f         %.2f       %.2f\n",t->grade,t->student_number,t->name,t->course,t->usual_score,t->test_score,t->total_score);
                flag = 0;
            }
            else
                break;
            t = t->next;
        }
        if(flag)
            printf("没有%s信息\n",date);
    }
    S *sort_total_score(S *head)
    {
        S *q = head,*p;

        int temp1;
        long temp2;
        char temp3[20];
        char temp4[20];
        float temp5;
        float temp6;
        float temp7;
        for( ; q!=NULL ; q = q->next)
            for(p = q->next; p != NULL; p = p->next )
            {
                if( q->total_score < p->total_score )
                {
                    temp1 = p->grade;
                    temp2 =  p->student_number;
                    strcpy(temp3, p->name ) ;
                    strcpy( temp4, p->course) ;
                    temp5 =   p->usual_score;
                    temp6 =   p->test_score ;
                    temp7 =  p->total_score ;
                    p->grade = q->grade;
                    p->student_number = q->student_number;
                    strcpy( p->name, q->name ) ;
                    strcpy(  p->course,  q->course) ;
                    p->usual_score =  q->usual_score;
                    p->test_score =  q->test_score ;
                    p->total_score =  q->total_score ;
                    q->grade =  temp1;
                    q->student_number = temp2;
                    strcpy(q->name, temp3 ) ;
                    strcpy( q->course,  temp4) ;
                    q->usual_score =  temp5;
                    q->test_score =  temp6 ;
                    q->total_score =   temp7 ;
                }
            }

        return head;
    }
    void sort_one_course(S *head,char course[])
    {
        S *t = head;
        int  flag = 1,i = 1;
        sort_total_score(head);
        while(t != NULL)
        {
            while( t != NULL  && strcmp(t->course,course) != 0)
                t = t->next;
            if(t != NULL)
            {
                if(i)
                {
                    printf("班级 \t 学号\t 姓名\t         科目         平时成绩      考试成绩    总成绩\n");
                    i = 0;
                }
                printf("%d\t%ld\t%-10s       %-10s    %.2f         %.2f       %.2f\n",t->grade,t->student_number,t->name,t->course,t->usual_score,t->test_score,t->total_score);
                flag = 0;
            }
            else
                break;
            t = t->next;
        }
        if(flag)
            printf("没有%s信息\n",course);
    }
    void grade_great_number(S *head,int grade)
    {
        float num1 = 0,num2 = 0,num3 = 0;
        int flag = 0;
        S *t = head;
        while(t != NULL)
        {
            while( t != NULL && t->grade != grade )
                t = t->next;
            if(t != NULL)
            {
                flag = 1;
                num1++;
                if(t->total_score >= 90)
                    num2++;
                else if(t->total_score < 60)
                    num3++;
            }
            else
                break;
            t = t->next;
        }
        if(flag)
            printf("%d班:\n优秀率:%-5.2f%%   不及格率:%-5.2f%%\n",grade,(num2/num1)*100,(num3/num1)*100) ;
        else
            printf("没有%d班信息!\n",grade);
    }
    S *sort_one_course1(S *head,char course[])
    {
        S *t = head, *min = NULL;
        int flag = -1;
        sort_total_score(head);
        while(t != NULL)
        {
            while(t != NULL && strcmp(t->course,course) != 0  )
                t = t->next;
            if(t != NULL)
            {
                flag ++;
            }
            else
                break;
            min = t;
            t = t->next;
        }
        if(flag)
            return min;
        else
            return NULL;
    }
    void sort_m(S *head,char course[] )
    {
        S *t = head,*max,*min =sort_one_course1(head,course) ;
        sort_total_score(head);
        while( t != NULL && strcmp(t->course,course) != 0  )
        {
            t = t->next;
            if(t == NULL)
                break ;
        }
        max = t;
        if(max != NULL)
        {
            printf("%s最大值学生信息:\n",course);
            printf("班级 \t 学号\t 姓名\t         科目         平时成绩      考试成绩    总成绩\n");
            printf("%d\t%ld\t%-10s       %-10s    %.2f         %.2f       %.2f\n",max->grade,max->student_number,max->name,max->course,max->usual_score,max->test_score,max->total_score);
        }
        else
        {
            printf("没有%s课程信息\n",course);
            return;
        }
        if(min != NULL)
        {
            printf("%s最小值学生信息:\n",course);
            printf("%d\t%ld\t%-10s       %-10s    %.2f         %.2f       %.2f\n",min->grade,min->student_number,min->name,min->course,min->usual_score,min->test_score,min->total_score);
        }
        else
            printf("%s只有1个同学信息,不存在最值\n",course);
    }
    void mean_in(int num)
    {

        char date[20],course[20];
        int grade;
        switch(num)
        {
        case 1://信息录入
        {
            p = creat();
            print(p);

        }
        break;
        case 2://修改信息
            print(change(p));
            break;
        case 3://删除信息
        {
            p =delet(p);
            print(p);
        }
        break;
        case 4://按姓名查询
        {
            printf("请输入需要查询的姓名:\n");
            getchar();
            serch_date(p,  gets(date));
        }
        break;
        case 5://按班级查询
        {
            printf("请输入要查询的班级:\n");
            scanf("%d",&grade);
            serch_grade(p,grade);
        }
        break;
        case 6://按学号查询
            serch_number(p);
            break;
        case 7://按课程名查询
        {
            printf("请输入需要查询的课程名:\n");
            getchar();
            serch_date_course(p,gets(date));
        }
        break;
        case 8://按总分排序
            print(sort_total_score(p)) ;
            break;
        case 9://单科成绩排名
        {
            printf("请输入需要排序的课程名:\n");
            getchar();
            sort_one_course(p,gets(course));
        }
        break;
        case 10://班级优秀率
        {
            printf("请输入需要查询的班级:\n");
            scanf("%d",&grade);
            grade_great_number(p,grade);
        }
        break;
        case 11:
        {
            printf("请输入需要查询的课程的最值:\n");
            getchar();
            sort_m(p, gets(course));
        }
        break;
        case  12:
        {
            p = creat_file();
            print(p);
        }
        break;
        case  13:
            exit(0);
            break;
        }
    }
    int main()
    {
        int num = 0;
        print_menu();
        print_char();
        while(1)
        {
            printf("请选择功能序号(1——13)\n");
            scanf("%d",&num);
            if(!(num >= 1 && num  13))
            {
                printf("功能选择有误,请重新选择\n");
                scanf("%d",&num);
            }
            mean_in(num);
            print_char();
        }
        return 0;
    }

Original: https://www.cnblogs.com/iforeverhz/p/16255986.html
Author: iforeverhz
Title: 学生管理系统(初级)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/583244/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 如何使用 systemctl 管理服务

    systemd是一个服务管理器,目前已经成为Linux发行版的新标准。它使管理服务器变得更加容易。了解并利用组成systemd的工具将有助于我们更好地理解它提供的便利性。 syst…

    Linux 2023年6月13日
    085
  • redis 订阅与发布

    Reference: https://redisbook.readthedocs.io/en/latest/feature/pubsub.html Redis 的 SUBSCRIB…

    Linux 2023年5月28日
    0119
  • BKT的胡测题解:第一套第二题reactor

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/Grharris/p/11530297.htmlAuth…

    Linux 2023年6月6日
    0100
  • 【Example】C++ STL 常用容器概述

    前排提醒: 由于 Microsoft Docs 全是机翻。所以本文表格是我人脑补翻+审校。 如果有纰漏、模糊及时反馈。 了解每一种容器的特性、知道什么情况下用什么容器就可以。 序列…

    Linux 2023年6月13日
    085
  • Dubbo + ZooKeeper

    16 Dubbo + ZooKeeper 16.1 Dubbo下载 GigHub下载地址: https://github.com/apache/dubbo-admin/tree/m…

    Linux 2023年6月14日
    089
  • Ubuntu系统中MySQL安装后基本配置

    mysql8.0安装好后并不会让你输入root密码,而是采用默认账户+默认密码的方式保护数据库安全,但开发环境并不需要这样做。那么怎么找到这个默认账户和密码,又如何修改数据库使它可…

    Linux 2023年6月14日
    083
  • linux与windows的批处理应用

    本文主要记录一下,不同服务器部署springboot项目时,用到的批处理命令 linux,针对maven-assembly-plugin打的tar.gz包的springboot项目…

    Linux 2023年6月14日
    0102
  • windows下redis配置密码

    redis安装后目录如下: 最简单的启动方式是直接双击redis-server.exe 这样启动会有个问题,一旦你把命令行窗口关闭 redis也会被关闭,所以我们需要把它注册成服务…

    Linux 2023年5月28日
    0106
  • 搭建Nginx四层反向代理

    需求背景: 前段时间公司因为业务需求需要部署一个正向代理,我已经分享出来了https://www.cnblogs.com/Dfengshuo/p/11911406.html,现有因…

    Linux 2023年6月8日
    0123
  • Java基础系列–05_面向对象

    1、概述:(1)面向过程:将问题一步一步的解决的过程(详细步骤),在C语言中所有的代码都是基于过程化的代码。(2)面向对象:面向对象是基于面向过程的编程思想,所有的事情都交由创建出…

    Linux 2023年6月7日
    0113
  • 二、Java分布式(第二章)—-Demo

    这一章简单搭建一个分布式服务: 1、Dubbo简介:Dubbo 是一个分布式服务框架,是阿里巴巴开源项目。 Dubbo 致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA…

    Linux 2023年6月7日
    0123
  • shell 配置文件节约空间

    shell 配置文件节约空间 sed 读取一个配置文件的的多个变量 Original: https://www.cnblogs.com/hshy/p/16451927.htmlAu…

    Linux 2023年5月28日
    088
  • linux中软件的安装方式

    linux中软件的安装方式 四种方式 ​ 源码编译安装 ​ rpm安装 ​ yum安装 解压、配置(hadoop、hive等) 1.源码编译安装 1.为了编译nginx源码 yum…

    Linux 2023年6月11日
    097
  • linux配置密钥登录

    一、前言: ssh远程登录密码认证的方式有三种,password、Keyboard Interactive、Public Key前面两种方式就是密码认证,含义都是一样大同小异。第三…

    Linux 2023年6月8日
    099
  • Redis多线程原理详解

    从上图中可以看出只有以下3个地方用的是多线程,其他地方都是单线程: 1:接收请求参数 2:解析请求参数 3:请求响应,即将结果返回给client 很明显以上3点各个请求都是互相独立…

    Linux 2023年5月28日
    089
  • 每周一个linux命令(ping)

    基础环境 ping命令介绍 ping&#x547D;&#x4EE4;&#x4E3B;&#x8981;&#x7528;&#x6765;…

    Linux 2023年6月8日
    098
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球