C语言程序设计高分期末大作业

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<windows.h>
#define M 20
struct Grade
{
    int math;
    int English;
    int computer;
    int PE;
};
typedef struct student
{
    struct Grade grade;
    char student_number[20];
    char name[20];
    char sex[2];
    int old;
    int total;
    double average;
    char key[20];
    char leave_massage[100];
} Student;
struct link
{
    Student stu;
    struct link * next;
};
struct link *head=NULL;
void total_page_design();//系统的登录页面/总页面;
void help();//使用说明;
struct link * student_register(int * m);//学生登录;在登陆的同时就遍历链表,并返回当前节点的指针,之后的函数就不用再遍历,节省时间;
void teacher_register(int *m);//教师登录;

/**-----------------------------------------------------------------学生端函数声明----------------------------------------------------**/
#define N 2
void student_main();//学生端主函数;
void student_page_design();//学生端主页面设计;
struct student_register
{
    char account[20];
    char key[20];
};
struct student_register ST[N]= {{"729041065","123456"},{"123456","123456"}};
void reset_key(struct link * p);
void school_precaution(struct link * p);//学业预警;
void inquir_leave_message(struct link * p);//查询老师的留言;
/**-----------------------------------------------------------------教师端函数声明----------------------------------------------------**/
void teacher();//教师端主函数;
void Welcome_teather(void);//教师端总函数主菜单页面设计;
void record_grade(struct link *head);//分科目修改学生成绩
void Record();//记录学生信息的总页面(里面包含与记录成绩,记录基本信息先关的函数);
struct link * append(struct link *head);//创建学生链表;
void display(struct link *head );//用于测试啊;
int tuichu(int t);//退出学生管理系统;
void record_grade_yemiansheji();//录入学生成绩的页面设计;
void print_information(struct link *head);//打印全部学生的全部信息
void grade_record(struct link *head);//第一次记录学生的各科成绩;
int Count (struct link *head);//统计已经记录的学生人数;
void find_stu();//查找学生的信息的页面,以及实现选择功能;
void find_stu_by_num (struct link *head );//实现按名字查找学生的信息;
void find_stu_by_name (struct link * head);//实现按学号查找学生的信息;
void change (struct link * head);//修改学生的全部信息;
struct link * delete_stu(struct link * head);//删除学生的信息;
void find_unrecord_grade(struct link * head);//找出未记录成绩的学生,并补强制记录他的成绩;
void saveStu();   // 保存学生信息
void readStu();  // 读取学生信息
void information_exchange(struct link * p);//交换学生的所有信息;
void sort_by_average(struct link *head);//冒泡排序,平均分;
void sort_by_total(struct link * head);//冒泡排序,总分;
void sort_by_Eglish(struct link * head);
void sort_by_math(struct link * head);
void sort_by_PE(struct link * head);
void sort_by_computer(struct link * head);
void sort_yemiansheji();//排序的页面设计;
void statistical_analysis(struct link * head );//统计成绩数据,并分析数据,主页面;
void count_sorted_stu(int score[]);//统计不及格人数(<60),及格(60-70),中等(70-80),优秀(>80);
void copy_to_arry(struct link *head,int English[],int computer[],int PE[],int math[],int total[],int average[]);//将链表中的数复制到数组中;目的:脱离链表后,使统计函数具有可多次利用性,从而减少大量重复代码;
void print_conclum_diagram(int a,int b,int c,int d);//打印出彩色条形统计图;
void leave_massage();//老师留言
void color(short x)	//自定义函根据参数改变颜色;
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);	//只有一个参数,改变字体颜色
}
int main()
{
    int t=1;
    while(t)
    {
        total_page_design();
        char ch=_getch();
        switch(ch)
        {
        case '2':
            system("cls");
            teacher();
            system("pause");
            system("cls");
            break;
        case '1':
            system("cls");
            student_main();
            system("pause");
            system("cls");
            break;
        case '3':
            t=tuichu(t);
            color(11);
            printf("记得五星好评哦!(^*^)\n");
            color(7);
            system("pause");
            break;
        case '4':
            help();
            system("pause");
            system("cls");
            break;
        default:
            color(4);
            printf("您的输入有误,请重新输入。\n");
            color(7);
            system("pause");
            system("cls");
            break;
        }
    }
    return 0;
}
struct link * student_register(int * m)//学生端登录;
{
    struct link *p=head;
    char account[20],key[20];
    int i,n=3;
    system("cls");
    color(11);
    printf("账号:");
    scanf("%s",account);
    for(p=head; p!=NULL; p=p->next)
    {
        if(strcmp(account,p->stu.student_number)==0)
        {
FLAG3:
            system("cls");
            color(11);
            printf("账号:%s\n",account);
            printf("\n密码:");
            scanf("%s",key);
            if(strcmp(key,p->stu.key)==0)
            {
                color(11);
                printf("登录成功!\n");
                color(7);
                system("pause");
                return p;
            }
            else
            {
                color(4);
                printf("密码错误!\您还有%d次机会\n",n);
                if(n==0)
                {
                    *m=1;
                    system("pause");
                    system("cls");
                    return NULL;
                }
                n--;
                system("pause");
                system("cls");
                goto FLAG3;
                color(7);
            }
        }

    }

    color(4);
    printf("账号错误!\n");
    color(7);
    *m=1;
    return NULL;
}
void teacher_register(int *m)
{
    char account[20],key[20];
    int i,n=3;
    system("cls");
    color(11);
    printf("账号:");
    scanf("%s",account);
    for(i=0; i<N; i++)
    {
        if(strcmp(account,ST[i].account)==0)
        {
FLAG3:
            system("cls");
            color(11);
            printf("账号:%s\n",account);
            printf("\n密码:");
            scanf("%s",key);
            if(strcmp(key,ST[i].key)==0)
            {
                color(11);
                printf("登录成功!\n");
                color(7);
                system("pause");
                break;
            }
            else
            {
                color(4);
                printf("密码错误!\您还有%d次机会\n",n);
                if(n==0)
                {
                    *m=1;
                    system("pause");
                    system("cls");
                    return;
                }
                n--;
                system("pause");
                system("cls");
                goto FLAG3;
                color(7);
            }
        }
    }
    if(strcmp(account,ST[i].account)!=0)
    {
        color(4);
        printf("账号错误!\n");
        color(7);
        *m=1;
    }
}
/**----------------------------------------------------------------------------------以下为学生端功能函数-----------------------------------------------------------------------------------------------------------------**/
void total_page_design()
{
    color(238);
    printf("\t\t\t");
    printf("                                                 \n");
    printf("\t\t\t");
    color(238);
    printf(" ");
    color(190);
    printf("                                               ");
    color(238);
    printf(" \n");
    color(238);
    printf("\t\t\t");
    printf(" ");
    color(190);
    printf(" *---------------智汇学绩管家----------------* ");
    color(238);
    printf(" \n");
    color(238);
    printf("\t\t\t");
    printf(" ");
    color(190);
    printf(" *-1.学生端登录       ||        2.教师端登录-* ");
    color(238);
    printf(" \n");
    printf("\t\t\t");
    color(238);
    printf(" ");
    color(190);
    printf(" *-3.退出             ||        4.help(^-^) -* ");
    color(238);
    printf(" \n");
    printf("\t\t\t");
    color(238);
    printf(" ");
    color(190);
    printf(" *-------------------------------------------* ");
    color(238);
    printf(" \n");
    printf("\t\t\t");
    color(238);
    printf("                                                 \n");
    color(7);
}
void help()
{
    color(11);
    printf("智汇学绩管家,精准管理,助力学业腾飞!\n");
    color(14);
    printf("1.学生的初始账号为学号\n2.学生的初始密码为学号\n3.老师的账户和密码请前往教务处获得\n");
    color(7);
}
void student_main()
{
    if(head==NULL)
        readStu();
    system("cls");
    struct link * p=NULL;
    if(head==NULL)
    {
        color(13);
        printf("目前老师并没有录入学生信息,请等待!\n");
        color(7);
        return ;
    }
    int f=0;
    int *m=&f;
    p=student_register(m);
    if(f==1)
        return;
    system("cls");
    int t=1;
    while(t)
    {
        student_page_design();
        char ch=_getch();
        switch(ch)
        {
        case '1':
            find_stu_by_num(head);
            system("pause");
            system("cls");
            break;
        case '2':
            school_precaution(p);
            system("pause");
            system("cls");
            break;
        case '6':
            t=tuichu(t);
            color(11);
            printf("记得五星好评哦!(^*^)\n");
            color(7);
            system("pause");
            break;
        case '3':
            printf("好好学习,天天向上!");
            system("pause");
            system("cls");
            break;
        case '4':
            inquir_leave_message(p);
            system("pause");
            system("cls");
            break;
        case '5':
            reset_key(p);
            system("pause");
            system("cls");
            break;
        default:
            color(4);
            printf("您的输入有误,请重新输入。\n");
            color(7);
            system("pause");
            system("cls");
            break;
        }
        system("cls");
    }
}
void student_page_design()
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 191);
    printf("$*$#############################################################$*$\n");//
    printf("$*$                 欢迎使用学生端智汇学绩管家                  $*$\n");//
    printf("$*$#############################################################$*$\n");//
    printf("$*$             ($输入对应的序号便可执行相应的操作$)            $*$\n");//
    printf("$*$              1.成绩查询                                     $*$\n");//
    printf("$*$              2.学业预警                                     $*$\n");
    printf("$*$              3.学生手册                                     $*$\n");
    printf("$*$              4.老师留言                                     $*$\n");
    printf("$*$              5.重置密码                                     $*$\n");
    printf("$*$              6.退出系统                                     $*$\n");//
    printf("$*$#############################################################$*$\n");//
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
void reset_key(struct link *p)
{
    color(15);
    printf("请输入你的新密码:");
    scanf("%s",p->stu.key);
    saveStu();
}
void school_precaution(struct link *p)
{
    int a=1;
    if (p->stu.grade.English<60)
    {
        color(4);
        printf("你的英语成绩不合格\n");
        printf("成绩为:%d\n",p->stu.grade.English);
        color(11);
        printf("学习建议:\n");
        printf("对于英语学习,以下是一些建议,这些建议可以帮助您更有效地提高英语水平:\n\
1,设定明确目标:\n*确定您学习英语的具体目标。\n*设定短期和长期目标,并为之制定计划\n。3,创造沉浸式学习环境:\n\
*尽可能多地接触英语,如观看英语电影、电视剧、听英语歌曲、阅读英文书籍和文章。\n*使用英语作为日常交流语言,与英语母语者交流或加入英语学习社群。\n\
4,基础语法和词汇:\n*打好基础是关键。确保您理解英语的基本语法规则,并持续扩大词汇量。\n5,阅读和写作:\n\
*阅读不同类型的英文材料,包括小说、新闻、杂志文章和学术论文,以提高阅读理解能力。\n*尝试用英语写日记、文章或博客,以锻炼写作技巧。\n6,坚持与毅力:\n\
7,保持积极心态:\n*英语学习过程中难免会遇到挫折和困难,但要保持积极的心态和信心。\n\
*相信自己能够克服困难并取得进步,享受英语学习的过程。\n");
        color(12);
        printf("----------------------------------------------------------------------------------\n");
        printf("----------------------------------------------------------------------------------\n");
        a=0;
    }


    if (p->stu.grade.computer<60)
    {
        color(4);
        printf("你的C语言成绩不合格\n");
        printf("成绩为:%d\n",p->stu.grade.computer);
        color(11);
        printf("学习建议:\n");
        printf("多做练习:通过大量练习来巩固知识,加深理解,可以从课本、习题集和在线资源中寻找练习题目。\n\
阅读经典书籍:如《C程序设计语言》(The C Programming Language)等,这些书籍能够提供更深入、全面的学习指导。\n\
注重编程风格:养成良好的编程风格,包括注释的编写、代码的组织和缩进等,使代码易于阅读和维护。\n\
参与项目:尝试参与一些小型项目,将C语言应用于实际问题中,提高实践能力。\n\
调试与测试:学会使用调试工具进行代码调试,以及编写测试代码来确保程序的正确性。\n\
保持耐心和热情:C语言的学习过程可能会有些枯燥,但保持耐心和热情,坚持下去会有收获的。\n");
        color(12);
        printf("----------------------------------------------------------------------------------\n");
        printf("----------------------------------------------------------------------------------\n");
        a=0;
    }

    if (p->stu.grade.math<60)
    {
        color(4);
        printf("你的数学成绩不合格\n");
        printf("成绩为:%d\n",p->stu.grade.math);
        color(11);
        printf("学习建议:\n");
        printf("打好基础:回顾并巩固数学基础知识,确保理解基本概念和公式。\n\
多做练习:通过大量练习来提高解题能力和速度,掌握常见题型和解题方法。\n\
寻求帮助:遇到难题时,不要害怕向老师、同学或网络资源求助。\n\
制定计划:制定合理的学习计划,分配好每天的学习时间,保持学习的持续性。\n\
培养兴趣:尝试将数学与实际应用相结合,培养对数学的兴趣和热爱。\n\
耐心和毅力:学习数学需要耐心和毅力,不要因一次失败而气馁,坚持下去会看到进步。\n");
        color(12);
        printf("----------------------------------------------------------------------------------\n");
        printf("----------------------------------------------------------------------------------\n");
        a=0;
    }

    if(p->stu.grade.PE<60)
    {
        color(4);
        printf("你的体育成绩不合格\n");
        printf("成绩为:%d\n",p->stu.grade.PE);
        color(11);
        printf("学习建议:\n");
        printf("多去锻炼,多跑步吧!\n");
        color(12);
        printf("----------------------------------------------------------------------------------\n");
        printf("----------------------------------------------------------------------------------\n");
        a=0;
    }
    if(p->stu.average<60)
    {
        printf("你的平均成绩比较差!");
        printf("成绩为:%lf\n",p->stu.average);
        printf("建议:\n你需要注重各个科目的学习,每一科都很重要!\n");
        a=0;
    }
    if (a==1)
    {
        color(14);
        printf("你的表现优异,没有不及格的科目,请你再接再厉!\n");
    }

}
void inquir_leave_message(struct link * p)
{
    char leave[100];
    strcpy(leave,p->stu.leave_massage);
    int i;
    printf("老师的留言是:\n");
    printf("%s\n",leave);
}
/**----------------------------------------------------------------------------------以下为教师端的功能函数---------------------------------------------------------------------------------------------------------------**/
void leave_massage()
{
    if (head==NULL)
    {
        printf("当前记录了0个学生!\n");
        return;
    }
    char name[20];
    printf("请输入您要留言学生的学号:");
    scanf("%s",name);
    struct link *p=head;
    while (strcmp(p->stu.student_number,name)!=0&&p->next!=NULL)
    {
        p=p->next;
    }
    if (strcmp(p->stu.student_number,name)==0)
    {
        printf("请给%s留言:(100字以内!)\n",p->stu.name);
        scanf("%s",p->stu.leave_massage);
    }
    else
    {
        printf("未找到该学生!\n");
        return ;
    }
    color(10);
    printf("留言成功!");
    color(7);
}
void teacher()
{
    if(head==NULL)
        readStu();
    int f=0;
    int *m=&f;
    teacher_register(m);
    if(f==1)
        return;
    int t=1,a=0,p;
    while(t)
    {
        Welcome_teather();
        printf("请输入你要执行的操作:\n");
        char ch =_getch();
        switch (ch)
        {
        case '1':
            system("cls");
            Record();
            system("pause");
            break;
        case '2':
            print_information(head);
            system("pause");
            break;
        case '3':
            saveStu();
            system("pause");
            break;
        case '4':
            readStu();
            system("pause");
            break;
        case '5':
            color(3);
            printf("一共统计了%d个学生!\n",Count(head));
            system("pause");
            break;
        case '6':
            find_stu();
            system("pause");
            break;
        case '7':
            record_grade(head);
            system("pause");
            break;
        case '8':
            head=delete_stu(head);
            system("pause");
            break;
        case '9':
            change(head);
            system("pause");
            break;
        case 'a':
            find_unrecord_grade(head);
            system("pause");
            break;
        case 'b':
            statistical_analysis(head);
            system("pause");
            break;
        case 'c':
            sort_yemiansheji();
            break;
        case 'e':
            leave_massage();
            system("pause");
            break;
        case 'd':
            color(11);
            printf("\n是否保存学生信息?(是请输入1//否请输入0)\n");
flag1:
            p=_getch();
            if (p!='0'&&p!='1')
            {
                printf("输入有误请重新输入(1.是/0.否):\n");
                goto flag1;

            }
            if (p=='1')
                saveStu();
            t=tuichu(t);
            color(11);
            printf("记得五星好评哦!(^*^)");
            system("pause");
            break;
        default:
            color(4);
            printf("您的输入有误,请重新输入。\n");
            system("pause");
            system("cls");
            break;
        }
        system("cls");
    }

    return 0;
}
//系统欢迎页面。
void Welcome_teather(void)
{
    system("cls");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 191);
    printf("$*$#############################################################$*$\n");//
    printf("$*$              欢迎使用教师端学生信息管理系统                 $*$\n");//
    printf("$*$#############################################################$*$\n");//
    printf("$*$             ($输入对应的序号便可执行相应的操作$)            $*$\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("$*$              a.检查是否全部学生都已经录入成绩               $*$\n");//完成
    printf("$*$              b.统计分析                                     $*$\n");//完成
    printf("$*$              c.一键排序                                     $*$\n");//完成
    printf("$*$              d.退出系统                                     $*$\n");//完成
    printf("$*$              e.给学生留言                                   $*$\n");//完成
    printf("$*$#############################################################$*$\n");//
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
void Record(void)//录入学生信息;
{
    char p='1';
    do
    {
        system("cls");
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 191);
        printf("$*$#############################################################$*$\n");
        printf("$*$                   请选择你要录入的信息                      $*$\n");
        printf("$*$#############################################################$*$\n");
        printf("$*$         ($输入对应的序号便可执行相应的操作$)                $*$\n");
        printf("$*$         1.录入学生基本信息                                  $*$\n");
        printf("$*$         2.(录入/修改)学生成绩                               $*$\n");
        printf("$*$         3.结束录入                                          $*$\n");
        printf("$*$#############################################################$*$\n");
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
        printf("请输入您要进行的操作的序号:\n");
        char ch =_getch();
        switch (ch)
        {
        case '1':
            head=append(head);
            //display(head);
            break;
        case '2':
            grade_record(head);
            break;
        default :
            p=0;
            break;
        }
        system("cls");
        printf("\n是否继续录入学生信息?(继续请输入1//结束请输入0)\n");
flag1:
        p=_getch();
        if (p!='0'&&p!='1')
        {
            printf("输入有误请重新输入(1.继续/0.结束):\n");
            while(getchar()!='\n');
            goto flag1;

        }
    }
    while(p=='1');
    printf("录入成功!\n");
}
//用于添加新的节点并传入数据;
struct link * append(struct link *head)
{
    struct link *p=NULL,*pr=head,*pre=head;
    int flag=1;
    p=(struct link *)malloc (sizeof (struct link));
    if (p==NULL)
    {
        printf("\nNo memory !\n");
        exit (0);
    }
    if (head==NULL)
    {
        head=p;
        flag=0;
    }
    else
    {
        while (pr->next!=NULL)
        {
            pr=pr->next;
        }
        pr->next=p;
    }
    char num[20];
    p->next=NULL;
    printf("请输入学生的学号:\n");
l:
    scanf("%s",num);
    if(flag)
    {
        while (pre->next!=NULL)
        {
            //printf("jjjj");
            if(strcmp(num,pre->stu.student_number)==0)
            {
                // printf("jjjj");
                color(4);
                printf("\t--------------\t\n");
                printf("\t|该学号已存在|\t\n");
                printf("\t--------------\t\n");
                color(11);
                printf("请重新输入:");
                goto l;
            }
            pre=pre->next;
        }
    }
    strcpy(p->stu.student_number,num);
    printf("请输入学生的姓名:\n");
    scanf("%s",p->stu.name);
    printf("请输入学生的性别(男/女):\n");
    char sex[2];
again:
    scanf("%s",sex);
    if(strcmp("男\0",sex)==0)
    {
        strcpy(p->stu.sex,sex);
    }
    else if(strcmp("女\0",sex)==0)
    {
        strcpy(p->stu.sex,sex);
    }
    else
    {
        color(4);
        printf("输入错误!!!\n");
        color(7);
        printf("请重新输入:");
        goto again;
    }
    printf("请输入学生的年龄:\n");
FLAG1:
    if(scanf ("%d",&p->stu.old)==0)
    {
        while(getchar()!='\n');
        color(4);
        printf("输入错误!\n请重新输入:");
        color(7);
        goto FLAG1;
    }
    p->stu.grade.computer=-1;
    p->stu.grade.English=-1;
    p->stu.grade.math=-1;
    p->stu.grade.PE=-1;
    p->stu.total=p->stu.grade.English+p->stu.grade.math+p->stu.grade.PE+p->stu.grade.computer;
    p->stu.average=p->stu.total/4.0;
    strcpy(p->stu.key,p->stu.student_number);
    char leave[100]="你的老师还没有给你留言!";
    strcpy(p->stu.leave_massage,leave);
    return head;
}
void display(struct link *head )//该函数用于检测链表内部数据;
{
    struct link *p=head;
    while (p)
    {
        printf("输出:\n");
        printf("%s\n",p->stu.student_number);
        p=p->next;
    }
}
void record_grade(struct link *head)
{
    struct link *p=head;
    int t=1;
    while (t)
    {
        p=head;
        system("cls");
        if(head==NULL)
        {
            printf("当前学生人数为0!\n");
            t=0;
        }
        else
        {
            char num[20];
            int m,k=1;
            while (k)
            {
                printf("录入成绩请按1/结束录入请按0!\n");
                k=scanf ("%d",&m);
                if (k=0||(m!=1&&m!=0))
                {
                    printf("输入错误!\n");
                    while(getchar()!='\n');
                }
                else
                    k=0;
            }
            if (m==0)
            {
                break;
            }
            record_grade_yemiansheji();
            printf("请输入学生的学号:");
            scanf("%s",&num);
            while (strcmp(p->stu.student_number,num)!=0&&p->next!=NULL)
            {
                p=p->next;
            }
            //system("pause");
            if(strcmp(p->stu.student_number,num)==0)
            {
flag:
                system("cls");
                record_grade_yemiansheji();
                printf("请输入操作序号:\n");
                int grade;
                char ch =_getch();
                switch (ch)
                {
                case '1':
                    printf("\n请输入%s的英语成绩:",p->stu.name);
FLAG2:
                    if(scanf ("%d",&grade)==0||grade>100||grade<0)
                    {
                        color(4);
                        printf("输入错误!!!\n");
                        color(7);
                        printf("请重新输入:");
                        while(getchar()!='\n');
                        goto FLAG2;

                    }
                    while(getchar()!='\n');
                    p->stu.grade.English=grade;
                    break;
                case '2':
                    printf("\n请输入%s的C语言成绩:",p->stu.name);
FLAG3:
                    if(scanf ("%d",&grade)==0||grade>100||grade<0)
                    {
                        color(4);
                        printf("输入错误!!!\n");
                        color(7);
                        printf("请重新输入:");
                        while(getchar()!='\n');
                        goto FLAG3;
                    }
                    while(getchar()!='\n');
                    p->stu.grade.computer=grade;
                    break;
                case '3':
                    printf("\n请输入%s的数学成绩:",p->stu.name);
FLAG4:
                    if(scanf ("%d",&grade)==0||grade>100||grade<0)
                    {
                        color(4);
                        printf("输入错误!!!\n");
                        color(7);
                        printf("请重新输入:");
                        while(getchar()!='\n');
                        goto FLAG4;
                    }
                    while(getchar()!='\n');
                    p->stu.grade.math=grade;
                    break;
                case '4':
                    printf("\n请输入%s的体育成绩:",p->stu.name);
FLAG5:
                    if(scanf ("%d",&grade)==0||grade>100||grade<0)
                    {
                        color(4);
                        printf("输入错误!!!\n");
                        color(7);
                        printf("请重新输入:");
                        while(getchar()!='\n');
                        goto FLAG5;
                    }
                    while(getchar()!='\n');
                    p->stu.grade.PE=grade;
                    break;
                default :
                    t=0;
                    break;
                }
                char a[2];
                printf("是否继续录入%s的成绩?(是/否)",p->stu.name);
                scanf ("%s",a);
                if (strcmp("是\0",a)==0)
                {
                    goto flag;
                }
                p->stu.total=p->stu.grade.English+p->stu.grade.math+p->stu.grade.PE+p->stu.grade.computer;
                p->stu.average=p->stu.total/4.0;
            }
            else
            {
                printf("未找到该学生!\n");
            }
        }
        //printf("hhhhh");
        system("pause");
        system("cls");
    }
}
int tuichu(int t)
{
    int h;//控制是否确认退出
flag3:
    printf("即将退出,确认请按1,取消请按0\n");
    scanf("%d",&h);
    if (h!=0&&h!=1)
    {
        printf("输入错误,请重新输入!!\n");
        goto flag3;
    }
    if(h==1)
    {
        t=0;
        color(11);
        printf("成功退出,感谢您的使用!\n");
    }
    if(h==0)
    {
        color(14);
        printf("退出已经取消!\n");
        system("pause");
    }
    return t;
}
void record_grade_yemiansheji()
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 191);
    printf("$*$#############################################################$*$\n");
    printf("$*$选择你要录入或修改的成绩(输入选项前的序号)                 $*$\n");
    printf("$*$#############################################################$*$\n");
    printf("$*$1.英语                                                       $*$\n");
    printf("$*$2.C语言                                                      $*$\n");
    printf("$*$3.数学                                                       $*$\n");
    printf("$*$4.体育                                                       $*$\n");
    printf("$*$5.退出                                                       $*$\n");
    printf("$*$#############################################################$*$\n");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
void print_information(struct link *head)
{
    struct link *p=head;
    if (head==NULL)
    {
        printf("录入了0个学生!!!");
        return ;
    }
    else
    {
        find_unrecord_grade(head);
        printf("请确认每位学生都已经录入了正确成绩,否则会影响成绩的打印!\n");
        printf("返回修改成绩请按1,按任意键可继续操作!\n");
        char ch=_getch();
        if (ch=='1')
        {
            printf("已返回,请去录入他们的成绩!\n");
            return;
        }
        int i=1;
        color(10);
        printf("$*$############################################################################################################$*$\n");
        printf("$*$ 序号  学号\t\t姓名\t年龄\t性别\t英语\t数学\tC语言\t体育\t总分\t各科平均分$*$\n");
        do
        {
            printf("$*$ %d\t%s\t%s\t%d\t%s\t%d\t%d\t%d\t%d\t%d\t%lf$*$\n",i,p->stu.student_number,p->stu.name,p->stu.old,p->stu.sex,p->stu.grade.English,p->stu.grade.math,p->stu.grade.computer,p->stu.grade.PE,p->stu.total,p->stu.average);
            i++;
            p=p->next;
        }
        while(p!=NULL);
        printf("$*$############################################################################################################$*$\n");
        color(7);
    }

}
void grade_record(struct link *head)
{
    int a=0;
    struct link *p=head;
    int t=1;
    while (t)
    {

        system("cls");
        if(head==NULL)
        {
            printf("当前学生人数为0!\n");
            t=0;
        }
        else
        {
            char num[20];
            int m,k=1;
            while (k)
            {
                printf("录入成绩请按1/结束录入请按0!\n");
                k=scanf ("%d",&m);
                if (k=0||(m!=1&&m!=0))
                {
                    printf("输入错误!\n");
                }
                else
                    k=0;
            }
            if (m==0)
            {
                break;
            }
            printf("请输入学生的学号:");
            scanf("%s",&num);
            p=head;
            while (strcmp(p->stu.student_number,num)!=0&&p->next!=NULL)
            {
                p=p->next;
            }
            if(strcmp(p->stu.student_number,num)==0)
            {
                system("cls");
                printf("请输入该学生各科成绩\n");
                printf("英语 数学 体育 C语言 \n");
FLAG6:
                a=scanf("%d%d%d%d",&p->stu.grade.English,&p->stu.grade.math,&p->stu.grade.PE,&p->stu.grade.computer);
                if(a!=4)
                {
                    color(4);
                    printf("输入错误!!!\n");
                    color(7);
                    printf("请重新输入:");
                    while(getchar()!='\n');
                    goto FLAG6;
                }
                while(getchar()!='\n');
                p->stu.total=p->stu.grade.English+p->stu.grade.math+p->stu.grade.PE+p->stu.grade.computer;
                p->stu.average=p->stu.total/4.0;
            }
            else
            {
                printf("未找到该学生!\n");
            }
        }
        system("pause");
        system("cls");
    }
}
int Count (struct link *head)//计算已录入学生的人数;
{
    struct link *p=head;
    int c=0;
    while (p)
    {
        c++;
        p=p->next;
    }
    return c;
}
void find_stu(void)
{
    int t=1;
    system("cls");
    color(54);
    printf("$*$###########################################$*$\n");
    printf("$*$  1,按学号查找    ##    2,按姓名查找      $*$\n");
    printf("$*$-------------------------------------------$*$\n");
    printf("$*$            按其他键退出查找功能           $*$\n");
    printf("$*$###########################################$*$\n");
    color(7);
    do
    {
        printf("请输入你要执行的操作:\n");
        char ch=_getch();
        switch (ch)
        {
        case '1':
            find_stu_by_num(head);
            break;
        case '2':
            find_stu_by_name(head);
            break;
        default:
            t=0;
            printf("退出成功!\n");
            break;
        }
    }
    while(t);
}
void find_stu_by_num (struct link *head )
{
    if (head==NULL)
    {
        printf("当前记录了0个学生!\n");
        return;
    }
    char num[20];
    printf("请输入您要查找学生的学号:");
    scanf("%s",num);
    //printf("           %s\n        ",num);
    struct link * p=head;
    while (strcmp(p->stu.student_number,num)!=0&&p->next!=NULL)
    {
        p=p->next;
    }
    if (strcmp(p->stu.student_number,num)==0)
    {
        printf("$*$ 学号\t姓名\t年龄\t性别\t英语\t数学\tC语言\t体育\t总分\t各科平均分$*$\n");
        printf("$*$ %s\t%s\t%d\t%s\t%d\t%d\t%d\t%d\t%d\t%lf$*$\n",p->stu.student_number,p->stu.name,p->stu.old,p->stu.sex,p->stu.grade.English,p->stu.grade.math,p->stu.grade.math,p->stu.grade.PE,p->stu.total,p->stu.average);
    }
    else
    {
        printf("未找到该学生,请您重新查询!\n");
    }
}
void find_stu_by_name (struct link * head)
{
    int k=0;
    if (head==NULL)
    {
        printf("当前记录了0个学生!\n");
        return;
    }
    char name[20];
    printf("请输入您要查找学生的姓名:");
    scanf("%s",name);
    struct link *p=head,pr[M];
    while (p!=NULL)
    {
        if (strcmp(p->stu.name,name)==0)
        {
            color(11);
            printf("$*$ 学号\t姓名\t年龄\t性别\t英语\t数学\tC语言\t体育\t总分\t各科平均分$*$\n");
            printf("$*$ %s\t%s\t%d\t%s\t%d\t%d\t%d\t%d\t%d\t%lf$*$\n",p->stu.student_number,p->stu.name,p->stu.old,p->stu.sex,p->stu.grade.English,p->stu.grade.math,p->stu.grade.math,p->stu.grade.PE,p->stu.total,p->stu.average);
            color(7);
            k=1;
        }
        p=p->next;
    }
    if (k==0)
    {
        color(4);
        printf("未找到该学生,请您重新查询!\n");
        color(7);
    }
}
void change(struct link * head)
{
    int a[5]= {0};
    if (head==NULL)
    {
        printf("当前记录了0个学生!\n");
        return;
    }
    char name[20];
    printf("请输入您要查找学生的学号:");
    scanf("%s",name);
    struct link *p=head;
    while (strcmp(p->stu.student_number,name)!=0&&p->next!=NULL)
    {
        p=p->next;
    }
    if (strcmp(p->stu.student_number,name)==0)
    {
        printf("请输入%s新的姓名:\n",p->stu.name);
        scanf("%s",p->stu.name);
        strcpy(p->stu.key,p->stu.student_number);
        printf("请输入%s新的学号:\n",p->stu.name);
        scanf("%s",p->stu.student_number);

        while(a[0]==0)
        {
            while(getchar()!='\n');
            printf("请输入%s新的年龄:\n",p->stu.name);
            a[0]=scanf("%d",&p->stu.old);
        }
        while(getchar()!='\n');
        printf("请输入%s新的性别:\n",p->stu.name);
        char sex[2];
again:
        scanf("%s",sex);
        if(strcmp("男\0",sex)==0)
        {
            strcpy(p->stu.sex,sex);
        }
        else if(strcmp("女\0",sex)==0)
        {
            strcpy(p->stu.sex,sex);
        }
        else
        {
            color(4);
            printf("输入错误!!!\n");
            color(7);
            printf("请重新输入:");
            goto again;
        }
        while(a[1]==0)
        {
            while(getchar()!='\n');
            printf("请输入%s新的英语成绩:\n",p->stu.name);
            a[1]=scanf("%d",&p->stu.grade.English);
        }

        while(a[2]==0)
        {
            while(getchar()!='\n');
            printf("请输入%s新的数学成绩:\n",p->stu.name);
            a[2]=scanf("%d",&p->stu.grade.math);
        }

        while(a[3]==0)
        {
            while(getchar()!='\n');
            printf("请输入%s新的C语言成绩:\n",p->stu.name);
            a[3]=scanf("%d",&p->stu.grade.computer);
        }

        while(a[4]==0)
        {
            while(getchar()!='\n');
            printf("请输入%s新的体育成绩:\n",p->stu.name);
            a[4]=scanf("%d",&p->stu.grade.PE);
        }

        printf("学生信息修改完毕,系统将自动更改他的总分和平均成绩!\n");
        p->stu.total=p->stu.grade.computer+p->stu.grade.English+p->stu.grade.math+p->stu.grade.PE;
        p->stu.average=p->stu.total/4.0;
    }
    else
    {
        printf("未找到该学生,请您重新输入他的姓名!\n");
    }
}
struct link *delete_stu(struct link *head)
{
    if (head==NULL)
    {
        printf("当前录入了0个学生!\n");
        return;
    }
    char name[20];
    printf("请输入要删除学生的学号:\n");
    scanf("%s",name);
    struct link *p=head,*pr=head;

    while(strcmp(p->stu.student_number,name)!=0&&p->next!=NULL)
    {
        pr=p;
        p=p->next;
    }
    if(strcmp(p->stu.student_number,name)==0)
    {
        if (p==head)
        {
            head=p->next;
            free(p);
        }
        else
        {
            pr->next=p->next;
            free(p);
        }
        printf("已经成功删除该学生!\n");
    }
    else
    {
        printf("未找到该学生!\n");
    }
    return head;
}
void find_unrecord_grade(struct link * head)
{
    int lm=1;
    if(head==NULL)
    {
        color(4);
        printf("当前录入了0个学生!");
        return ;
    }
    struct link *p=head;
    int grade=-1;
    while(p!=NULL)
    {
        if (p->stu.grade.computer==-1||p->stu.grade.English==-1||p->stu.grade.math==-1||p->stu.grade.PE==-1)
        {
            color(4);
            printf("有学生的成绩没有被录入,请您录入他们的成绩!\n");
            lm=0;
            break;
        }
        p=p->next;
    }
    if(lm==0)
    {
        while(p!=NULL)
        {
            if (p->stu.grade.computer==-1)
            {
                printf("\n请输入%s的C语言成绩:",p->stu.name);
                scanf ("%d",&grade);
                p->stu.grade.computer=grade;
            }
            if(p->stu.grade.English==-1)
            {
                printf("\n请输入%s的英语成绩:",p->stu.name);
                scanf ("%d",&grade);
                p->stu.grade.English=grade;
            }
            if(p->stu.grade.math==-1)
            {
                printf("\n请输入%s的数学成绩:",p->stu.name);
                scanf("%d",&grade);
                p->stu.grade.math=grade;
            }
            if(p->stu.grade.PE==-1)
            {
                printf("\n请输入%s的体育成绩:",p->stu.name);
                scanf("%d",&grade);
                p->stu.grade.PE=grade;
            }
            p->stu.total=p->stu.grade.English+p->stu.grade.math+p->stu.grade.PE+p->stu.grade.computer;
            p->stu.average=p->stu.total/4.0;
            p=p->next;
        }
    }
    printf("所有学生的成绩已经全部录入!\n");

}
void saveStu()
{
    FILE *fp=fopen("Stu.txt", "w");  // 定义一个文件指针;
    if (fp == NULL)
    {
        printf("打开文件失败.\n");
        return;
    }
    struct link * p = head;
    for (p; p != NULL; p = p->next)
    {
        fwrite(&p->stu, sizeof(Student), 1, fp); // 将要保存的信息写入到指定文件中;
    }
    fclose(fp); // 关闭文件;
    printf("信息保存成功!\n");
}
void readStu()
{
    FILE* fp = fopen("Stu.txt", "r");
    if (fp == NULL)
    {
        printf("\n打开文件失败\n");
        return;
    }
    Student stu;
    while (fread(&stu, sizeof(Student), 1, fp)) // 遍历链表,使用文件读操作,将学生信息从文件中输出
    {
        struct link * pnew = (struct link *)malloc(sizeof(struct link));
        pnew->next = NULL;
        memcpy(pnew, &stu, sizeof(Student));
        if (head == NULL)
        {
            head = pnew;
        }
        else
        {
            pnew->next = head;
            head = pnew;
        }
    }
    fclose(fp);
    color(10);
    printf("加载数据成功!\n");
}
void information_exchange(struct link * p)
{
    struct link *temp=NULL;
    temp=(struct link *)malloc(sizeof (struct link ));
    if (temp==NULL)
    {
        printf ("No memory !");
        exit (0);
    }
    temp->stu=p->stu;
    p->stu=p->next->stu;
    p->next->stu=temp->stu;
}
void sort_by_average (struct link * head)
{
    struct link * p=head,*pr=head;
    for (p=head; p->next!=NULL; p=p->next)
    {
        for (pr=head; pr->next!=NULL; pr=pr->next)
        {
            if (pr->stu.average<pr->next->stu.average)
            {
                information_exchange(pr);
            }
        }
    }
}
void sort_by_total(struct link * head)
{
    struct link * p=head,*pr=head;
    for (p=head; p->next!=NULL; p=p->next)
    {
        for (pr=head; pr->next!=NULL; pr=pr->next)
        {
            if (pr->stu.total<pr->next->stu.total)
            {
                information_exchange(pr);
            }
        }
    }
}
void sort_yemiansheji()
{
    system("cls");
    if(head==NULL)
    {
        color(4);
        printf("当前录入了0个学生,无法排序!\n");
        return ;
    }
    if(Count(head)==1)
    {
        color(4);
        printf("当前录入的学生小于2个!\n");
    }
    color(11);
    printf("##########################################\n");
    printf("#         1,按平均分排序                 #\n");
    printf("#         2,按总分排序                   #\n");
    printf("#         3,按数学成绩排序               #\n");
    printf("#         4,按英语成绩排序               #\n");
    printf("#         5,按C语言成绩排序              #\n");
    printf("#         6,按体育成绩排序               #\n");
    printf("##########################################\n");
    color(7);
    char ch=_getch();
    switch(ch)
    {
    case '1':
        sort_by_average(head);
        color(11);
        printf("排序成功!");
        system("pause");
        break;
    case '2':
        sort_by_total(head);
        color(11);
        printf("排序成功!");
        system("pause");
        break;
    case '3':
        sort_by_math(head);
        color(11);
        printf("排序成功!");
        system("pause");
        break;
    case '4':
        sort_by_Eglish(head);
        color(11);
        printf("排序成功!");
        system("pause");
        break;
    case '5':
        sort_by_computer(head);
        color(11);
        printf("排序成功!");
        system("pause");
        break;
    case '6':
        sort_by_PE(head);
        color(11);
        printf("排序成功!");
        system("pause");
        break;
    default:
        color(4);
        printf("输入错误!");
        system("pause");
    }
}
void sort_by_Eglish(struct link * head)
{
    struct link * p=head,*pr=head;
    for (p=head; p->next!=NULL; p=p->next)
    {
        for (pr=head; pr->next!=NULL; pr=pr->next)
        {
            if (pr->stu.grade.English<pr->next->stu.grade.English)
            {
                information_exchange(pr);
            }
        }
    }
}
void sort_by_math(struct link * head)
{
    struct link * p=head,*pr=head;
    for (p=head; p->next!=NULL; p=p->next)
    {
        for (pr=head; pr->next!=NULL; pr=pr->next)
        {
            if (pr->stu.grade.math<pr->next->stu.grade.math)
            {
                information_exchange(pr);
            }
        }
    }
}
void sort_by_PE(struct link * head)
{
    struct link * p=head,*pr=head;
    for (p=head; p->next!=NULL; p=p->next)
    {
        for (pr=head; pr->next!=NULL; pr=pr->next)
        {
            if (pr->stu.grade.PE<pr->next->stu.grade.PE)
            {
                information_exchange(pr);
            }
        }
    }
}
void sort_by_computer(struct link * head)
{
    struct link * p=head,*pr=head;
    for (p=head; p->next!=NULL; p=p->next)
    {
        for (pr=head; pr->next!=NULL; pr=pr->next)
        {
            if (pr->stu.grade.computer<pr->next->stu.grade.computer)
            {
                information_exchange(pr);
            }
        }
    }
}
void statistical_analysis(struct link * head)
{
    system("cls");
    if (head==NULL)
    {
        printf("录入了0个学生!!!");
        return ;
    }

    //   不及格   及格    中等      优秀
    int k=Count(head);
    int English[k],computer[k],PE[k],math[k],total[k],average[k];
    color(60);
    printf("按照分数分为以下等级:                                        \n");
    printf("及格(<60分),及格(60-70分),中等(70-80分),优秀(>80分)\n");
    color(7);
    copy_to_arry(head,English,computer,PE,math,total,average);
    printf("\n");
    printf("-------------------------------------\n");
    printf("-------------------------------------\n");
    color(3);
    printf("英语成绩\n");
    color(7);
    count_sorted_stu(English);
    printf("\n");
    printf("-------------------------------------\n");
    printf("-------------------------------------\n");
    color(4);
    printf("数学成绩\n");
    color(7);
    count_sorted_stu(math);
    printf("\n");
    printf("-------------------------------------\n");
    printf("-------------------------------------\n");
    color(5);
    printf("C语言成绩\n");
    color(7);
    count_sorted_stu(computer);
    printf("\n");
    printf("-------------------------------------\n");
    printf("-------------------------------------\n");
    color(6);
    printf("体育成绩\n");
    color(7);
    count_sorted_stu(PE);
    printf("\n");
    printf("-------------------------------------\n");
    printf("-------------------------------------\n");
    color(9);
    printf("平均分\n");
    color(7);
    count_sorted_stu(average);
    printf("\n");
    printf("-------------------------------------\n");
    printf("-------------------------------------\n");
}
void count_sorted_stu(int score[])
{
    int k=Count(head),i;
    double sum=0;
    int a=0,b=0,c=0,d=0;//   不及格   及格    中等      优秀
    double min=score[0],max=score[0];
    for(i=0; i<k; i++)
    {
        if(score[i]<60)
            a++;
        else if(score[i]>=60&&score[i]<70)
            b++;
        else if(score[i]>=70&&score[i]<80)
            c++;
        else if(score[i]>=80)
            d++;
        if(score[i]>max)
            max=score[i];
        if(score[i]<min)
            min=score[i];
        sum+=score[i];
    }
    printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
    printf("┃总人数为---------------%人  ┃\n",k);
    printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
    printf("┃等级为不及格的人数有:   %d ┃\n",a);
    printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
    printf("┃等级为及格的人数有:     %d ┃\n",b);
    printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
    printf("┃等级为中等的人数有:     %d ┃\n",c);
    printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
    printf("┃等级为优秀的人数有:     %d ┃\n",d);
    printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
    printf("┃最高分为:%6.2lf 分!      ┃\n",max);
    printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
    printf("┃最低分为:%2.2lf 分!       ┃\n",min);
    printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
    printf("┃该科目平均分为:%.2lf 分! ┃\n",(double)sum/k);
    printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
    printf("┃及格率为-----%.2lf%%        ┃\n",((b+c+d)/(k*1.0))*100);
    printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
    color(14);
    printf("条形统计图 \n");
    color(7);
    printf("                        \n");
    print_conclum_diagram(a,b,c,d);
}
void copy_to_arry(struct link *head,int English[],int computer[],int PE[],int math[],int total[],int average[])
{
    struct link *p=head;
    int k=Count(head),i=0;
    while(p)
    {
        English[i]=p->stu.grade.English;
        computer[i]=p->stu.grade.computer;
        PE[i]=p->stu.grade.PE;
        math[i]=p->stu.grade.math;
        total[i]=p->stu.total;
        average[i]=p->stu.average;
        p=p->next;
        i++;
    }
}
void print_conclum_diagram(int a,int b,int c,int d)
{
    int rank[4]= {a,b,c,d},max=rank[0],i,j,k=70;
    for(i=0; i<4; i++)
    {
        if(rank[i]>max)
            max=rank[i];
    }
    color(15);
    printf("      y↑\n");
    color(7);
    for(i=max+1; i>=0; i--)
    {
        color(15);
        printf("%8d|_ ",i);
        color(7);
        for(j=0; j<4; j++)
        {
            if(i==rank[j])
            {
                color(15);
                printf("  %d    ",rank[j]);
                color(7);
            }
            else if(i<=rank[j]-1)
            {
                printf(" ");
                color(k);
                printf("   ");
                color(7);
                printf("   ");
            }
            else
            {
                printf("       ");
            }
            k=k+16;
        }
        printf("  ");
        printf("\n");
        k=70;
    }
    color(15);
    printf("          ");
    color(4);
    printf(" 不及格  ");
    color(14);
    printf("及格  ");
    color(3);
    printf("中等    ");
    color(10);
    printf("优秀  ");
    color(7);
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值