[項目記錄] 用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("-------------------------------------------------------------------------------\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的時候做的,雖然簡單,但實現了所有上文的功能,今天不知咋的,突然翻了出來,心想不如寫入博客,也算留個備份

筆者在vc6.0和codeblocks下均通過運行,進入系統的密碼為LLL1996

本程序純屬原創,如有引用,請注明出處

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM