摘要:本文主要向大家介绍了C/C++知识点之用c语言完成的一个学生成绩管理系统,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。
本文主要向大家介绍了C/C++知识点之用c语言完成的一个学生成绩管理系统,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。
一、要求:学生成绩管理系统
某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入)。使用链表编程实现如下菜单驱动的学生成绩管理系统。
从文件读入每个学生个人信息和成绩信息,可以由键盘输入文件名。读入成功提示读入学生记录的个数,不成功提示相应出错信息。
增量式手动录入每个学生的学号、姓名和各科考试成绩。不考虑中文姓名,但需要考虑重名情况下的处理,学生的学号是唯一的。
计算每门课程的总分和平均分;
计算每个学生的总分和平均分;
按每个学生的总分由高到低排出名次表;
按每个学生的总分由低到高排出名次表;
按学号由小到大排出成绩表;
按姓名的字典顺序排出成绩表;
按学号查询学生排名及其考试成绩;
按姓名查询学生排名及其考试成绩;需要考虑学生重名的情况。
按优秀(100-90)、良好(89-80)、中等(79-70)、及格(69-60)、不及格(59-0)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比;并将计算结果输出到文件,文件名可由键盘输入。
将每个学生的学号、姓名、各科考试成绩、总分和平均分输出到显示器;
将每个学生的个人信息和成绩写入文件,可由键盘输入文件名;
二、程序结构与设计
模块划分:
整个函数划分为:
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("-------------------------------------------------------------------------------\n");
42 printf("| 欢迎使用学生信息管理系统 |");
43 printf("-------------------------------------------------------------------------------\n");
44 printf("\n\n\n\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
45 printf("+ 系 统 权 限 认 证 +\n");
46 printf(">>>>>>>>>>>>>>>>>>>>>请提供管理员权限,输入系统启动密码<<<<<<<<<<<<<<<<<<<<<<<\n");
47 printf("+ +\n");
48 printf("+----------------------------------------------------------------------------+\n");
49 printf("\n>>>>>> 密 码: ");
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("-------------------------------------------------------------------------------\n");
73 printf("| WELCOME TO USE THE SYSTEM |");
74 printf("-------------------------------------------------------------------------------\n");
75 printf(" 建议:1. 使用本系统时需要首先输入班级总人数、总科目数、录入信息文件 \n");
76 printf(" 2. 如果您已经有输入文件,建议请先选择选项1,用于检查文件信息总数 \n");
77 printf(" 与录入人数、科目数是否一致,避免计算出错 \n");
78 printf(" 3. 如果您是初次使用本系统请先选择选项2用于创建学生信息文件,录入 \n");
79 printf(" 信息时填写数据较多,并耐心仔细地录入学生信息 \n O(∩_∩)O谢谢合作!!\n");
80 printf("-------------------------------------------------------------------------------\n\n");
81 printf("\n<<<< 请输入班级的总人数: ");
82 scanf("%d",&m);
83 printf("\n<<<< 请输入课程总数: ");
84 scanf("%d",&n);
85 printf("\n<<<< 请输入要读取或录入信息的文件的名字: "); ///提示输入文件名
86 getchar();
87 gets(filename); ///接收输入
88 for(j;;j++)
89 {
90 char xuanze[3]={0};
91 printf("\n\n>>>>>>>>如果想进行清屏操作请输入yes,如果想跳过清屏直接继续请按任意键!<<<<<<<<\n");
92 getchar();
93 gets(xuanze);
94 if(strcmp(xuanze,"yes")==0) system("CLS");
95 printf("\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *");
96 printf("\n * 欢迎进入学生成绩信息管理系统 *");
97 printf("\n * 一、读取文件 >>请按1 *");
98 printf("\n * 二、录入学生成绩信息 >>请按2 *");
99 printf("\n * 三、课程总成绩与平均分数据统计 >>请按3 *");
100 printf("\n * 四、学生个人总成绩与平均分统计 >>请按4 *");
101 printf("\n * 五、学生成绩降序排名 >>请按5 *");
102 printf("\n * 六、学生成绩升序排名 >>请按6 *");
103 printf("\n * 七、学生成绩按学号大小排序 >>请按7 *");
104 printf("\n * 八、姓名字典顺序排出成绩表 >>请按8 *");
105 printf("\n * 九、按学号查询学生排名及其考试成绩 >>请按9 *");
106 printf("\n * 十、按姓名查询学生排名及其考试成绩 >>请按10 *");
107 printf("\n * 十一、学生成绩各等级数据统计 >>请按11 Designd by:刘佳维 *");
108 printf("\n * 十二、学生信息输出到屏幕 >>请按12 刘成亮 *");
109 printf("\n * 十三、学生信息导出到文件 >>请按13 李乐 *");
110 printf("\n * 零 、退出系统 >>请按0 *");
111 printf("\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \n");
112 printf("\n请从菜单中选择一项进行操作>>>>>>>>>>\n");
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("\n\n=====谢谢使用本系统,祝您生活愉快!=====\n\n"); ///退出界面
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("=====文件打开成功!=====\n\n"); ///成功则提示成功
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人的信息=====\n",count,m-count);
157 else if(count==m)
158 printf("=====已经录入学生信息的有%d人,已经将所有成绩信息录入完毕=====\n",count);
159 else
160 {
161 printf("=====录入学生信息大于输入的学生总数,系统将自行关闭,请检查信息后再次进入!=====");
162 getchar();
163 exit(1);
164 }
165 fclose(file);
166 return count;
167 }
168 else
169 printf("=====文件打开失败!=====\n"); ///打开失败则提示打开失败
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人的信息=====\n",count,m-count);
191 printf("<<<< 注:录入信息时,如果想中途停止输入,以后再进行补录,请将学号输为-1,谢谢!\n");
192 }
193 else if(count==m)
194 printf("=====已经录入学生信息的有%d人,已经将所有成绩信息录入完毕=====\n",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("<<<< 请输入该学生的学号:\n");
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("=====学号输入重复,输入错误,请检查后再进行录入=====\n");
216 count --;
217 goto r2;
218 }
219 }
220 stu[count].total=0;
221 printf("<<<< 请输入该学生的姓名:\n");
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("\n=====学生信息已成功录入二进制文件 %s 中,谢谢=====\n",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("\n=====文件%s打开失败=====\n",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("=====课程总成绩与平均分为=====\n");
256 for(i=0;i<n;i++)
257 {
258 printf("<<<< 第%d门课程的总成绩为%.3f 平均分为%.3f\n",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("\n=====文件%s打开失败=====\n",filename);
273 goto r4;
274 }
275 printf("=====学生个人总成绩与平均分为=====\n");
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\n",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("\n=====文件%s打开失败=====\n",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("=====成绩正序排名为=====\n");
316 for(j=0;j<i;j++)
317 {
318 printf("<<<< 名次;%d 学号:%d 姓名:%s 总分:%.3f\n",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("\n文件%s打开失败\n",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("=====成绩倒序排名为=====\n");
354 for(j=0;j<i;j++)
355 {
356 printf("<<<< 名次;%d 学号:%d 姓名:%s 总分:%.3f\n",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("\n=====文件%s打开失败=====\n",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("=====成绩依靠学号顺序排名=====\n");
392 for(j=0;j<i;j++)
393 {
394 printf("----------------------------------------------------\n");
395 printf("序号;%d 学号:%d 姓名:%s\n",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("\n总分%.3f 平均分%.3f\n",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("\n=====文件%s打开失败=====\n",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("----------------------------------------------------\n");
438 printf("序号;%d 学号:%d 姓名:%s\n",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("\n总分%.3f 平均分%.3f\n",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("=====请输入要查询信息的学生的学号:=====\n");
452 scanf("%d",&ChooseNum);
453 struct student card;
454 FILE *fp1;
455 fp1=fopen(filename,"rb");
456 if(fp1==NULL)
457 {
458 printf("\n=====文件%s打开失败=====\n",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\n",i+1,head->num,head->name);
490 for(k=0;k<n;k++)
491 printf("第%d科:%.3f ",k+1,head->ach[k]);
492 printf("\n总分%.3f 平均分%.3f\n",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\n",i+1,p1->num,p1->name);
504 for(k=0;k<n;k++)
505 printf("第%d科:%.3f ",k+1,p1->ach[k]);
506 printf("\n总分%.3f 平均分%.3f\n",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("<<<< 请输入要查询的学生的姓名:\n");
520 getchar();
521 gets(ChooseName);
522 struct student card;
523 FILE *fp1;
524 fp1=fopen(filename,"rb");
525 if(fp1==NULL)
526 {
527 printf("\n=====文件%s打开失败=====\n",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("=====按姓名查询学生排名及其考试成绩=====\n");
551 for(j=0;j<i;j++)
552 {
553 if(strcmp(stu[j].name,ChooseName)==0)
554 {
555 printf("----------------------------------------------------\n");
556 printf("名次;%d 学号:%d 姓名:%s\n",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("\n总分%.3f 平均分%.3f\n",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("\n<<<< 请输入要输出到文件的名字:\n"); ///提示输入文件名
574 getchar();
575 gets(output); ///接收输入
576 fp2=fopen(output,"w");
577 if(fp1==NULL)
578 {
579 printf("\n=====文件%s打开失败=====\n",filename);
580 goto r11;
581 }
582 if(fp2==NULL)
583 {
584 printf("\n=====文件%s打开失败=====\n",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,"=======================================各科目成绩分析=============================================\n总参考人数:%d\n考试科目数:%d\n",i,n);
598 fprintf(fp2," 科目 优秀(比例) 良好(比例) 中等(比例) 及格(比例) 不及格(比例)\n");
599 fprintf(fp2," <90-100> <80-89> <70-79> <60-69> <0-59>\n");
600 fprintf(fp2,"==================================================================================================\n");
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%%)\n",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中,请注意接收!=====\n",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("\n=====文件%s打开失败=====\n",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("=====学生所有信息屏幕输出=====\n");
653 for(j=0;j<i;j++)
654 {
655 printf("----------------------------------------------------\n");
656 printf("名次;%d 学号:%d 姓名:%s\n",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("\n总分%.3f 平均分%.3f\n",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("\n<<<< 请输入要输出到文件的名字:\n"); ///提示输入文件名
672 getchar();
673 gets(output); ///接收输入
674 fp2=fopen(output,"w");
675 if(fp1==NULL)
676 {
677 printf("\n=====文件%s打开失败=====\n",filename);
678 goto r13;
679 }
680 if(fp2==NULL)
681 {
682 printf("\n=====文件%s打开失败=====\n",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中,请注意接收!=====\n",output);
706 for(j=0;j<i;j++)
707 {
708 fprintf(fp2,"----------------------------------------------------\n");
709 fprintf(fp2,"名次;%d 学号:%d 姓名:%s\n",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,"\n总分%.3f 平均分%.3f\n",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的时候做的,虽然简单,但实现了所有上文的功能,今天不知咋的,突然翻了出来,心想不如写入博客,也算留个备份
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号