• [项目记录] 用c语言完成的一个学生成绩管理系统


    本文为大大维原创,最早于博客园发表,转载请注明出处!!!

     一、要求:

    学生成绩管理系统

    某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入)。使用链表编程实现如下菜单驱动的学生成绩管理系统。

    1. 从文件读入每个学生个人信息和成绩信息,可以由键盘输入文件名。读入成功提示读入学生记录的个数,不成功提示相应出错信息。
    2. 增量式手动录入每个学生的学号、姓名和各科考试成绩。不考虑中文姓名,但需要考虑重名情况下的处理,学生的学号是唯一的。
    3. 计算每门课程的总分和平均分;
    4. 计算每个学生的总分和平均分;
    5. 按每个学生的总分由高到低排出名次表;
    6. 按每个学生的总分由低到高排出名次表;
    7. 按学号由小到大排出成绩表;
    8. 按姓名的字典顺序排出成绩表;
    9. 按学号查询学生排名及其考试成绩;
    10. 按姓名查询学生排名及其考试成绩;需要考虑学生重名的情况。
    11. 按优秀(100-90)、良好(89-80)、中等(79-70)、及格(69-60)、不及格(59-0)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比;并将计算结果输出到文件,文件名可由键盘输入。
    12. 将每个学生的学号、姓名、各科考试成绩、总分和平均分输出到显示器;
    13. 将每个学生的个人信息和成绩写入文件,可由键盘输入文件名;

     二、程序结构与设计

    1. 模块划分:

    整个函数划分为: 

          a. 用户欢迎与权限通过界面

                    b. 主菜单与用户退出界面

                    c. 函数调用用程序执行界面

    三个模块。

    2.主函数的主要功能:

         a. 通过switch函数调用各功能函数

         b. 构建良好亲和的用户体验界面

    3. 各子函数主要功能:

    F1:  从文件读入每个学生个人信息和成绩信息,可以由键盘输入文件名。读入成功提示读入学生记录的个数,不成功提示相应出错信息。

    F2:增量式手动录入每个学生的学号、姓名和各科考试成绩。不考虑中文姓名,但需要考虑重名情况下的处理,学生的学号是唯一的。

    F3:计算每门课程的总分和平均分;

    F4:计算每个学生的总分和平均分;

    F5:按每个学生的总分由高到低排出名次表;

    F6:按每个学生的总分由低到高排出名次表;

    F7:按学号由小到大排出成绩表;

    F8:按姓名的字典顺序排出成绩表;

    F9:按学号查询学生排名及其考试成绩;

    F10:按姓名查询学生排名及其考试成绩;需要考虑学生重名的情况。

    F11:按优秀(100-90)、良好(89-80)、中等(79-70)、及格(69-60)、不及格(59-0)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比;并将计算结果输出到文件,文件名可由键盘输入。

    F12:将每个学生的学号、姓名、各科考试成绩、总分和平均分输出到显示器;

    F13:将每个学生的个人信息和成绩写入文件,可由键盘输入文件名;

    4.函数之间的调用关系:

    以结构体数组为主体,辅以链表,通过switch函数调用各功能函数。

    Main函数负责对各个小函数的调用,而f1---f13分别完成对题目所要求的13个操作的实现,程序整体大方整洁,风格良好,有较好的结构化特点

    三、项目代码

      1 /*student achievement management system*/
      2 #include<stdio.h>
      3 #include<stdlib.h>
      4 #include<math.h>
      5 #include<string.h>
      6 #include<windows.h>
      7 #define L 32
      8 #define N 6
      9 #define M 30
     10 #define LEN sizeof(struct student)
     11 struct student
     12 {
     13     char name [L];                          ///姓名
     14     int num;                                ///学号
     15     float ach[N];                           ///成绩数组
     16     float total;                            ///总分
     17     struct student *next;
     18 };
     19 struct student stu[M];
     20 int count=0,n,m,j,i,k,l;
     21 char filename[L]={0};                       ///声明变量 存储文件名
     22 int f1(int m,int n,char filename[L]);
     23 int f2(int m,int n,char filename[L]);
     24 int f3(int m,int n,char filename[L]);
     25 int f4(int m,int n,char filename[L]);
     26 int f5(int m,int n,char filename[L]);
     27 int f6(int m,int n,char filename[L]);
     28 int f7(int m,int n,char filename[L]);
     29 int f8(int m,int n,char filename[L]);
     30 int f9(int m,int n,char filename[L]);
     31 int f10(int m,int n,char filename[L]);
     32 int f11(int m,int n,char filename[L]);
     33 int f12(int m,int n,char filename[L]);
     34 int f13(int m,int n,char filename[L]);
     35 int main()
     36 {
     37     int cishu=5;
     38  r0:    system("CLS");
     39     system("color  0C");
     40     char mima[L];
     41     printf("-------------------------------------------------------------------------------
    ");
     42     printf("|                          欢迎使用学生信息管理系统                           |");
     43     printf("-------------------------------------------------------------------------------
    ");
     44     printf("
    
    
    
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ");
     45     printf("+                         系  统  权  限  认  证                             +
    ");
     46     printf(">>>>>>>>>>>>>>>>>>>>>请提供管理员权限,输入系统启动密码<<<<<<<<<<<<<<<<<<<<<<<
    ");
     47     printf("+                                                                            +
    ");
     48     printf("+----------------------------------------------------------------------------+
    ");
     49     printf("
    >>>>>>    密  码:   ");
     50     scanf("%s",&mima);
     51     cishu --;
     52     for(;strcmp(mima,"LLL1996")!=0;)
     53     {
     54         if(cishu==0)
     55         {
     56             printf("对不起,程序即将关闭,谢谢使用");
     57             getchar();
     58             getchar();
     59             exit (1);
     60         }
     61         else
     62         {
     63             printf("对不起,密码错误,请重新输入(你还有%d次输入机会)",cishu);
     64             getchar();
     65             getchar();
     66             goto r0;
     67         }
     68     }
     69     getchar();
     70     system("CLS");
     71     system("color  BC");
     72     printf("-------------------------------------------------------------------------------
    ");
     73     printf("|                        WELCOME  TO  USE  THE  SYSTEM                         |");
     74     printf("-------------------------------------------------------------------------------
    ");
     75     printf(" 建议:1. 使用本系统时需要首先输入班级总人数、总科目数、录入信息文件   
    ");
     76     printf("       2. 如果您已经有输入文件,建议请先选择选项1,用于检查文件信息总数  
    ");
     77     printf("          与录入人数、科目数是否一致,避免计算出错         
    ");
     78     printf("       3. 如果您是初次使用本系统请先选择选项2用于创建学生信息文件,录入 
    ");
     79     printf("          信息时填写数据较多,并耐心仔细地录入学生信息 
                             O(∩_∩)O谢谢合作!!
    ");
     80     printf("-------------------------------------------------------------------------------
    
    ");
     81     printf("
    <<<< 请输入班级的总人数:     ");
     82     scanf("%d",&m);
     83     printf("
    <<<< 请输入课程总数:     ");
     84     scanf("%d",&n);
     85     printf("
    <<<< 请输入要读取或录入信息的文件的名字:     ");                   ///提示输入文件名
     86     getchar();
     87     gets(filename);                                                 ///接收输入
     88     for(j;;j++)
     89     {
     90         char  xuanze[3]={0};
     91         printf("
    
    >>>>>>>>如果想进行清屏操作请输入yes,如果想跳过清屏直接继续请按任意键!<<<<<<<<
    ");
     92         getchar();
     93         gets(xuanze);
     94         if(strcmp(xuanze,"yes")==0)    system("CLS");
     95         printf("
     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *  * * * *");
     96         printf("
     *                      欢迎进入学生成绩信息管理系统                          *");
     97         printf("
     *  一、读取文件                           >>请按1                            *");
     98         printf("
     *  二、录入学生成绩信息                   >>请按2                            *");
     99         printf("
     *  三、课程总成绩与平均分数据统计         >>请按3                            *");
    100         printf("
     *  四、学生个人总成绩与平均分统计         >>请按4                            *");
    101         printf("
     *  五、学生成绩降序排名                   >>请按5                            *");
    102         printf("
     *  六、学生成绩升序排名                   >>请按6                            *");
    103         printf("
     *  七、学生成绩按学号大小排序             >>请按7                            *");
    104         printf("
     *  八、姓名字典顺序排出成绩表             >>请按8                            *");
    105         printf("
     *  九、按学号查询学生排名及其考试成绩     >>请按9                            *");
    106         printf("
     *  十、按姓名查询学生排名及其考试成绩     >>请按10                           *");
    107         printf("
     * 十一、学生成绩各等级数据统计            >>请按11     Designd by:刘佳维     *");
    108         printf("
     * 十二、学生信息输出到屏幕                >>请按12                刘成亮     *");
    109         printf("
     * 十三、学生信息导出到文件                >>请按13                李乐       *");
    110         printf("
     *  零 、退出系统                          >>请按0                            *");
    111         printf("
     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *  * * * * * * * * * 
    ");
    112         printf("
    请从菜单中选择一项进行操作>>>>>>>>>>
    ");
    113         scanf("%d",&i);
    114         if(i==0)
    115             break;
    116         else
    117             switch(i)
    118             {
    119                 case 1: f1(m,n,filename); break;
    120                 case 2: f2(m,n,filename); break;
    121                 case 3: f3(m,n,filename); break;
    122                 case 4: f4(m,n,filename); break;
    123                 case 5: f5(m,n,filename); break;
    124                 case 6: f6(m,n,filename); break;
    125                 case 7: f7(m,n,filename); break;
    126                 case 8: f8(m,n,filename); break;
    127                 case 9: f9(m,n,filename); break;
    128                 case 10: f10(m,n,filename); break;
    129                 case 11: f11(m,n,filename); break;
    130                 case 12: f12(m,n,filename); break;
    131                 case 13: f13(m,n,filename); break;
    132                 default: break;
    133             }
    134         }
    135     printf("
    
    =====谢谢使用本系统,祝您生活愉快!=====
    
    ");               ///退出界面
    136     return 0;
    137 }
    138 int f1(int m,int n,char filename[L])
    139 {
    140     struct student card;
    141     FILE *file;
    142     if((file =fopen(filename,"rb"))!=NULL)                      ///打开 并判断
    143     {
    144         printf("=====文件打开成功!=====
    
    ");                                ///成功则提示成功
    145         count=0;
    146         while((fread(&card,sizeof(student),1,file))!=(int)NULL)
    147         {
    148             stu[i].num=card.num;
    149             strcpy(stu[i].name,card.name);
    150             for(j=0;j<n;j++)
    151                 stu[i].ach[j]=card.ach[j];
    152             stu[i].total=card.total;
    153             count++;
    154         }
    155         if(count<m)
    156             printf("=====已经录入学生信息的有%d人,还需录入%d人的信息=====
    ",count,m-count);
    157         else if(count==m)
    158             printf("=====已经录入学生信息的有%d人,已经将所有成绩信息录入完毕=====
    ",count);
    159             else
    160             {
    161                 printf("=====录入学生信息大于输入的学生总数,系统将自行关闭,请检查信息后再次进入!=====");
    162                 getchar();
    163                 exit(1);
    164             }
    165         fclose(file);
    166         return count;
    167     }
    168     else
    169     printf("=====文件打开失败!=====
    ");                                  ///打开失败则提示打开失败
    170     return 0;
    171 };
    172 int    f2(int m,int n,char filename[L])
    173 {
    174    struct student card;
    175     FILE *file;
    176     if((file =fopen(filename,"rb"))!=NULL)                      ///打开 并判断
    177     {
    178         count=0;
    179         while((fread(&card,LEN,1,file))!=(int)NULL)
    180         {
    181             stu[i].num=card.num;
    182             strcpy(stu[i].name,card.name);
    183             for(j=0;j<n;j++)
    184                 stu[i].ach[j]=card.ach[j];
    185             stu[i].total=card.total;
    186             count++;
    187         }
    188         if(count<m)
    189         {
    190             printf("=====已经录入学生信息的有%d人,还需录入%d人的信息=====
    ",count,m-count);
    191             printf("<<<< 注:录入信息时,如果想中途停止输入,以后再进行补录,请将学号输为-1,谢谢!
    ");
    192         }
    193         else  if(count==m)
    194             printf("=====已经录入学生信息的有%d人,已经将所有成绩信息录入完毕=====
    ",count);
    195             else
    196             {
    197                 printf("=====录入学生信息大于输入的学生总数,系统将自行关闭,请检查信息后再次进入!=====");
    198                 getchar();
    199                 exit(1);
    200             }
    201     }
    202     fclose(file);
    203     if((file=fopen(filename,"ab"))!=NULL)
    204     {
    205         for(count;count<m;count ++)
    206         {
    207             printf("<<<< 请输入该学生的学号:
    ");
    208             scanf("%d",&stu[count].num);
    209             if(stu[count].num==-1)
    210                 goto r2;
    211             for(j=0;j<count;j++)
    212             {
    213                 if(stu[j].num==stu[count].num)
    214                 {
    215                     printf("=====学号输入重复,输入错误,请检查后再进行录入=====
    ");
    216                     count --;
    217                     goto r2;
    218                 }
    219             }
    220             stu[count].total=0;
    221             printf("<<<< 请输入该学生的姓名:
    ");
    222             getchar();
    223             gets(stu[count].name);
    224             for(j=1;j<=n;j++)
    225             {
    226                 printf("<<<< 请输入该学生第%d门功课的成绩:",j);
    227                 scanf("%f",&stu[count].ach[j-1]);
    228                 stu[count].total=stu[count].total+stu[count].ach[j-1];
    229             }
    230             fwrite(&stu[count],LEN,1,file);
    231         }
    232     }
    233     printf("
    =====学生信息已成功录入二进制文件 %s 中,谢谢=====
    ",filename);
    234     fclose (file);
    235 r2:   return 0;
    236 };
    237 int f3(int m,int n,char filename[L])
    238 {
    239     struct student card;
    240     FILE *fp1;
    241     float zf[N]={0};
    242     fp1=fopen(filename,"rb");
    243     if(fp1==NULL)
    244     {
    245         printf("
    =====文件%s打开失败=====
    ",filename);
    246         goto  r3;
    247     }
    248     while((fread(&card,LEN,1,fp1))!=(int)NULL)
    249     {
    250         for(i=0;i<n;i++)
    251         {
    252             zf[i]=zf[i]+card.ach[i];
    253         }
    254     }
    255     printf("=====课程总成绩与平均分为=====
    ");
    256     for(i=0;i<n;i++)
    257     {
    258         printf("<<<<  第%d门课程的总成绩为%.3f    平均分为%.3f
    ",i+1,zf[i],zf[i]/m);
    259     }
    260     fclose (fp1);
    261 r3:  return 0;
    262 };
    263 int f4(int m,int n,char filename[L])
    264 {
    265     struct student card;
    266     FILE *fp1;
    267     float zf[M]={0};
    268     char nam[M][L]={0};
    269     fp1=fopen(filename,"rb");
    270     if(fp1==NULL)
    271     {
    272         printf("
    =====文件%s打开失败=====
    ",filename);
    273         goto  r4;
    274     }
    275     printf("=====学生个人总成绩与平均分为=====
    ");
    276     for(i=0;(fread(&card,LEN,1,fp1))!=(int)NULL;i++)
    277     {
    278         strcpy(nam[i],card.name);
    279         zf[i]=card.total;
    280         printf("<<<< %s的课程的总成绩为%.3f    平均分为%.3f
    ",nam[i],zf[i],zf[i]/n);
    281     }
    282     fclose (fp1);
    283 r4:    return 0;
    284 }
    285 int f5(int m,int n,char filename[L])
    286 {
    287     struct student card;
    288     FILE *fp1;
    289     fp1=fopen(filename,"rb");
    290     if(fp1==NULL)
    291     {
    292         printf("
    =====文件%s打开失败=====
    ",filename);
    293         goto  r5;
    294     }
    295     i=0;
    296     while((fread(&card,sizeof(student),1,fp1))!=(int)NULL)
    297     {
    298             stu[i].num=card.num;
    299             strcpy(stu[i].name,card.name);
    300             for(j=0;j<n;j++)
    301                 stu[i].ach[j]=card.ach[j];
    302             stu[i].total=card.total;
    303             i++;
    304     }
    305     for(k=0;k<=i;k++)
    306     {
    307         for(j=k+1;j<i;j++)
    308             if(stu[k].total<stu[j].total)
    309             {
    310                 card=stu[k];
    311                 stu[k]=stu[j];
    312                 stu[j]=card;
    313             }
    314     }
    315     printf("=====成绩正序排名为=====
    ");
    316     for(j=0;j<i;j++)
    317     {
    318          printf("<<<< 名次;%d     学号:%d      姓名:%s     总分:%.3f
    ",j+1,stu[j].num,stu[j].name,stu[j].total);
    319     }
    320     fclose (fp1);
    321 r5:    return 0;
    322 };
    323 int f6(int m,int n,char filename[L])
    324 {
    325     struct student card;
    326     FILE *fp1;
    327     fp1=fopen(filename,"rb");
    328     if(fp1==NULL)
    329     {
    330         printf("
    文件%s打开失败
    ",filename);
    331         goto  r6;
    332     }
    333     i=0;
    334     while((fread(&card,sizeof(student),1,fp1))!=(int)NULL)
    335     {
    336             stu[i].num=card.num;
    337             strcpy(stu[i].name,card.name);
    338             for(j=0;j<n;j++)
    339                 stu[i].ach[j]=card.ach[j];
    340             stu[i].total=card.total;
    341             i++;
    342     }
    343     for(k=0;k<=i;k++)
    344     {
    345         for(j=k+1;j<i;j++)
    346             if(stu[j].total<stu[k].total)
    347             {
    348                 card=stu[k];
    349                 stu[k]=stu[j];
    350                 stu[j]=card;
    351             }
    352     }
    353     printf("=====成绩倒序排名为=====
    ");
    354     for(j=0;j<i;j++)
    355     {
    356          printf("<<<< 名次;%d     学号:%d      姓名:%s     总分:%.3f
    ",m-j,stu[j].num,stu[j].name,stu[j].total);
    357     }
    358     fclose (fp1);
    359 r6:    return 0;
    360 };
    361 int f7(int m,int n,char filename[L])
    362 {
    363     struct student card;
    364     FILE *fp1;
    365     fp1=fopen(filename,"rb");
    366     if(fp1==NULL)
    367     {
    368         printf("
    =====文件%s打开失败=====
    ",filename);
    369         goto  r7;
    370     }
    371     i=0;
    372     while((fread(&card,sizeof(student),1,fp1))!=(int)NULL)
    373     {
    374             stu[i].num=card.num;
    375             strcpy(stu[i].name,card.name);
    376             for(j=0;j<n;j++)
    377                 stu[i].ach[j]=card.ach[j];
    378             stu[i].total=card.total;
    379             i++;
    380     }
    381     for(k=0;k<=i;k++)
    382     {
    383         for(j=k+1;j<i;j++)
    384             if(stu[j].num<stu[k].num)
    385             {
    386                 card=stu[k];
    387                 stu[k]=stu[j];
    388                 stu[j]=card;
    389             }
    390     }
    391     printf("=====成绩依靠学号顺序排名=====
    ");
    392     for(j=0;j<i;j++)
    393     {
    394          printf("----------------------------------------------------
    ");
    395          printf("序号;%d      学号:%d       姓名:%s
    ",j+1,stu[j].num,stu[j].name);
    396          for(k=0;k<n;k++)
    397             printf("第%d科:%.3f    ",k+1,stu[j].ach[k]);
    398          printf("
    总分%.3f      平均分%.3f
    ",stu[j].total,stu[j].total/n);
    399     }
    400     printf("----------------------------------------------------");
    401     fclose(fp1);
    402 r7:   return 0;
    403 };
    404 
    405 int f8(int m,int n,char filename[L])
    406 {
    407     struct student card;
    408     FILE *fp1;
    409     fp1=fopen(filename,"rb");
    410     if(fp1==NULL)
    411     {
    412         printf("
    =====文件%s打开失败=====
    ",filename);
    413         goto  r8;
    414     }
    415     i=0;
    416     while((fread(&card,sizeof(student),1,fp1))!=(int)NULL)
    417     {
    418             stu[i].num=card.num;
    419             strcpy(stu[i].name,card.name);
    420             for(j=0;j<n;j++)
    421                 stu[i].ach[j]=card.ach[j];
    422             stu[i].total=card.total;
    423             i++;
    424     }                                                          ///将信息读入结构体
    425     for(i=0;i<m-1;i++)
    426         for(j=i+1;j<m;j++)
    427             if(strcmp(stu[i].name,stu[j].name)>0)
    428             {
    429                   card=stu[i];
    430                   stu[i]=stu[j];
    431                   stu[j]=card;
    432             }
    433             printf("=====按姓名的字典顺序排出成绩表=====");
    434              for(k=0;k<m;k++)
    435             {
    436 
    437                 printf("----------------------------------------------------
    ");
    438                 printf("序号;%d      学号:%d       姓名:%s
    ",k+1,stu[k].num,stu[k].name);
    439                 for(i=0;i<n;i++)
    440                     printf("第%d科:%.3f    ",i+1,stu[k].ach[i]);
    441                 printf("
    总分%.3f      平均分%.3f
    ",stu[k].total,stu[k].total/n);
    442             }
    443     printf("----------------------------------------------------");
    444     fclose(fp1);
    445 r8: return 0;
    446 };
    447 int f9(int m,int n,char filename[L])
    448 {
    449     struct student *head,*p1,*p2;
    450     int ChooseNum;
    451     printf("=====请输入要查询信息的学生的学号:=====
    ");
    452     scanf("%d",&ChooseNum);
    453     struct student card;
    454     FILE *fp1;
    455     fp1=fopen(filename,"rb");
    456     if(fp1==NULL)
    457     {
    458         printf("
    =====文件%s打开失败=====
    ",filename);
    459         goto  r9;
    460     }
    461     i=0;
    462     while((fread(&card,LEN,1,fp1))!=(int)NULL)
    463     {
    464             stu[i].num=card.num;
    465             strcpy(stu[i].name,card.name);
    466             for(j=0;j<n;j++)
    467                 stu[i].ach[j]=card.ach[j];
    468             stu[i].total=card.total;
    469             i++;
    470     }                                                                ///读入到结构体数组
    471     for(k=0;k<=i;k++)
    472     {
    473         for(j=k+1;j<i;j++)
    474             if(stu[k].total<stu[j].total)
    475             {
    476                 card=stu[k];
    477                 stu[k]=stu[j];
    478                 stu[j]=card;
    479             }
    480     }                                                                ///排名
    481     head=&stu[0];
    482     p1=&stu[1];
    483     p2=NULL;
    484     head->next=p1;
    485     p1->next=p2;                                                    ///建立链表
    486     if(head->num==ChooseNum)
    487     {
    488          {
    489             printf("名次;%d      学号:%d       姓名:%s
    ",i+1,head->num,head->name);
    490             for(k=0;k<n;k++)
    491                 printf("第%d科:%.3f    ",k+1,head->ach[k]);
    492             printf("
    总分%.3f      平均分%.3f
    ",head->total,head->total/n);
    493             goto r9;
    494          }
    495     }
    496     else
    497         for(i=1;1<m;i++)
    498         {
    499             p1=&stu[i];
    500             p1->next=p2;
    501             if(p1->num==ChooseNum)
    502             {
    503                 printf("名次;%d      学号:%d       姓名:%s
    ",i+1,p1->num,p1->name);
    504                 for(k=0;k<n;k++)
    505                     printf("第%d科:%.3f    ",k+1,p1->ach[k]);
    506                 printf("
    总分%.3f      平均分%.3f
    ",p1->total,p1->total/n);
    507                 goto r9;
    508             }
    509             else {
    510                 printf("没有该学号!!!!!!");
    511                 goto r9;
    512             }
    513         }
    514 r9:  return 0;
    515 }
    516 int f10(int m,int n,char filename[L])
    517 {
    518     char ChooseName[L];
    519     printf("<<<< 请输入要查询的学生的姓名:
    ");
    520     getchar();
    521     gets(ChooseName);
    522     struct student card;
    523     FILE *fp1;
    524     fp1=fopen(filename,"rb");
    525     if(fp1==NULL)
    526     {
    527         printf("
    =====文件%s打开失败=====
    ",filename);
    528         goto  r10;
    529     }
    530     i=0;
    531     while((fread(&card,sizeof(student),1,fp1))!=(int)NULL)
    532     {
    533             stu[i].num=card.num;
    534             strcpy(stu[i].name,card.name);
    535             for(j=0;j<n;j++)
    536                 stu[i].ach[j]=card.ach[j];
    537             stu[i].total=card.total;
    538             i++;
    539     }
    540     for(k=0;k<=i;k++)
    541     {
    542         for(j=k+1;j<i;j++)
    543             if(stu[k].total<stu[j].total)
    544             {
    545                 card=stu[k];
    546                 stu[k]=stu[j];
    547                 stu[j]=card;
    548             }
    549     }
    550     printf("=====按姓名查询学生排名及其考试成绩=====
    ");
    551      for(j=0;j<i;j++)
    552     {
    553         if(strcmp(stu[j].name,ChooseName)==0)
    554         {
    555             printf("----------------------------------------------------
    ");
    556             printf("名次;%d      学号:%d       姓名:%s
    ",j+1,stu[j].num,stu[j].name);
    557             for(k=0;k<n;k++)
    558                 printf("第%d科:%.3f    ",k+1,stu[j].ach[k]);
    559             printf("
    总分%.3f      平均分%.3f
    ",stu[j].total,stu[j].total/n);
    560         }
    561     }
    562     printf("----------------------------------------------------");
    563     fclose(fp1);
    564  r10:  return 0;
    565 };
    566 int f11(int m,int n,char filename[L])
    567 {
    568     char  output[L];
    569     float a=0,b=0,c=0,d=0,e=0;
    570     struct student card;
    571     FILE *fp1,*fp2;
    572     fp1=fopen(filename,"rb");
    573     printf("
    <<<< 请输入要输出到文件的名字:
    ");                   ///提示输入文件名
    574     getchar();
    575     gets(output);                                                 ///接收输入
    576     fp2=fopen(output,"w");
    577     if(fp1==NULL)
    578     {
    579         printf("
    =====文件%s打开失败=====
    ",filename);
    580         goto  r11;
    581     }
    582     if(fp2==NULL)
    583     {
    584         printf("
    =====文件%s打开失败=====
    ",output);
    585         goto  r11;
    586     }
    587     i=0;
    588     while((fread(&card,sizeof(student),1,fp1))!=(int)NULL)
    589     {
    590             stu[i].num=card.num;
    591             strcpy(stu[i].name,card.name);
    592             for(j=0;j<n;j++)
    593                 stu[i].ach[j]=card.ach[j];
    594             stu[i].total=card.total;
    595             i++;
    596     }
    597     fprintf(fp2,"=======================================各科目成绩分析=============================================
    总参考人数:%d
    考试科目数:%d
    ",i,n);
    598     fprintf(fp2,"   科目     优秀(比例)      良好(比例)     中等(比例)     及格(比例)     不及格(比例)
    ");
    599     fprintf(fp2,"             <90-100>           <80-89>          <70-79>          <60-69>           <0-59>
    ");
    600     fprintf(fp2,"==================================================================================================
    ");
    601     for(k=0;k<n;k++)       ///课程
    602     {
    603         a=0,b=0,c=0,d=0,e=0;
    604         for(j=0;j<m;j++)    ///学生
    605         {
    606             if((stu[j].ach[k]<=100)&&(stu[j].ach[k]>=90))
    607                 a++;
    608             else if((stu[j].ach[k]<=89)&&(stu[j].ach[k]>=80))
    609                     b++;
    610                 else if((stu[j].ach[k]<=79)&&(stu[j].ach[k]>70))
    611                         c++;
    612                     else if((stu[j].ach[k]<=69)&&(stu[j].ach[k]>=60))
    613                             d++;
    614                         else if((stu[j].ach[k]<=59)&&(stu[j].ach[k]>=0))
    615                                 e++;
    616         }
    617         fprintf(fp2,"   第%d科     %.0f人(%.3f%%)    %.0f人(%.3f%%)    %.0f人(%.3f%%)    %.0f人(%.3f%%)    %.0f人(%.3f%%)
    ",k+1,a,a/m*100,b,b/m*100,c,c/m*100,d,d/m*100,e,e/m*100);
    618     }
    619     printf("=====已经将所有信息写入到文件%s中,请注意接收!=====
    ",output);
    620 r11:  return 0;
    621 };
    622 int f12(int m,int n,char filename[L])
    623 {
    624     struct student card;
    625     FILE *fp1;
    626     fp1=fopen(filename,"rb");
    627     if(fp1==NULL)
    628     {
    629         printf("
    =====文件%s打开失败=====
    ",filename);
    630         goto  r12;
    631     }
    632     i=0;
    633     while((fread(&card,sizeof(student),1,fp1))!=(int)NULL)
    634     {
    635             stu[i].num=card.num;
    636             strcpy(stu[i].name,card.name);
    637             for(j=0;j<n;j++)
    638                 stu[i].ach[j]=card.ach[j];
    639             stu[i].total=card.total;
    640             i++;
    641     }
    642     for(k=0;k<=i;k++)
    643     {
    644         for(j=k+1;j<i;j++)
    645             if(stu[k].total<stu[j].total)
    646             {
    647                 card=stu[k];
    648                 stu[k]=stu[j];
    649                 stu[j]=card;
    650             }
    651     }
    652     printf("=====学生所有信息屏幕输出=====
    ");
    653      for(j=0;j<i;j++)
    654     {
    655          printf("----------------------------------------------------
    ");
    656          printf("名次;%d      学号:%d       姓名:%s
    ",j+1,stu[j].num,stu[j].name);
    657          for(k=0;k<n;k++)
    658             printf("第%d科:%.3f    ",k+1,stu[j].ach[k]);
    659          printf("
    总分%.3f      平均分%.3f
    ",stu[j].total,stu[j].total/n);
    660     }
    661     printf("----------------------------------------------------");
    662     fclose(fp1);
    663  r12:  return 0;
    664 };
    665 int f13(int m,int n,char filename[L])
    666 {
    667     char  output[L]={0};
    668     struct student card;
    669     FILE *fp1,*fp2;
    670     fp1=fopen(filename,"rb");
    671     printf("
    <<<< 请输入要输出到文件的名字:
    ");                   ///提示输入文件名
    672     getchar();
    673     gets(output);                                                 ///接收输入
    674     fp2=fopen(output,"w");
    675     if(fp1==NULL)
    676     {
    677         printf("
    =====文件%s打开失败=====
    ",filename);
    678         goto  r13;
    679     }
    680     if(fp2==NULL)
    681     {
    682         printf("
    =====文件%s打开失败=====
    ",output);
    683         goto  r13;
    684     }
    685     i=0;
    686     while((fread(&card,LEN,1,fp1))!=(int)NULL)
    687     {
    688             stu[i].num=card.num;
    689             strcpy(stu[i].name,card.name);
    690             for(j=0;j<n;j++)
    691                 stu[i].ach[j]=card.ach[j];
    692             stu[i].total=card.total;
    693             i++;
    694     }
    695     for(k=0;k<=i;k++)
    696     {
    697         for(j=k+1;j<i;j++)
    698             if(stu[k].total<stu[j].total)
    699             {
    700                 card=stu[k];
    701                 stu[k]=stu[j];
    702                 stu[j]=card;
    703             }
    704     }
    705     printf("=====已经将所有信息写入到文件%s中,请注意接收!=====
    ",output);
    706      for(j=0;j<i;j++)
    707     {
    708          fprintf(fp2,"----------------------------------------------------
    ");
    709          fprintf(fp2,"名次;%d      学号:%d       姓名:%s
    ",j+1,stu[j].num,stu[j].name);
    710          for(k=0;k<n;k++)
    711             fprintf(fp2,"第%d科:%.3f    ",k+1,stu[j].ach[k]);
    712          fprintf(fp2,"
    总分%.3f      平均分%.3f
    ",stu[j].total,stu[j].total/n);
    713     }
    714     fprintf(fp2,"----------------------------------------------------");
    715     fclose(fp1);
    716     fclose(fp2);
    717  r13:  return 0;
    718 };
    View Code

     

    四、程序备注

    这是笔者在大一刚学c的时候做的,虽然简单,但实现了所有上文的功能,今天不知咋的,突然翻了出来,心想不如写入博客,也算留个备份

    笔者在vc6.0和codeblocks下均通过运行,进入系统的密码为LLL1996

    本程序纯属原创,如有引用,请注明出处

  • 相关阅读:
    JAVA与编译语言及解释语言的关系
    Java虚拟机工作原理详解
    VMWare 网络连接模式(bridged、NAT、host-only)详解
    Ubuntu修改语言环境为英文
    Ubuntu安装和设置SSH服务
    Eclipse NDK 配置
    2018年长沙理工大学第十三届程序设计竞赛
    埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛
    算法训练 安慰奶牛
    算法训练 最短路
  • 原文地址:https://www.cnblogs.com/liujw2114/p/6604511.html
Copyright © 2020-2023  润新知