本文為大大維原創,最早於博客園發表,轉載請注明出處!!!
一、要求:
學生成績管理系統
某班有最多不超過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
本程序純屬原創,如有引用,請注明出處
