zoukankan      html  css  js  c++  java
  • [项目记录] 用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

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

  • 相关阅读:
    70. 爬楼梯
    278. 第一个错误的版本
    88. 合并两个有序数组
    C++string与int的相互转换(使用C++11)
    108. 将有序数组转换为二叉搜索树
    102. 二叉树的层次遍历
    101. 对称二叉树
    98. 验证二叉搜索树
    ServletContext对象
    ServletConfig对象
  • 原文地址:https://www.cnblogs.com/liujw2114/p/6604511.html
Copyright © 2011-2022 走看看