[项目记录] 用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

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

原文地址:https://www.cnblogs.com/liujw2114/p/6604511.html