首页 > 代码库 > [项目记录] 用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 else117 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 else160 {161 printf("=====录入学生信息大于输入的学生总数,系统将自行关闭,请检查信息后再次进入!=====");162 getchar();163 exit(1);164 }165 fclose(file);166 return count;167 }168 else169 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 else196 {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 else497 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 };
四、程序备注
这是笔者在大一刚学c的时候做的,虽然简单,但实现了所有上文的功能,今天不知咋的,突然翻了出来,心想不如写入博客,也算留个备份
笔者在vc6.0和codeblocks下均通过运行,进入系统的密码为LLL1996
本程序纯属原创,如有引用,请注明出处
[项目记录] 用c语言完成的一个学生成绩管理系统