[项目记录] 用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 };
四、程序备注
这是笔者在大一刚学c的时候做的,虽然简单,但实现了所有上文的功能,今天不知咋的,突然翻了出来,心想不如写入博客,也算留个备份
笔者在vc6.0和codeblocks下均通过运行,进入系统的密码为LLL1996
本程序纯属原创,如有引用,请注明出处