学生成绩管理系统【C语言程序设计】

来源:互联网 发布:app 实时数据展示页面 编辑:程序博客网 时间:2024/05/29 02:43
一、功能实现:

0、浏览学生信息
1、输入学生信息
2、增加学生信息
3、修改学生信息
4、删除学生信息
5、按学号查询
6、按班级查询
7、按姓名查询
8、按课堂名称查询
9、按总分高低排序
10、单科成绩排名
11、查询班级优秀率
12、清屏
13、退出系统

二、运用到的核心知识:

0、动态链表的创建、输出、查找、增加、修改、删除等

1、链表的冒泡排序

三、代码如下:

   1 #include <stdio.h>   2 #include <stdlib.h>   3 #include <string.h>   4 #define lis struct stu   5 #define setup (lis *)malloc(sizeof(lis))   6    7 struct score   8 {   9     float ord_scor;  10     //expe_scor,exam_scor;//可增加学生单科各类成绩,为简便,在此忽略  11 };  12   13 struct stu  14 {  15     int num;  16     char name[10];  17     struct score Chinese,Math,English,Physics,Chem,Bio;  18     float fina_scor;  19     lis *next;  20 };  21   22 lis *p;  23   24 lis* input()//输入学生信息  25 {  26     lis *head,*tail;  27     int cnt=0;  28   29     p=setup;  30   31     printf("学号  姓名  语文  数学  英语  物理  化学  生物\n");  32     scanf("%d",&p->num);  33     while(1)  34     {  35         if(p->num==0)  36             break;  37         cnt++;  38         scanf("%s%f%f%f%f%f%f",p->name,&(p->Chinese).ord_scor,&(p->Math).ord_scor,&(p->English).ord_scor,&(p->Physics).ord_scor,&(p->Chem).ord_scor,&(p->Bio).ord_scor);  39         if(cnt==1)  40         {  41             head=tail=p;  42         }  43         else  44         {  45             tail->next=p;  46             tail=p;  47         }  48   49         p=setup;  50         scanf("%d",&p->num);  51     }  52     tail->next=NULL;  53   54     return (head);  55 }  56   57 lis* alter(lis *head)//修改学生信息  58 {  59     float alt_num,alt_scor;  60     int course;  61   62     printf("请输入要修改的学生学号(0代表结束): ");  63     scanf("%f",&alt_num);  64     while(alt_num!=0)  65     {  66         p=head;  67         while(p!=NULL)  68         {  69             if(p->num!=alt_num)  70                 p=p->next;  71             else  72                 break;  73         }  74         if(p==NULL)  75         {  76             printf("输入学号有错!请重新输入(0代表结束): ");  77         }  78         else  79         {  80             printf("请输入要修改的课程代表的编号(1-语文,2-数学,3-英语,4-物理,5-化学,6-生物,0-修改结束): ");  81             scanf("%d",&course);  82   83             while(course>6||course<0)  84             {  85                 printf("输入编号有错!请重新输入编号(0代表结束): ");  86                 scanf("%d",&course);  87             }  88   89             while(course!=0)  90             {  91                 if(course>6||course<0)  92                     printf("输入编号有错!请重新输入编号(0代表结束): ");  93                 else  94                 {  95                     p=head;  96                     while(p!=NULL)  97                     {  98                         if(p->num==alt_num)  99                         { 100                             printf("请输入新成绩:\n"); 101                             scanf("%f",&alt_scor); 102  103                             switch(course) 104                             { 105                                 case 1:(p->Chinese).ord_scor=alt_scor;break; 106                                 case 2:(p->Math).ord_scor=alt_scor;break; 107                                 case 3:(p->English).ord_scor=alt_scor;break; 108                                 case 4:(p->Physics).ord_scor=alt_scor;break; 109                                 case 5:(p->Chem).ord_scor=alt_scor;break; 110                                 case 6:(p->Bio).ord_scor=alt_scor;break; 111                             } 112                         } 113                         p=p->next; 114                     } 115                     printf("若继续修改该学生成绩,请输入编号(0代表结束): "); 116                 } 117                 scanf("%d",&course); 118             } 119             printf("请输入学号(0代表结束): "); 120         } 121         scanf("%f",&alt_num); 122     } 123     return (head); 124 } 125  126 lis* add(lis *head)//增加学生信息 127 { 128     lis *tail,*z,*q; 129  130     q=tail=head; 131     while(q!=NULL) 132     { 133         z=tail; //z指向倒数第二个结点 134         tail=q; 135         q=q->next; 136     }           //tail->next==NULL 137  138     p=setup; 139     printf("请增加学生信息(学号为0无效,且结束增加):\n学号  姓名  语文  数学  英语  物理  化学  生物\n"); 140     scanf("%d%s%f%f%f%f%f%f",&p->num,p->name,&(p->Chinese).ord_scor,&(p->Math).ord_scor,&(p->English).ord_scor,&(p->Physics).ord_scor,&(p->Chem).ord_scor,&(p->Bio).ord_scor); 141  142     int flag; 143     while(p->num!=0) 144     { 145         flag=0; 146         while(flag==0||flag==1) 147         { 148             q=head; 149             while(q!=NULL) 150             { 151                 if(q->num==p->num)//学号重复 152                 { 153                     flag=1; 154                     break; 155                 } 156                 else 157                     q=q->next; 158             } 159  160             if(flag==1) 161             { 162                 flag=0; 163                 printf("已存在该学生,请重新输入:\n"); 164                 p=setup; 165                 scanf("%d%s%f%f%f%f%f%f",&p->num,p->name,&(p->Chinese).ord_scor,&(p->Math).ord_scor,&(p->English).ord_scor,&(p->Physics).ord_scor,&(p->Chem).ord_scor,&(p->Bio).ord_scor); 166             } 167             else 168                 break; 169         } 170  171         z->next=p; 172         p->next=tail; 173         z=p; 174  175         p=setup; 176         scanf("%d%s%f%f%f%f%f%f",&p->num,p->name,&(p->Chinese).ord_scor,&(p->Math).ord_scor,&(p->English).ord_scor,&(p->Physics).ord_scor,&(p->Chem).ord_scor,&(p->Bio).ord_scor); 177     } 178     return (head); 179 } 180  181 lis* delet(lis *head)//删除学生信息 182 { 183     int del_num; 184     lis *t; 185  186     printf("请输入要删除的成绩对应的学号(0表示删除结束):\n"); 187     scanf("%d",&del_num); 188  189     while(del_num) 190     { 191         p=head; 192         while(p!=NULL) 193         { 194             if(head->num==del_num) 195             { 196                 head=p->next; break; 197             } 198             else if(p->num==del_num) 199             { 200                 t->next=p->next; break; 201             } 202             t=p; 203             p=p->next; 204         } 205         if(p==NULL) 206             printf("输入学号有错!请重新输入:\n"); 207  208         scanf("%d",&del_num); 209     } 210  211     return (head); 212 } 213  214 void search_print(lis *p) 215 { 216     printf("%d%7s%8.2f%10.2f%10.2f%10.2f%10.2f%10.2f\n",p->num,p->name,(p->Chinese).ord_scor,(p->Math).ord_scor,(p->English).ord_scor,(p->Physics).ord_scor,(p->Chem).ord_scor,(p->Bio).ord_scor); 217 } 218  219 void search(lis *head,int key)//各种方式查询学生信息 220 { 221     lis *q=head; 222     int sear_num,sear_class,sear_course,flag1=0,flag2=0; 223     char sear_name[10]; 224  225     if(key==5) 226     { 227         printf("请输入学号:"); 228         scanf("%d",&sear_num); 229     } 230     else if(key==6) 231     { 232         flag1=1;                        //标记按班级查询 233         printf("请输入班级:"); 234         scanf("%d",&sear_class); 235     } 236     else if(key==7) 237     { 238         printf("请请输入姓名:"); 239         scanf("%s",sear_name); 240     } 241     else if(key==8) 242     { 243         flag2=1;                        //标记按课程查询 244         printf("请输入课程代表的编号(1-语文,2-数学,3-英语,4-物理,5-化学,6-生物):"); 245         scanf("%d",&sear_course); 246     } 247  248     if(flag2)                           //按课程查询 249     { 250         switch(sear_course) 251         { 252             case 1: 253             { 254                 printf("学号    姓名    语文\n"); 255                 while(q!=NULL) 256                 { 257                     printf("%d%7s%8.2f\n",q->num,q->name,(q->Chinese).ord_scor); 258                     q=q->next; 259                 } 260             }break; 261             case 2: 262             { 263                 printf("学号    姓名    数学\n"); 264                 while(q!=NULL) 265                 { 266                     printf("%d%7s%8.2f\n",q->num,q->name,(q->Math).ord_scor); 267                     q=q->next; 268                 } 269             }break; 270             case 3: 271             { 272                 printf("学号    姓名    英语\n"); 273                 while(q!=NULL) 274                 { 275                     printf("%d%7s%8.2f\n",q->num,q->name,(q->English).ord_scor); 276                     q=q->next; 277                 } 278             }break; 279             case 4: 280             { 281                 printf("学号    姓名    物理\n"); 282                 while(q!=NULL) 283                 { 284                     printf("%d%7s%8.2f\n",q->num,q->name,(q->Physics).ord_scor); 285                     q=q->next; 286                 } 287             }break; 288             case 5: 289             { 290                 printf("学号    姓名    化学\n"); 291                 while(q!=NULL) 292                 { 293                     printf("%d%7s%8.2f\n",q->num,q->name,(q->Chem).ord_scor); 294                     q=q->next; 295                 } 296             }break; 297             case 6: 298             { 299                 printf("学号    姓名    生物\n"); 300                 while(q!=NULL) 301                 { 302                     printf("%d%7s%8.2f\n",q->num,q->name,(q->Bio).ord_scor); 303                     q=q->next; 304                 } 305             }break; 306             default:printf("输入错误!\n"); 307         } 308     } 309     else 310     { 311         if(flag1)                       //按班级查询 312         { 313             int flag3=0;                //标记是否有输入的班级 314  315             while(q!=NULL) 316             { 317                 if((q->num)/100==sear_class) 318                 { 319                     flag3=1; 320                     break; 321                 } 322                 q=q->next; 323             } 324  325             if(flag3) 326             { 327                 q=head;//q要指向头节点 328  329                 printf("学号    姓名    语文    数学    英语    物理    化学    生物\n"); 330                 while(q!=NULL) 331                 { 332                     if((q->num)/100==sear_class) 333                         search_print(q); 334                     q=q->next; 335                 } 336  337             } 338             else 339                 printf("输入错误!\n"); 340         } 341         else                            //按学号或姓名查询 342         { 343             while(q!=NULL) 344             { 345                 if(q->num==sear_num) 346                     break; 347                 if(strcmp(q->name,sear_name)==0) 348                     break; 349                 q=q->next; 350             } 351  352             if(q==NULL) 353                 printf("输入错误!\n"); 354             else 355             { 356                 printf("学号    姓名    语文    数学    英语    物理    化学    生物\n"); 357                 search_print(q); 358             } 359         } 360     } 361 } 362  363 lis* bubble_sort(lis *head,int len,int key)//冒泡排序 364 { 365     lis *t=setup; 366     int i=len; 367  368     if(key==100)//交换总分 369     { 370         while(i>1) 371         { 372             p=head; 373             while(p->next!=NULL) 374             { 375                 if(p->fina_scor<(p->next)->fina_scor) 376                 { 377                     t->num=p->num;//交换学号 378                     p->num=(p->next)->num; 379                     (p->next)->num=t->num; 380  381                     strcpy(t->name,p->name);//交换姓名 382                     strcpy(p->name,(p->next)->name); 383                     strcpy((p->next)->name,t->name); 384  385                     t->fina_scor=p->fina_scor; 386                     p->fina_scor=(p->next)->fina_scor; 387                     (p->next)->fina_scor=t->fina_scor; 388                 } 389                 p=p->next; 390             } 391             i--; 392         } 393         return (head); 394     } 395     else if(key==1)//交换语分 396     { 397         while(i>1) 398         { 399             p=head; 400             while(p->next!=NULL) 401             { 402                 if((p->Chinese).ord_scor<((p->next)->Chinese).ord_scor) 403                 { 404                     t->num=p->num;//交换学号 405                     p->num=(p->next)->num; 406                     (p->next)->num=t->num; 407  408                     strcpy(t->name,p->name);//交换姓名 409                     strcpy(p->name,(p->next)->name); 410                     strcpy((p->next)->name,t->name); 411  412                     (t->Chinese).ord_scor=(p->Chinese).ord_scor; 413                     (p->Chinese).ord_scor=((p->next)->Chinese).ord_scor; 414                     ((p->next)->Chinese).ord_scor=(t->Chinese).ord_scor; 415                 } 416  417                 p=p->next; 418             } 419             i--; 420         } 421         return (head); 422     } 423     else if(key==2)//交换数分 424     { 425         while(i>1) 426         { 427             p=head; 428             while(p->next!=NULL) 429             { 430                 if((p->Math).ord_scor<((p->next)->Math).ord_scor) 431                 { 432                     t->num=p->num;//交换学号 433                     p->num=(p->next)->num; 434                     (p->next)->num=t->num; 435  436                     strcpy(t->name,p->name);//交换姓名 437                     strcpy(p->name,(p->next)->name); 438                     strcpy((p->next)->name,t->name); 439  440                     (t->Math).ord_scor=(p->Math).ord_scor; 441                     (p->Math).ord_scor=((p->next)->Math).ord_scor; 442                     ((p->next)->Math).ord_scor=(t->Math).ord_scor; 443                 } 444  445                 p=p->next; 446             } 447             i--; 448         } 449         return (head); 450     } 451     else if(key==3)//交换英分 452     { 453         while(i>1) 454         { 455             p=head; 456             while(p->next!=NULL) 457             { 458                 if((p->English).ord_scor<((p->next)->English).ord_scor) 459                 { 460                     t->num=p->num;//交换学号 461                     p->num=(p->next)->num; 462                     (p->next)->num=t->num; 463  464                     strcpy(t->name,p->name);//交换姓名 465                     strcpy(p->name,(p->next)->name); 466                     strcpy((p->next)->name,t->name); 467  468                     (t->English).ord_scor=(p->English).ord_scor; 469                     (p->English).ord_scor=((p->next)->English).ord_scor; 470                     ((p->next)->English).ord_scor=(t->English).ord_scor; 471                 } 472                 p=p->next; 473             } 474             i--; 475         } 476         return (head); 477     } 478     else if(key==4)//交换物分 479     { 480         while(i>1) 481         { 482             p=head; 483             while(p->next!=NULL) 484             { 485                 if((p->Physics).ord_scor<((p->next)->Physics).ord_scor) 486                 { 487                     t->num=p->num;//交换学号 488                     p->num=(p->next)->num; 489                     (p->next)->num=t->num; 490  491                     strcpy(t->name,p->name);//交换姓名 492                     strcpy(p->name,(p->next)->name); 493                     strcpy((p->next)->name,t->name); 494  495                     (t->Physics).ord_scor=(p->Physics).ord_scor; 496                     (p->Physics).ord_scor=((p->next)->Physics).ord_scor; 497                     ((p->next)->Physics).ord_scor=(t->Physics).ord_scor; 498                 } 499                 p=p->next; 500             } 501             i--; 502         } 503         return (head); 504     } 505     else if(key==5)//交换化分 506     { 507         while(i>1) 508         { 509             p=head; 510             while(p->next!=NULL) 511             { 512                 if((p->Chem).ord_scor<((p->next)->Chem).ord_scor) 513                 { 514                     t->num=p->num;//交换学号 515                     p->num=(p->next)->num; 516                     (p->next)->num=t->num; 517  518                     strcpy(t->name,p->name);//交换姓名 519                     strcpy(p->name,(p->next)->name); 520                     strcpy((p->next)->name,t->name); 521  522                     (t->Chem).ord_scor=(p->Chem).ord_scor; 523                     (p->Chem).ord_scor=((p->next)->Chem).ord_scor; 524                     ((p->next)->Chem).ord_scor=(t->Chem).ord_scor; 525                 } 526                 p=p->next; 527             } 528             i--; 529         } 530         return (head); 531     } 532     else if(key==6)//交换生分 533     { 534         while(i>1) 535         { 536             p=head; 537             while(p->next!=NULL) 538             { 539                 if((p->Bio).ord_scor<((p->next)->Bio).ord_scor) 540                 { 541                     t->num=p->num;//交换学号 542                     p->num=(p->next)->num; 543                     (p->next)->num=t->num; 544  545                     strcpy(t->name,p->name);//交换姓名 546                     strcpy(p->name,(p->next)->name); 547                     strcpy((p->next)->name,t->name); 548  549                     (t->Bio).ord_scor=(p->Bio).ord_scor; 550                     (p->Bio).ord_scor=((p->next)->Bio).ord_scor; 551                     ((p->next)->Bio).ord_scor=(t->Bio).ord_scor; 552                 } 553                 p=p->next; 554             } 555             i--; 556         } 557         return (head); 558     } 559 } 560  561 void final_score_sort(lis *head)//按总分高低排序 562 { 563     int cnt=0,z=100; 564  565     p=head; 566     while(p!=NULL) 567     { 568         cnt++; 569  570         p->fina_scor=(p->Chinese).ord_scor+(p->Math).ord_scor+(p->English).ord_scor+(p->Physics).ord_scor+(p->Chem).ord_scor+(p->Bio).ord_scor; 571         p=p->next; 572     } 573  574     head=bubble_sort(head,cnt,z); 575  576     printf("名次    学号\t    姓名    总分\n"); 577  578     cnt=1; 579     p=head; 580     while(p!=NULL) 581     { 582         printf("%d\t%d\t%7s%8.2f\n",cnt++,p->num,p->name,p->fina_scor); 583         p=p->next; 584     } 585 } 586  587 void  single_course_sort(lis *head)//单科成绩排名 588 { 589     int select,cnt=0; 590  591     p=head; 592     while(p!=NULL) 593     { 594         cnt++; 595         p=p->next; 596     } 597  598     printf("请输入课程代表的编号(1-语文,2-数学,3-英语,4-物理,5-化学,6-生物):"); 599     scanf("%d",&select); 600  601     switch(select) 602     { 603         case 1: 604             { 605                 head=bubble_sort(head,cnt,select); 606                 printf("名次    学号\t    姓名    语文分数\n"); 607  608                 cnt=1; 609                 p=head; 610                 while(p!=NULL) 611                 { 612                     printf("%d\t%d\t%7s%8.2f\n",cnt++,p->num,p->name,(p->Chinese).ord_scor); 613                     p=p->next; 614                 } 615             }break; 616         case 2: 617             { 618                 head=bubble_sort(head,cnt,select); 619                 printf("名次    学号\t    姓名    数学分数\n"); 620                 cnt=1; 621                 p=head; 622                 while(p!=NULL) 623                 { 624                     printf("%d\t%d\t%7s%8.2f\n",cnt++,p->num,p->name,(p->Math).ord_scor); 625                     p=p->next; 626                 } 627             }break; 628         case 3: 629             { 630                 head=bubble_sort(head,cnt,select); 631                 printf("名次    学号\t    姓名    英语分数\n"); 632                 cnt=1; 633                 p=head; 634                 while(p!=NULL) 635                 { 636                     printf("%d\t%d\t%7s%8.2f\n",cnt++,p->num,p->name,(p->English).ord_scor); 637                     p=p->next; 638                 } 639             }break; 640         case 4: 641             { 642                 head=bubble_sort(head,cnt,select); 643                 printf("名次    学号\t    姓名    物理分数\n"); 644                 cnt=1; 645                 p=head; 646                 while(p!=NULL) 647                 { 648                     printf("%d\t%d\t%7s%8.2f\n",cnt++,p->num,p->name,(p->Physics).ord_scor); 649                     p=p->next; 650                 } 651             }break; 652         case 5: 653             { 654                 head=bubble_sort(head,cnt,select); 655                 printf("名次    学号\t    姓名    化学分数\n"); 656                 cnt=1; 657                 p=head; 658                 while(p!=NULL) 659                 { 660                     printf("%d\t%d\t%7s%8.2f\n",cnt++,p->num,p->name,(p->Chem).ord_scor); 661                     p=p->next; 662                 } 663             }break; 664         case 6: 665             { 666                 head=bubble_sort(head,cnt,select); 667                 printf("名次    学号\t    姓名    生物分数\n"); 668                 cnt=1; 669                 p=head; 670                 while(p!=NULL) 671                 { 672                     printf("%d\t%d\t%7s%8.2f\n",cnt++,p->num,p->name,(p->Bio).ord_scor); 673                     p=p->next; 674                 } 675             }break; 676         default:printf("输入错误!\n"); 677     } 678 } 679  680 struct class_excel_rate 681 { 682     int class_num,all_stu,excel_stu; 683     struct class_excel_rate *next; 684 }; 685  686 void bubble_sort_print(struct class_excel_rate* head,int lenth)//冒泡排序并输出班级优秀率 687 { 688     struct class_excel_rate *t=(struct class_excel_rate*)malloc(sizeof(struct class_excel_rate)); 689  690     int len=0; 691     float s; 692  693     t=head; 694     while(t!=NULL) 695     { 696         len++; 697         t=t->next; 698     } 699  700     while(len>1) 701     { 702         t=head; 703         while(t->next!=NULL) 704         { 705             if((t->next)->excel_stu/((t->next)->all_stu*0.1)>t->excel_stu/(t->all_stu*0.1)) 706             { 707                 s=t->excel_stu; 708                 t->excel_stu=(t->next)->excel_stu; 709                 (t->next)->excel_stu=s; 710  711                 s=t->all_stu; 712                 t->all_stu=(t->next)->all_stu; 713                 (t->next)->all_stu=s; 714             } 715             t=t->next; 716         } 717         len--; 718     } 719  720     printf("名次\t班级\t     总人数    优秀人数    优秀率\n"); 721     int i=1; 722     t=head; 723     while(t!=NULL) 724     { 725         printf("%d\t%d\t\t%d\t  %d\t   %.2f%%\n",i++,t->class_num,t->all_stu,t->excel_stu,t->excel_stu/(t->all_stu*0.1)*10); 726         t=t->next; 727     } 728 } 729  730 void select_class_find(lis *head,int len,int key)//查询班级优秀率 731 { 732  733     struct class_excel_rate *head1,*q,*r,*k;//创建新链表 734  735     switch(key) 736     { 737         case 1://查询语文 738             { 739                 p=head; 740  741                 head1=q=(struct class_excel_rate*)malloc(sizeof(struct class_excel_rate)); 742  743                 head1->class_num=p->num/100;//初始化头节点 744                 head1->all_stu=1; 745                 if((p->Chinese).ord_scor>=90.0) 746                     head1->excel_stu=1; 747                 else 748                     head1->excel_stu=0; 749  750                 p=p->next; 751                 while(p->next!=NULL)//先建立两个两个首、尾结点,以便其它班级的插入 752                 { 753                     if(p->num/100==head1->class_num)//相同班级 754                     { 755                         head1->all_stu++; 756                         if((p->Chinese).ord_scor>=90.0) 757                             head1->excel_stu++; 758                     } 759                     else 760                     { 761                         q=(struct class_excel_rate*)malloc(sizeof(struct class_excel_rate)); 762  763                         q->class_num=p->num/100; 764                         q->all_stu=1; 765                         if((p->Chinese).ord_scor>=90.0) 766                             q->excel_stu=1; 767                         else 768                             q->excel_stu=0; 769  770                         head1->next=q; 771                         q->next=NULL; 772                         break;//建立链尾结点 773                     } 774                     p=p->next; 775                 } 776  777                 p=p->next; 778                 while(p!=NULL)//检索所有剩余的班级 779                 { 780                     r=k=head1;//问题:最后一个班级检索没有被处理 781                     while(r!=NULL)//检索班级是否相同 782                     { 783                         if(p->num/100==r->class_num) 784                         { 785                             r->all_stu++; 786                             if((p->Chinese).ord_scor>=90.0) 787                                 r->excel_stu++; 788                             break; 789                         } 790                         else 791                         { 792                             k=r; 793                             r=r->next; 794                         } 795                     } 796  797                     if(r==NULL)//没有相同的班级,插入新结点 798                     { 799                         q=(struct class_excel_rate*)malloc(sizeof(struct class_excel_rate)); 800  801                         q->class_num=p->num/100; 802                         q->all_stu=1; 803                         if((p->Chinese).ord_scor>=90.0) 804                             q->excel_stu=1; 805                         else 806                             q->excel_stu=0; 807  808                         k->next=q; 809                         q->next=r; 810                     } 811  812                     p=p->next;//检索下一个处理的班级 813                 } 814  815                 bubble_sort_print(head1,len); 816  817             }break; 818         case 2://查询数学 819             { 820                 p=head; 821  822                 head1=q=(struct class_excel_rate*)malloc(sizeof(struct class_excel_rate)); 823  824                 head1->class_num=p->num/100;//初始化头节点 825                 head1->all_stu=1; 826                 if((p->Math).ord_scor>=90.0) 827                     head1->excel_stu=1; 828                 else 829                     head1->excel_stu=0; 830  831                 p=p->next; 832                 while(p->next!=NULL)//先建立两个两个首、尾结点,以便其它班级的插入 833                 { 834                     if(p->num/100==head1->class_num)//相同班级 835                     { 836                         head1->all_stu++; 837                         if((p->Math).ord_scor>=90.0) 838                             head1->excel_stu++; 839                     } 840                     else 841                     { 842                         q=(struct class_excel_rate*)malloc(sizeof(struct class_excel_rate)); 843  844                         q->class_num=p->num/100; 845                         q->all_stu=1; 846                         if((p->Math).ord_scor>=90.0) 847                             q->excel_stu=1; 848                         else 849                             q->excel_stu=0; 850  851                         head1->next=q; 852                         q->next=NULL; 853                         break;//建立链尾结点 854                     } 855                     p=p->next; 856                 } 857  858                 p=p->next; 859                 while(p!=NULL)//检索所有剩余的班级 860                 { 861                     r=k=head1;//问题:最后一个班级检索没有被处理 862                     while(r!=NULL)//检索班级是否相同 863                     { 864                         if(p->num/100==r->class_num) 865                         { 866                             r->all_stu++; 867                             if((p->Math).ord_scor>=90.0) 868                                 r->excel_stu++; 869                             break; 870                         } 871                         else 872                         { 873                             k=r; 874                             r=r->next; 875                         } 876                     } 877  878                     if(r==NULL)//没有相同的班级,插入新结点 879                     { 880                         q=(struct class_excel_rate*)malloc(sizeof(struct class_excel_rate)); 881  882                         q->class_num=p->num/100; 883                         q->all_stu=1; 884                         if((p->Math).ord_scor>=90.0) 885                             q->excel_stu=1; 886                         else 887                             q->excel_stu=0; 888  889                         k->next=q; 890                         q->next=r; 891                     } 892  893                     p=p->next;//检索下一个处理的班级 894                 } 895  896                 bubble_sort_print(head1,len); 897             }break; 898         case 3://查询英语 899             { 900                  p=head; 901  902                 head1=q=(struct class_excel_rate*)malloc(sizeof(struct class_excel_rate)); 903  904                 head1->class_num=p->num/100;//初始化头节点 905                 head1->all_stu=1; 906                 if((p->English).ord_scor>=90.0) 907                     head1->excel_stu=1; 908                 else 909                     head1->excel_stu=0; 910  911                 p=p->next; 912                 while(p->next!=NULL)//先建立两个两个首、尾结点,以便其它班级的插入 913                 { 914                     if(p->num/100==head1->class_num)//相同班级 915                     { 916                         head1->all_stu++; 917                         if((p->English).ord_scor>=90.0) 918                             head1->excel_stu++; 919                     } 920                     else 921                     { 922                         q=(struct class_excel_rate*)malloc(sizeof(struct class_excel_rate)); 923  924                         q->class_num=p->num/100; 925                         q->all_stu=1; 926                         if((p->English).ord_scor>=90.0) 927                             q->excel_stu=1; 928                         else 929                             q->excel_stu=0; 930  931                         head1->next=q; 932                         q->next=NULL; 933                         break;//建立链尾结点 934                     } 935                     p=p->next; 936                 } 937  938                 p=p->next; 939                 while(p!=NULL)//检索所有剩余的班级 940                 { 941                     r=k=head1;//问题:最后一个班级检索没有被处理 942                     while(r!=NULL)//检索班级是否相同 943                     { 944                         if(p->num/100==r->class_num) 945                         { 946                             r->all_stu++; 947                             if((p->English).ord_scor>=90.0) 948                                 r->excel_stu++; 949                             break; 950                         } 951                         else 952                         { 953                             k=r; 954                             r=r->next; 955                         } 956                     } 957  958                     if(r==NULL)//没有相同的班级,插入新结点 959                     { 960                         q=(struct class_excel_rate*)malloc(sizeof(struct class_excel_rate)); 961  962                         q->class_num=p->num/100; 963                         q->all_stu=1; 964                         if((p->English).ord_scor>=90.0) 965                             q->excel_stu=1; 966                         else 967                             q->excel_stu=0; 968  969                         k->next=q; 970                         q->next=r; 971                     } 972  973                     p=p->next;//检索下一个处理的班级 974                 } 975  976                 bubble_sort_print(head1,len); 977             }break; 978         case 4://查询物理 979             { 980                  p=head; 981  982                 head1=q=(struct class_excel_rate*)malloc(sizeof(struct class_excel_rate)); 983  984                 head1->class_num=p->num/100;//初始化头节点 985                 head1->all_stu=1; 986                 if((p->Physics).ord_scor>=90.0) 987                     head1->excel_stu=1; 988                 else 989                     head1->excel_stu=0; 990  991                 p=p->next; 992                 while(p->next!=NULL)//先建立两个两个首、尾结点,以便其它班级的插入 993                 { 994                     if(p->num/100==head1->class_num)//相同班级 995                     { 996                         head1->all_stu++; 997                         if((p->Physics).ord_scor>=90.0) 998                             head1->excel_stu++; 999                     }1000                     else1001                     {1002                         q=(struct class_excel_rate*)malloc(sizeof(struct class_excel_rate));1003 1004                         q->class_num=p->num/100;1005                         q->all_stu=1;1006                         if((p->Physics).ord_scor>=90.0)1007                             q->excel_stu=1;1008                         else1009                             q->excel_stu=0;1010 1011                         head1->next=q;1012                         q->next=NULL;1013                         break;//建立链尾结点1014                     }1015                     p=p->next;1016                 }1017 1018                 p=p->next;1019                 while(p!=NULL)//检索所有剩余的班级1020                 {1021                     r=k=head1;//问题:最后一个班级检索没有被处理1022                     while(r!=NULL)//检索班级是否相同1023                     {1024                         if(p->num/100==r->class_num)1025                         {1026                             r->all_stu++;1027                             if((p->Physics).ord_scor>=90.0)1028                                 r->excel_stu++;1029                             break;1030                         }1031                         else1032                         {1033                             k=r;1034                             r=r->next;1035                         }1036                     }1037 1038                     if(r==NULL)//没有相同的班级,插入新结点1039                     {1040                         q=(struct class_excel_rate*)malloc(sizeof(struct class_excel_rate));1041 1042                         q->class_num=p->num/100;1043                         q->all_stu=1;1044                         if((p->Physics).ord_scor>=90.0)1045                             q->excel_stu=1;1046                         else1047                             q->excel_stu=0;1048 1049                         k->next=q;1050                         q->next=r;1051                     }1052 1053                     p=p->next;//检索下一个处理的班级1054                 }1055 1056                 bubble_sort_print(head1,len);1057             }1058             break;1059         case 5://查询化学1060             {1061                  p=head;1062 1063                 head1=q=(struct class_excel_rate*)malloc(sizeof(struct class_excel_rate));1064 1065                 head1->class_num=p->num/100;//初始化头节点1066                 head1->all_stu=1;1067                 if((p->Chem).ord_scor>=90.0)1068                     head1->excel_stu=1;1069                 else1070                     head1->excel_stu=0;1071 1072                 p=p->next;1073                 while(p->next!=NULL)//先建立两个两个首、尾结点,以便其它班级的插入1074                 {1075                     if(p->num/100==head1->class_num)//相同班级1076                     {1077                         head1->all_stu++;1078                         if((p->Chem).ord_scor>=90.0)1079                             head1->excel_stu++;1080                     }1081                     else1082                     {1083                         q=(struct class_excel_rate*)malloc(sizeof(struct class_excel_rate));1084 1085                         q->class_num=p->num/100;1086                         q->all_stu=1;1087                         if((p->Chem).ord_scor>=90.0)1088                             q->excel_stu=1;1089                         else1090                             q->excel_stu=0;1091 1092                         head1->next=q;1093                         q->next=NULL;1094                         break;//建立链尾结点1095                     }1096                     p=p->next;1097                 }1098 1099                 p=p->next;1100                 while(p!=NULL)//检索所有剩余的班级1101                 {1102                     r=k=head1;//问题:最后一个班级检索没有被处理1103                     while(r!=NULL)//检索班级是否相同1104                     {1105                         if(p->num/100==r->class_num)1106                         {1107                             r->all_stu++;1108                             if((p->Chem).ord_scor>=90.0)1109                                 r->excel_stu++;1110                             break;1111                         }1112                         else1113                         {1114                             k=r;1115                             r=r->next;1116                         }1117                     }1118 1119                     if(r==NULL)//没有相同的班级,插入新结点1120                     {1121                         q=(struct class_excel_rate*)malloc(sizeof(struct class_excel_rate));1122 1123                         q->class_num=p->num/100;1124                         q->all_stu=1;1125                         if((p->Chem).ord_scor>=90.0)1126                             q->excel_stu=1;1127                         else1128                             q->excel_stu=0;1129 1130                         k->next=q;1131                         q->next=r;1132                     }1133 1134                     p=p->next;//检索下一个处理的班级1135                 }1136 1137                 bubble_sort_print(head1,len);1138             }1139             break;1140         case 6://查询生物1141             {1142                  p=head;1143 1144                 head1=q=(struct class_excel_rate*)malloc(sizeof(struct class_excel_rate));1145 1146                 head1->class_num=p->num/100;//初始化头节点1147                 head1->all_stu=1;1148                 if((p->Bio).ord_scor>=90.0)1149                     head1->excel_stu=1;1150                 else1151                     head1->excel_stu=0;1152 1153                 p=p->next;1154                 while(p->next!=NULL)//先建立两个两个首、尾结点,以便其它班级的插入1155                 {1156                     if(p->num/100==head1->class_num)//相同班级1157                     {1158                         head1->all_stu++;1159                         if((p->Bio).ord_scor>=90.0)1160                             head1->excel_stu++;1161                     }1162                     else1163                     {1164                         q=(struct class_excel_rate*)malloc(sizeof(struct class_excel_rate));1165 1166                         q->class_num=p->num/100;1167                         q->all_stu=1;1168                         if((p->Bio).ord_scor>=90.0)1169                             q->excel_stu=1;1170                         else1171                             q->excel_stu=0;1172 1173                         head1->next=q;1174                         q->next=NULL;1175                         break;//建立链尾结点1176                     }1177                     p=p->next;1178                 }1179 1180                 p=p->next;1181                 while(p!=NULL)//检索所有剩余的班级1182                 {1183                     r=k=head1;//问题:最后一个班级检索没有被处理1184                     while(r!=NULL)//检索班级是否相同1185                     {1186                         if(p->num/100==r->class_num)1187                         {1188                             r->all_stu++;1189                             if((p->Bio).ord_scor>=90.0)1190                                 r->excel_stu++;1191                             break;1192                         }1193                         else1194                         {1195                             k=r;1196                             r=r->next;1197                         }1198                     }1199 1200                     if(r==NULL)//没有相同的班级,插入新结点1201                     {1202                         q=(struct class_excel_rate*)malloc(sizeof(struct class_excel_rate));1203 1204                         q->class_num=p->num/100;1205                         q->all_stu=1;1206                         if((p->Bio).ord_scor>=90.0)1207                             q->excel_stu=1;1208                         else1209                             q->excel_stu=0;1210 1211                         k->next=q;1212                         q->next=r;1213                     }1214 1215                     p=p->next;//检索下一个处理的班级1216                 }1217 1218                 bubble_sort_print(head1,len);1219             }1220             break;1221     }1222 }1223 1224 void select_course_find(lis *head)//选择查询课程优秀率1225 {1226 1227     int select,cnt=0;1228 1229     p=head;1230     while(p!=NULL)1231     {1232         cnt++;1233         p=p->next;1234     }1235 1236     printf("请输入课程代表的编号(1-语文,2-数学,3-英语,4-物理,5-化学,6-生物):");1237     scanf("%d",&select);1238 1239     switch(select)1240     {1241         case 1:select_class_find(head,cnt,select);break;1242         case 2:select_class_find(head,cnt,select);break;1243         case 3:select_class_find(head,cnt,select);break;1244         case 4:select_class_find(head,cnt,select);break;1245         case 5:select_class_find(head,cnt,select);break;1246         case 6:select_class_find(head,cnt,select);break;1247         default:printf("输入错误!\n");1248     }1249 }1250 1251 void output(lis *head)//输出学生信息1252 {1253     p=setup;1254     p=head;1255     printf("学号    姓名    语文      数学      英语      物理      化学      生物\n");1256 1257     while(p!=NULL)1258     {1259         printf("%d%7s%8.2f%10.2f%10.2f%10.2f%10.2f%10.2f\n",p->num,p->name,(p->Chinese).ord_scor,(p->Math).ord_scor,(p->English).ord_scor,(p->Physics).ord_scor,(p->Chem).ord_scor,(p->Bio).ord_scor);1260         p=p->next;1261     }1262 }1263 1264 void print()1265 {1266     printf("\t\t-------学生成绩管理系统-------\n");1267     printf("\t\t\t0、浏览学生信息\n\t\t\t1、输入学生信息\n\t\t\t2、增加学生信息\n\t\t\t3、修改学生信息\n\t\t\t4、删除学生信息\n\t\t\t5、按学号查询\n");1268     printf("\t\t\t6、按班级查询\n\t\t\t7、按姓名查询\n\t\t\t8、按课堂名称查询\n\t\t\t9、按总分高低排序\n\t\t\t10、单科成绩排名\n\t\t\t11、查询班级优秀率\n\t\t\t12、清屏\n\t\t\t13、退出系统\n");1269     printf("\t\t------------------------------\n");1270     printf("\n>>请输入要实现功能前的序号:  ");1271 }1272 1273 int main()1274 {1275     int fun;1276     lis *student;1277 1278     print();1279 1280     while(1)1281     {1282         scanf("%d",&fun);1283         switch(fun)1284         {1285             case 0:output(student); break;1286             case 1:student=input(); break;1287             case 2:student=add(student); break;1288             case 3:student=alter(student);break;1289             case 4:student=delet(student); break;1290             case 5:1291             case 6:1292             case 7:1293             case 8:search(student,fun); break;1294             case 9:final_score_sort(student); break;1295             case 10:single_course_sort(student); break;1296             case 11:select_course_find(student); break;1297             case 12:{1298                         system("cls");1299                         print();1300                     }1301         }1302         if(fun==1)1303         {1304             system("cls");1305             print();1306         }1307         else if(fun==13)1308             break;1309         else if(fun>13)1310             printf("\n\t**输入错误!\n>>请输入要实现功能前的序号: ");1311         else if(fun!=12)1312             printf("\n>>请输入要实现功能前的序号: ");1313     }1314     return 0;1315 }1316 1317 /*测试数据1318 150901 james  100  99    94   89.9    93    951319 130118 bryant 93   98    75   78.9    99.2  97.11320 161226 lu     85   99    78   79      66    66.91321 130821 jordon 99   100   98.1 90.6    91    89.91322 150928 antony 98   97.4  91.9 89      78    79.41323 161127 durant 100  98    93   82      97    801324 161222 love   90   89    90   91.2    93    82.71325 130156 duncan 99   98    91   82.5    89    781326 160703 paul   90   91.5  98   89      87.9  801327 150433 wade   93   93.4  95   91      89    80.91328 161316 irving 96   89    91.8 95      91    98.81329 161205 harden 89   88    93   95      96.7  991330 161305 curry  89.9 92    89   46.9    39    1001331 160739 bosh   91.5 78    98   69.9    89    851332 01333 */