学生成绩管理系统

目录

1.需求分析... 1

1.1问题描述... 1

1.2 基本要求... 1

1.3 成员分工... 2

2.概要设计... 3

2.1 数据结构... 3

2.2 程序模块... 3

2.3 各模块之间的调用关系及算法设计... 4

2.3.1 存储结构... 4

2.3.2 程序流程图... 5

3.详细设计... 5

3.1 主要函数的调用关系... 5

3.2 各模块的算法... 7

4.编码调试... 7

4.1界面分析... 7

4.2运行分析... 8

5.总结... 9

参考文献... 11

附录:(源代码)... 12


学生成绩管理系统

1.需求分析

1.1问题描述

学生信息链表实现需要完成创建学生信息链表、在文件读写信息、对学生信息链表的添加、删除、修改、选择出补考成绩存入文件、按总绩降序排序、按姓名学号查找、选择出平均值、最大值、最小值、计算各科成绩所占的比例。

课题要求:

现有学生成绩信息文件1(1.txt),内容如下:

姓名    学号   语文  数学   英语    

张明明  01     67     78      82

李成友  02     78     91      88

张辉灿  03     68     82      56

王露    04     56     45      77

陈东明  05     67     38      47

…… ……

学生成绩信息文件2(2.txt),内容如下:

姓名    学号   语文  数学   英语    

陈果     31     57     68      82

李华明  32     88     90      68

张明东  33     48     42      56

李明国  34     50     45      87

陈道亮  35     47     58      77

…… ……

1.2 基本要求

试编写一个管理系统,要求如下:

1) 要求使用链表或数组等实现上述要求

2) 实现对两个文件数据进行合并,生成新文件3.txt

3) 可实现学生成绩信息的输入、修改、删除功能

4) 抽取出三科成绩中有补考的学生并保存在一个新文件4.txt

5) 对合并后的文件3.txt中的数据按总分降序排序(至少采用两种排序方法实现)

6)输入一个学生姓名后,能查找到此学生的信息并输出结果(至少采用两种查找方法实现)

7)统计输出各门课程的平均分,最高分、最低分

8)统计各门课程优秀、良好、中等、及格、不及格的人数及百分比

1.3 成员分工

小组成员:马聪(组长)马欢欢 马金莹

小组共同实现功能界面操作模块。

马欢欢:实现的功能模块

       1)创建写入文件,读取文件;

       2)创建学生信息链表并用文件保存;

       3)将两文件中的信息合并,并放入第三个文件;

       4)链表的显示函数。

马金莹:实现的功能模块

       1)实现学生成绩信息的输入、修改、删除功能;

       2)抽取出三科成绩中有补考的学生并保存在一个新文件;

       3)统计输出各门课程的平均分,最高分、最低分。

马  聪:实现的功能模块

       1)对合并后的文件中的数据按总分降序排序(1冒泡排序法 2 选择排序法);

       2)输入一个学生姓名后,能查找到此学生的信息并输出结果

          (1按姓名用顺序查找法2按学号用折半查找法);

       3)统计各门课程优秀、良好、中等、及格、不及格的人数及百分比。

       4)编写验证码程序。

2.概要设计 

2.1 数据结构

本程序使用单链表的结构来存储各条学生信息。

2.2 程序模块

分析:系统要实现许多功能,因此遵循结构化程序设计思想来进行本系统的设计:

自顶向下逐步细化,将系统设计任务分解出许多子功能模块来设计;

第一个模块——主函数main()的功能是:调用各函数完成相应的功能。

第二个模块——Readfile()的功能是:文件的读取。

第三个模块——Writefile()的功能是:文件的存储。

第四个模块——Creatlist()的功能是:向文件中写入信息。

第五个模块——Add()的功能是:添加学生信息。

第六个模块——Delete()的功能是:删除学生信息。

第七个模块——Update()的功能是:清空所有文件。

第八个模块——Order()的功能是:排序。

第九个模块——Show()的功能是:结果的输出。

第十个模块——Union()的功能是:文件的联合。

第十一个模块——Makeupexam()的功能是:选择出不考的学生信息放入文件中。

第十二个模块——AvgMaxMin()的功能是: 显示学生平均成绩、最大成绩、最小成绩。

第十三个模块——Total()的功能是:成绩的统计计算比例。

第十四个模块——PassWord()的功能是:进入成绩输入验证码。

第十五个模块——Function()的功能是:函数的链接调用。

第十六个模块——printf()的功能是:菜单的显示。

除主函数外,其他函数都通过一系列function函数连接。

2.3 各模块之间的调用关系及算法设计

2.3.1 存储结构

typedef struct

{

       char Name[100];

       char ID[4];

       int  Chinese;

       int  Math;

       int  English;

}Stu;

typedef struct Stud

{

       Stu student;

       struct Stud *next;

}Stud,*StudList;

2.3.2 程序流程图

3.详细设计

3.1 主要函数的调用关系

void Function()

{

       printf1();

       int n;

       scanf("%d",&n);

       if(n<0||n>8)

       {

              printf("\t\t\t信息错误!请重新输入:");

              scanf("%d",&n);

       }    

       system("cls");

       switch(n)

       {

       case 1:  

              Creatlist();

              Creatlist();

              printf("\n\n\n\n\t\t\t\t文件创建成功!!!");

              printf("\n\n\t\t\t\t按任意键以继续...");

              getch();

              system("cls");

              Function();

              break;

       case 2:

              printf("1.txt与2.txt合并放入3.txt\n");

              Union();

              Function();

              break;

       case 3:function1();break;

       case 4:Makeupexam();Function();break;

       case 5:function2();break;

       case 6:function3();break;

       case 7:AvgMaxMin();system("cls");Function();break;

    case 8:Total();Function();break;

    case 0:PassWord();system("cls");Function();break;

       }    

}

3.2 各模块的算法

各模块的功能实现,主要代码见源代码。

4.编码调试

4.1界面分析

进入界面,请输入密码2012:

验证码正确进入主界面:

对学生信息进行修改界面:

对学生信息进行排序界面:

查找学生信息界面:

4.2运行分析

进行操作输入相应的操作代码,如果输入操作代码超出范围就会显示错误信息

1、输入密码错误显示:

2、输入超出边界显示

3、显示合并文件

5.总结

在持续两周的实验中,我们组三人一起共同努力,完成了学生成绩管理系统的创建,在实验中每个人有自己的工作,都积极参与到设计中。

马金莹的总结:

在本次实验中,我的任务是实现学生成绩信息的添加、删除、修改功能;抽取出三科成绩中有补考的学生并保存在一个新文件4.txt;统计输出各门课程的平均分,最高分、最低分。

在添加过程中,需要先读取文件3.txt中的内容,生成Studlist类型的指针p遍历整个链表到末尾,用尾插法添加学生信息。修改模块在遍历链表的同时找出与需要修改学生姓名相同的结点,进行信息修改,若找不到则输出该生不存在,指针继续后移进行遍历。在写删除模块时,起初是用一个Studlist类型的指针P遍历链表,在while循环中用p->next->name与要删除的name比较,相等的话跳出循环(不等指针p后移),然后StudList q;q=p->next;

p->next = q->next;free(q);这样可以正确的删除信息,但是当!P判断学生不存在时,出现错误,p->next指向未知区域,总是出错。所以改为两个指针 p指向l->next,q指向l,如果p->student.name与要删除的name相等,跳出循环,不等p,q指针都后移。在求平均成绩时,遍历链表求出结点个数与各科总成绩,相除得到平均成绩。不足之处:各科都要单独求出,程序重复累赘。写程序需要缜密的思考以及细心,否则会带来许多本可以避免的麻烦。而且通过这次实验,还学到了一些系统函数以及控制程序执行的小函数比如getch()等。

马欢欢的总结:

这次课程设计使我对链表的创建更加深了印象,在此次试验中我熟练掌握了Vc6.0编辑器的使用,对文件创建有了深刻的认识。我在实验中的任务是实现创建链表并保存到指定的文件中,还可以实现合并两个文件并保存到另外一个指定的文件中。比如:我用writefile()函数来写文件,在该函数中用feopen以“写”的方式来打开文件,具体的向文件写数据则借助fscanf()函数来实现;用Readfile()函数来读文件,在该函数中用feopen以“读”的方式打开文件,具体的读文件则借助fprintf()函数来实现;用Union()函数,通过尾插法来实现文件的合并;用Show(n)含函数能把文件n中数据显示到显示屏上;通过上面几个函数的应用使文件能够自动生成和显示,从而文件应用的时候更加完整 。在创建链表时我用了 Creatlist()函数来实现,在该函数中通过输入一个“姓名”于“*”不等来实现程序的自动化循环控制,通过*来结束程序的循环控制,然后通过调用writefile(L,n)函数来把创建好的链表保存到文件n中从而实现了创建链表并保存,以便下次操作时可以直接调用不用再新建链表。

马聪的总结:

此次课程设计我在小组中担当组长的重任需要很好的和小组成员之间进行交流、分配任务。我在实验中所做的任务是编写降序排序程序、查询学生信息、统计学生信息各科成绩等级比例。在实验中我遇到了很多问题,在编写排序程序时还是相当顺利的,用了冒泡排序和选择排序,在显示的时候出现问题,直接调用Show()函数出现错误,显示结果是文件3.txt中的内容,并没有进行排序,又重新编写了输出才显现结果。在编写查询程序时,用了顺序查找和折半查找,在折半查找中没办法用姓名查找所以改用学号查找,在查找时不知道怎么判断查找不成功时的情况,最后改为if(low=high&&strcmp(q->student.ID,id)!=0)才编写成功,虽然改变了题意但是完成了查找的任务也学会了使用折半查找。在total()函数中,本来想着用数组存储课程信息,但是在调用不对,最后改为最简单的编写方式。在Fanction()函数时为了实现返回上一层的功能,进行了多次的重复调用,总是达不到预期的效果,就突然想起了用递归调用,达到了预期效果。在实验中也许程序连接编译没错,可能逻辑错误,所以调试很重要,这次课程设计给我的总体感觉是不仅在实验中对链表的操作学习进行了更深刻的了解,而且更加加强了同学之间的相互交流合作能力。

参考文献

 [1]严蔚敏 吴伟民.数据结构(C语言版).清华大学出版社,1997年4月,第一版,P18-27、P216-288。

[2]谭浩强.C程序设计(第三版).清华大学出版社,20##年7月,第三版,P330-348。

附录:(源代码)

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<conio.h>

#include<windows.h>

typedef struct

{

       char Name[100];

       char ID[4];

       int  Chinese;

       int  Math;

       int  English;

}Stu;

typedef struct Stud

{

       Stu student;

       struct Stud *next;

}Stud,*StudList;

//写文件

void Writefile(StudList L, int n)

{

       FILE *fp;

    switch(n)

       {

       case 1:

              fp=fopen("1.txt","w");break;

       case 2:

              fp=fopen("2.txt","w");break;

       case 3:

              fp=fopen("3.txt","w");break;

       case 4:

              fp=fopen("4.txt","w");break;

       }

       StudList p;

    p=L->next;

       while(p)

       {

              fprintf(fp,"%8s%4s%8d%8d%8d\n",p->student.Name,p->student.ID,p->student.Chinese,p->student.Math,p->student.English);

              p=p->next;

       }

       fclose(fp);    

}

//读文件

void Readfile(StudList &L,int n)

{

    FILE *fp;

    if(n==1)

       {

              if ((fp=fopen("1.txt","r"))==NULL)

              {

                     printf("打不开文件\n");

                     exit(0);

              }

       }

    if(n==2)

       {

              if ((fp=fopen("2.txt","r"))==NULL)

              {

                     printf("打不开文件\n");

                     exit(0);

              }

       }

    if (n==3)

       { if ((fp=fopen("3.txt","r"))==NULL)

          {

              printf("打不开文件\n");

              exit(0);

          }

       }

       if(n==4)

       {

              if ((fp=fopen("4.txt","r"))==NULL)

              {

                     printf("打不开文件\n");

                     exit(0);

              }

       }

       StudList q=L;

       while(!feof(fp))

       {

              StudList p=(StudList)malloc(sizeof(Stud));

                int n=fscanf(fp,"%8s%6s%8d%8d%8d",p->student.Name,p->student.ID,&p->student.Chinese,&p->student.Math,&p->student.English);

                 if(n<0)

                     break;

              p->next=NULL;

              q->next=p;

              q=p;

       }

       fclose(fp);

}

//创建学生信息链表

void Creatlist()

{

       char filename[20];

       printf("输入文件名:\n");

       scanf("%s",filename);

    StudList L=(StudList)malloc(sizeof(Stud));

    L->next=NULL;

       StudList p=(StudList)malloc(sizeof(Stud));

       p->next=NULL;

       printf("\n");

       printf("输入以*结束:\n");

       printf("\n");

              printf("姓名    学号 语文 数学 英语\n");

       StudList q=L;

       while(1)

       {

       

              StudList s=(StudList)malloc(sizeof(Stud));

              scanf("%s",s->student.Name);

              if(strcmp(s->student.Name,"*")!=0)

              {

                     scanf("%6s%4d%4d%4d",s->student.ID,&s->student.Chinese,&s->student.Math,&s->student.English);s->next=NULL;

                     q->next=s;

                     q=s;

              }

              else

                     break;

       }

       if(strcmp("1.txt",filename)==0)

              Writefile(L,1);

       if(strcmp("2.txt",filename)==0)

              Writefile(L,2);

}

//显示学生信息链表

void Show(int n)

{

       StudList p,L=(StudList)malloc(sizeof(Stud));

       L->next=NULL;

       Readfile(L,n);

       p=L->next;

       if(p==NULL)

       {

        printf("                -------------0>_<0~----------\n\n");

              printf("不存在学生信息!\n\n");

        printf("请输入任意键返回上一层:");

              getch();

              system("cls");

       }

       else

       {

              printf("姓名\t学号\t语文\t数学\t英语\n");

              while(p)

              {            printf("%s\t%s\t%d\t%d\t%d\n",p->student.Name,p->student.ID,p->student.Chinese,p->student.Math,p->student.English);

                     p=p->next;

              }

              printf("请输入任意键返回上一层:");

              getch();

              system("cls");

       }

}

//合并链表

void Union()

{

       StudList L=(StudList)malloc(sizeof(Stud));

       L->next=NULL;

    StudList S=(StudList)malloc(sizeof(Stud));

       S->next=NULL;

       Readfile(L,1);

       Readfile(S,2);

       StudList p,q,r,w;

       p=L->next;

       while(p)

       {

              q=S->next;

              while(q)

              {    

                     r=S;

                     if(strcmp(p->student.ID,q->student.ID)==0)

                     {

                            r->next=q->next;

                            q=q->next;

                     }

                     else

                     {

                            q=q->next;

                            r=r->next;

                     }

              }

              p=p->next;

       }

       w=L->next;

       while(w->next)

              w=w->next;

       w->next=S->next;

       Writefile(L,3);

       Show(3);

}

//插入学生信息

void Add()

{  

       StudList L=(StudList)malloc(sizeof(Stud));

    L->next=NULL;

       Readfile(L,3);

       printf("\n\n\n            添加学生信息\n\n");

       printf(" 姓名 学号 语文 数学 英语:\n\n");

       StudList n=(StudList)malloc(sizeof(Stud));

       n->next=NULL;

       scanf("%s%s%d%d%d",n->student.Name,n->student.ID,&n->student.Chinese,

              &n->student.Math,&n->student.English);

       StudList p=L;

       while(p->next)

       {

              if(strcmp(p->student.ID,n->student.ID)==0)

              {

                     printf("该学生已存在,请勿重复添加 ^ ^!\n");

                     printf("请输入任意键返回上一层:");

                     getch();

                     system("cls");

                     return;

              }

              else if(n->student.Chinese<0||n->student.English<0||n->student.Math<0||

                         n->student.Chinese>100||n->student.English>100||n->student.Math>100)

              { 

            printf("输入成绩有误 ^ ^!\n");

                     printf("请输入任意键返回上一层:");

                     getch();

                     system("cls");

                     return;

              }

              p=p->next;

            }

      

       p->next=n;

       Writefile(L,3);

       Show(3);     

}

//更新学生信息

void Update()

{

       StudList L=(StudList)malloc(sizeof(Stud));

       L->next=NULL;

       Readfile(L,3);

       printf("\n\n\n  修改学生信息\n\n");

       printf("请输入要修改学生的姓名:\n");

       char name[10];

       scanf("%s",name);

       StudList p=L->next;

       while(p)

       {

              if(strcmp(p->student.Name,name)==0)

                     break;

              p=p->next;

       }

       if(p==NULL)

       {

              printf("\n\n不存在该生..#^_^\n");

              printf("请输入任意键返回上一层:");

              getch();

              system("cls");

              return;

       }

       if(strcmp(p->student.Name,name)==0)

       {

              printf("\n\n该生原信息为:\n\n");

              printf("姓名\t学号\t语文\t数学\t英语\n");

              printf("%s\t%s\t%d\t%d\t%d\n\n\n",p->student.Name,p->student.ID,

                     p->student.Chinese,p->student.Math,p->student.English);

              printf("请输入修改后学生的信息:\n\n");

              printf("姓名\t学号\t语文\t数学\t英语\n");

              scanf("%s\t%s\t%d\t%d\t%d",p->student.Name,p->student.ID,&p->student.Chinese,

                     &p->student.Math,&p->student.English);

       }

       Writefile(L,3);

       printf("修改成功,并写入文件成功~~~~\n\n");

       Show(3);

}

//删除学生信息

void Delete()

{  

       printf("请输入要删除学生的姓名:\n");

       char name[10];

       scanf("%s",name);

       StudList L=(StudList)malloc(sizeof(Stud));

       L->next=NULL;

       Readfile(L,3);

       StudList p;

       p=L->next;

       StudList q;

       q=L;

       while(p)

       {

              if(strcmp(p->student.Name,name)==0)

                     break;

              q=p;

              p=p->next;  

       }

       if(!p)

       {

              printf("该生不存在!^ ^#\n");

              printf("请输入任意键返回上一层:");

              getch();

              system("cls");

              return;

       }

       q->next=p->next;

       free(p);

       Writefile(L,3);

    printf("删除成功~\n");

       Show(3);

}

//求学生平均成绩、最高成绩、最低成绩

void AvgMaxMin( )

{  

       StudList L=(StudList)malloc(sizeof(Stud));

       L->next=NULL;

       Readfile(L,3);

       int n=0,max1,max2,max3,min1,min2,min3;

       float sum=0,avg1,avg2,avg3;

       StudList p=L->next;

       while(p)

       {

              n++;

              p=p->next;

       }

       //--------------------语文

       StudList q=L->next;

       while(q)

       {

              sum+=q->student.Chinese;

              q=q->next;

       }

       avg1=sum/n;

       max1=0;

       q=L->next;

       while(q)

       {

              if(q->student.Chinese>max1) max1=q->student.Chinese;

              q=q->next;

       }

       min1=101;

       q=L->next;

       while(q)

       {

              if(q->student.Chinese<min1) min1=q->student.Chinese;

              q=q->next;

       }

       //--------------------数学

       q=L->next;

       while(q)

       {

              sum+=q->student.Math;

              q=q->next;

       }

       avg2=sum/n;

       max2=0;

       q=L->next;

       while(q)

       {

              if(q->student.Math>max2) max2=q->student.Math;

              q=q->next;

       }

       min2=101;

       q=L->next;

       while(q)

       {

              if(q->student.Math<min2) min2=q->student.Math;

              q=q->next;

       }

       //------------------------英语

       q=L->next;

       while(q)

       {

              sum+=q->student.English;

              q=q->next;

       }

       avg3=sum/n;

       max3=0;

       q=L->next;

       while(q)

       {

              if(q->student.English>max3) max3=q->student.English;

              q=q->next;

       }

       min3=101;

       q=L->next;

       while(q)

       {

              if(q->student.English<min3) min3=q->student.English;

              q=q->next;

       }

       printf("\n\n                      各门功课的平均成绩为:\n");

       printf("      --------------------------------------------------------\n");

       printf("                      语文     数学     英语\n");

       printf("                     %2.2f     %2.2f    %2.2f\n\n",avg1,avg2,avg3);

       printf("\n\n                      各门功课的最高成绩为:\n");

       printf("      --------------------------------------------------------\n");

       printf("                      语文     数学     英语\n");

       printf("                       %2d       %2d       %2d\n\n",max1,max2,max3);

       printf("\n\n                      各门功课的最低成绩为:\n");

       printf("      --------------------------------------------------------\n");

       printf("                      语文     数学     英语\n");

       printf("                       %2d       %2d       %2d\n\n",min1,min2,min3);

       printf("请输入任意键返回");

       getch();

}

//补考学生信息

void Makeupexam()

{  

    StudList L=(StudList)malloc(sizeof(Stud));

       L->next=NULL;

       Readfile(L,3);

       StudList p=L->next,q=L;

       while(p)

       {

              if(p->student.Chinese>60&&p->student.English>60&&p->student.Math>60)

              {    

                     q->next=p->next;

                     p=q->next;

              }

              else

              {

                     p=p->next;

                     q=q->next;

              }

       }

       Writefile(L,4);

       printf("\t   补考学生信息\n");

       Show(4);

}

//按总成绩降序排序(冒泡法、选择法)

int sum(StudList p)

{

       return(p->student.Chinese+p->student.English+p->student.Math);

}

void Order1()//冒泡排序

{

    StudList L=(StudList)malloc(sizeof(Stud));

       L->next=NULL;

       Readfile(L,3);

       StudList p1,p2;

       p1=L->next;

       int n=0;

       while(p1)

       {

              p1=p1->next;

              n++;

       }

       for(int i=0;i<n;i++)

       {

              StudList q=L->next;

              StudList p=L;

              StudList temp=q->next;

              while(temp)

              {

                     if(sum(q)>=sum(temp))

                     {

                            temp=temp->next;

                            q=q->next;

                            p=p->next;

                     }

                     else

                     {

                            p->next=temp;

                            q->next=temp->next;

                            temp->next=q;

                            temp=q->next;

                            p=p->next;

                     }

              }

       }

       p2=L->next;

       printf("按降序排序输出:\n\n");

       printf("  姓名      学号 语文 数学 英语 总成绩\n\n");

       while(p2)

       {

              printf("  %-8s %4s %4d %4d %4d %5d\n",p2->student.Name,p2->student.ID,p2->student.Chinese,p2->student.Math,p2->student.English,sum(p2));

              p2=p2->next;

       }

       printf("请输入任意键返回上一层:");

       getch();

       system("cls");

}

void Order2()//选择排序

{

       StudList L=(StudList)malloc(sizeof(Stud));

       L->next=NULL;

       Readfile(L,3);

       StudList p,q,p1;

       p=L->next;

       Stu st;

       int sum1=0,sum2=0;

       while(p)

       {

              sum1=p->student.Chinese+p->student.English+p->student.Math;

              q=p->next;

              while(q)

              {

                     sum2=q->student.Chinese+q->student.English+q->student.Math;

                     if(sum1<=sum2)

                     {

                            st=p->student;

                            p->student=q->student;

                            q->student=st;

                            q=q->next;

                            sum1=sum2;

                     }

                     else

                            q=q->next;

              }

              p=p->next;

              if(!p)

                     break;

              q=p->next;  

       }

       p1=L->next;

       printf("按降序排序输出:\n\n");

       printf("  姓名      学号 语文 数学 英语 总成绩\n\n");

       while(p1)

       {

              printf("  %-8s %4s %4d %4d %4d %5d\n",p1->student.Name,p1->student.ID,p1->student.Chinese,p1->student.Math,p1->student.English,sum(p1));

              p1=p1->next;

       }

       printf("请输入任意键返回上一层:");

       getch();

       system("cls");     

}

//按学生姓名、学号查找

void Search1()//顺序查找(学生姓名)

{

       StudList L=(StudList)malloc(sizeof(Stud));

       L->next=NULL;

       Readfile(L,3);

       printf("请输入要查找的学生姓名:");

       char name[16];

       scanf("%s",name);

       StudList p;

       p=L->next;

       while(p)

       {

              if(strcmp(p->student.Name,name)!=0)

                     p=p->next;

              else              

                     break;

       }

       if(p==NULL)

       {

              printf("此学生信息不存在!!!\n\n");

        printf("请输入任意键返回上一层:");

              getch();

              system("cls");

              return;

       }

       if(strcmp(p->student.Name,name)==0)

       {

              printf("输出该学生信息为:\n");

              printf("  姓名      学号 语文 数学 英语\n\n");

              printf("  %-8s %4s %4d %4d %4d\n\n",p->student.Name,p->student.ID,p->student.Chinese,p->student.Math,p->student.English);

       }

       printf("请输入任意键返回上一层:");

       getch();

       system("cls");

}

void search2()//折半查找(学号)

{

       StudList L=(StudList)malloc(sizeof(Stud));

       L->next=NULL;

       Readfile(L,3);

       StudList p,q;

       p=q=L->next;

       printf("请输入要查找的学生的学号:");

       char id[16];

       scanf("%s",id);

       int n=0;

       while(p)

       {

              p=p->next;

              n++;

       }

       int low,high,mid;

       low=1;high=n;

       while(low<=high)

       {

              q=L->next;

              for(int j=1;j<low;j++)

              {

                     q=q->next;

              }

              mid=(low+high)/2;

              for(int i=low;i<mid;i++)

                     q=q->next;

              if(strcmp(q->student.ID,id)==0)

                     break;

              else if(strcmp(q->student.ID,id)>0)

                     high=mid-1;

              else

                     low=mid+1;

       }

       if(low=high&&strcmp(q->student.ID,id)!=0)

              printf("此学生信息不存在!\n\n");

       else

       {

              printf("输出该学生信息为:\n");

              printf("  姓名      学号 语文 数学 英语\n\n");

              printf("  %-8s %4s %4d %4d %4d\n\n",q->student.Name,q->student.ID,q->student.Chinese,q->student.Math,q->student.English);

       }    

       printf("请输入任意键返回上一层:");

       getch();

       system("cls");

}

//计算优秀率,良好率,中等率,及格率,不及格率

void Total()

{

       StudList L=(StudList)malloc(sizeof(Stud));

       L->next=NULL;

       Readfile(L,3);

       StudList s=L->next;

       int n=0,n1=0,n2=0,n3=0,n4=0,n5=0;

       float per1=0.0,per2=0.0,per3=0.0,per4=0.0,per5=0.0;

       StudList p=L->next;

       while(p)

       {

              if(p->student.Chinese>=90)

                     n1++;

              else if(p->student.Chinese<90 && p->student.Chinese>=80)

                     n2++;

              else if(p->student.Chinese<80 && p->student.Chinese>=70)

                     n3++;

              else if(p->student.Chinese<70 && p->student.Chinese>=60)

                     n4++;

              else if(p->student.Chinese<60)

                     n5++;

              n++;

              p=p->next;

       }

       per1=(float)n1/n*100;

       per2=(float)n2/n*100;

       per3=(float)n3/n*100;

       per4=(float)n4/n*100;

       per5=(float)n5/n*100;

       printf("\n\n                                语 文 课 程\n");

       printf("        ----------------------------------------------------------------\n");

       printf("            等级        优秀      良好     中等     及格     不及格\n");

       printf("            人数        %2d        %2d       %2d       %2d        %2d\n",n1,n2,n3,n4,n5);

       printf("         百分比(%)       %2.2f     %2.2f    %2.2f     %2.2f      %2.2f\n",per1,per2,per3,per4,per5);

       printf("        ----------------------------------------------------------------\n");

       n1=0,n2=0,n3=0,n4=0,n5=0;

       per1=0.0,per2=0.0,per3=0.0,per4=0.0,per5=0.0;

       p=L->next;

       while(p)

       {

              if(p->student.Math>=90)

                     n1++;

              else if(p->student.Math<90 && p->student.Math>=80)

                     n2++;

              else if(p->student.Math<80 && p->student.Math>=70)

                     n3++;

              else if(p->student.Math<70 && p->student.Math>=60)

                     n4++;

              else if(p->student.Math<60)

                     n5++;

              p=p->next;

       }

       per1=(float)n1/n*100;

       per2=(float)n2/n*100;

       per3=(float)n3/n*100;

       per4=(float)n4/n*100;

       per5=(float)n5/n*100;

       printf("\n\n                                数 学 课 程\n");

       printf("        ----------------------------------------------------------------\n");

       printf("            等级        优秀      良好     中等     及格     不及格\n");

       printf("            人数        %2d        %2d       %2d       %2d        %2d\n",n1,n2,n3,n4,n5);

       printf("         百分比(%)       %2.2f     %2.2f    %2.2f     %2.2f      %2.2f\n",per1,per2,per3,per4,per5);

       printf("        ----------------------------------------------------------------\n");

       n1=0,n2=0,n3=0,n4=0,n5=0;

       per1=0.0,per2=0.0,per3=0.0,per4=0.0,per5=0.0;

       p=L->next;

       while(p)

       {

              if(p->student.English>=90)

                     n1++;

              else if(p->student.English<90 && p->student.English>=80)

                     n2++;

              else if(p->student.English<80 && p->student.English>=70)

                     n3++;

              else if(p->student.English<70 && p->student.English>=60)

                     n4++;

              else if(p->student.English<60)

                     n5++;

              p=p->next;

       }

       per1=(float)n1/n*100;

       per2=(float)n2/n*100;

       per3=(float)n3/n*100;

       per4=(float)n4/n*100;

       per5=(float)n5/n*100;

       printf("\n\n                                英 语 课 程\n");

       printf("        ----------------------------------------------------------------\n");

       printf("            等级        优秀      良好     中等     及格     不及格\n");

       printf("            人数        %2d        %2d       %2d       %2d        %2d\n",n1,n2,n3,n4,n5);

       printf("         百分比(%)       %2.2f     %2.2f    %2.2f     %2.2f     %2.2f\n",per1,per2,per3,per4,per5);

       printf("        ----------------------------------------------------------------\n");

       printf("请输入任意键返回上一层:");

       getch();

       system("cls");

}

//显示界面

void printf()

{

       printf("\n\n\n\n\n\n");

       printf("\t\t\t欢迎进入学生成绩管理系统 d(n_n)b  \n\n\n");

       printf("\t\t\t请输入验证码进入:");      

}

void printf1()

{

       printf("\n\n\n\n");

       printf("\t\t1. 创建两个链表保存在1.txt、2.txt文件中\n");

       printf("\t\t2. 合并两个文件保存在3.txt文件中\n");

       printf("\t\t3. 对文件进行插入、删除、修改\n");

       printf("\t\t4. 抽取补考学生信息保存在4.txt中\n");

       printf("\t\t5. 对3.txt中的数据按总分降序排序\n" );

       printf("\t\t6. 查找学生信息\n");

       printf("\t\t7. 统计各门课程的平均分、最高分、最低分\n");

       printf("\t\t8. 统计各门课程优秀、良好、中等、及格、不及格的人数及百分比\n");

       printf("\t\t0.返回上一层\n");

    printf("\t\t请输入操作编码:");

}

void printf2()

{

       printf("\n\n\n\n");

       printf("\t\t\t1. 插入一个学生的信息!\n");

       printf("\t\t\t2. 删除一个学生的信息!\n");

       printf("\t\t\t3. 修改一个学生的信息!\n");

       printf("\t\t\t0. 返回上一层!\n");

       printf("\t\t\t请输入操作编码:");

}

void printf3()

{

    printf("     \n\n\n\n\n");

       printf("                    成绩按总分降序排序:\n\n\n");

       printf("                        1. 冒泡排序\n");

       printf("                        2. 选择排序\n");

       printf("                        0. 返回上一层!\n");

       printf("                    请输入操作编码:");

}

void printf4()

    printf("     \n\n\n\n\n");

       printf("                    查找学生信息:\n\n\n");

       printf("                        1. 顺序查找(输入学生姓名:)\n");

       printf("                        2. 折半查找(输入学生学号:)\n");

       printf("                        0. 返回上一层!\n");

       printf("                    请输入操作编码:");      

}

//功能实现函数

void Function();

void PassWord()

{

       printf();

       int a;

       scanf("%d",&a);

    if(a==2012)

       {

              system("cls");

              Function();

       }

       else

       {    

              system("cls");

        printf("\n\n\n\n");

              printf("\t\t\t验证码错误,不得进入!!\n");

              printf("\t\t\t请重新输入验证码!!");

              getch();

        system("cls");

              PassWord();

       }

}

void function1()

{

    printf2();

       int n;

       scanf("%d",&n);

       if(n<0||n>5)

       {

              printf("\t\t\t输入错误,请重新输入:");

              scanf("%d",&n);

       }    

       system("cls");

       switch(n)

       {

       case 1:Add();function1();break;

       case 2:Delete();function1();break;

       case 3:Update();function1();break;

       case 0:system("cls");Function();break;

       }

}

void function2()

{

       printf3();

       int n;

       scanf("%d",&n);

       if(n<0||n>2)

       {

              printf("\t\t\t\t输入错误,请重新输入:");

              scanf("%d",&n);

             

       }

       system("cls");

       switch(n)

       {

       case 1:Order1();function2();break;

       case 2:Order2();function2();break;

       case 0:system("cls");Function();break;

       }

}

void function3()

{

    printf4();

       int n;

       scanf("%d",&n);

       if(n<0||n>3)

       {

              printf("\t\t\t\t输入错误,请重新输入:");

              scanf("%d",&n);

       }

       system("cls");

       switch(n)

       {

       case 1:Search1();function3();break;

       case 2:search2();function3();break;

       case 0:system("cls");Function();break;

       }

}

void Function()

{

       printf1();

       int n;

       scanf("%d",&n);

       if(n<0||n>8)

       {

              printf("\t\t\t信息错误!请重新输入:");

              scanf("%d",&n);

       }    

       system("cls");

       switch(n)

       {

       case 1:  

              Creatlist();

              Creatlist();

              printf("\n\n\n\n\t\t\t\t文件创建成功!!!");

              printf("\n\n\t\t\t\t按任意键以继续...");

              getch();

              system("cls");

              Function();

              break;

       case 2:

              printf("1.txt与2.txt合并放入3.txt\n");

              Union();

              Function();

              break;

       case 3:function1();break;

       case 4:Makeupexam();Function();break;

       case 5:function2();break;

       case 6:function3();break;

       case 7:AvgMaxMin();system("cls");Function();break;

    case 8:Total();Function();break;

    case 0:PassWord();system("cls");Function();break;

       }    

}

void main()

{

  PassWord();    

}

相关推荐