學生成績管理系統(數據結構課程設計)


學生成績管理問題 

問題描述:建立兩個學生成績信息表1、2,以文件的形式分別進行存儲命名為1.txt和2.txt,然后實現將兩個文件合並成一個新的文件3.txt。

新文件中有補考的學生查找到,存儲到另一個文件4.txt中。

    基本要求:

      1、學生成績信息表至少包含姓名、學號、語文成績、數學成績、英語成績、總分。

      2、合並后的文件3.txt中的數據要按照總分進行降序排序。(排序方法為直接插入排序)

      3、根據學生姓名和學號應該能查到學生的各科成績。(查找方法為折半查找)

    4、存儲結構為順序表。

  1 /*
  2 ***************************************************************************************************************************** 
  3 knocker:1.void read(char str[40]);讀取文本
  4         2. Status InitList(SqList *L); 構造空的順序表 L 
  5         3 Status fuzhi_sq(SqList *L,SqList *L3); 將txt1,2中的數據傳到順序表中
  6         4.void InsertSort(SqList &L);直接插入排序
  7         5.void Create(SqList &L,char str[40]); 生成txt3,4
  8         6. void find_bukao(SqList &L,SqList &L2); 找出補考學生 
  9         7.int Search_id(SqList &L,char k[]);根據學號查找 (折半查找)
 10         8.int Search_name(SqList &L,char k[]);按姓名查找 
 11         9.void tianjia_stu(ElemType e,char str[40]); 添加學生信息
 12         10.void Delete_stu(SqList &L,int id,int n); 刪除學生信息 
 13         11.void Xiugai_stu(SqList &L,int id);修改學生信息
 14         12.void Output(SqList &L);顯示學生信息 
 15 *****************************************************************************************************************************        
 16 */ 
 17 #include<stdio.h>
 18 #include<malloc.h>
 19 #include<stdlib.h>
 20 #include<string.h>
 21 #define OK 1
 22 #define ERROR 0
 23 #define OVERFLOW -2
 24 #define MAXSIZE 100
 25 float sum;
 26 char str1[20]={"D:\\1.txt"};
 27 char str2[20]={"D:\\2.txt"};
 28 char str3[40]={"D:\\3.txt"};
 29 char str4[40]={"D:\\4.txt"};
 30 typedef int Status; // 定義函數返回值類型
 31 
 32  struct student
 33 {
 34     char num[10]; // 學號
 35     char name[20]; // 姓名
 36     int chinese; //語文成績 
 37     int math;//數學成績
 38     int English;//英語成績
 39     int sum;//總分 
 40 }*p,*q,u,s[3],r[MAXSIZE],c[MAXSIZE];
 41  
 42 typedef student ElemType;
 43 //順序表 
 44 typedef struct
 45 {
 46     ElemType *elem; // 存儲空間的基地址 
 47     int length; // 當前長度 
 48 }SqList;
 49 Status fuzhi_sq(SqList *L);
 50 //讀取文檔1,2 
 51 void read(char str[40])
 52 {
 53     FILE *fp;
 54     int i;
 55     p=c;
 56     if((fp=fopen(str,"rt"))==NULL)
 57     {
 58         printf("cannot open this file\n");
 59         
 60         exit(0);
 61     }
 62     printf("姓名\t學號\t語文\t數學\t英語\t總分\n");
 63     for(i=0;!feof(fp);i++,p++)
 64     fscanf(fp,"%s\t%s\t%d\t%d\t%d\t%d\n",&p->name,&p->num,&p->chinese,&p->math,&p->English,&p->sum);
 65     fclose(fp);
 66     for(int j=0;j<i;j++)
 67     printf("%s\t%s\t%d\t%d\t%d\t%d\n",c[j].name,c[j].num,c[j].chinese,c[j].math,c[j].English,c[j].sum);
 68 
 69     
 70  } 
 71 Status InitList(SqList *L) // 構造空的順序表 L 
 72 {    
 73     L->elem=(ElemType *)malloc(sizeof(ElemType)*MAXSIZE);
 74     if(!L->elem)  exit(OVERFLOW);
 75     L->length=0;
 76     return OK;
 77 }
 78 //將txt1,2中的數據傳到順序表中 
 79 Status fuzhi_sq(SqList *L,SqList *L3) 
 80 {
 81 
 82     FILE *fp;
 83     //把txt1內容輸到數組s[3] 
 84     int i,k;
 85     p=s;
 86     if((fp=fopen(str1,"rt"))==NULL)
 87     {
 88         printf("cannot open this file\n");
 89         
 90         exit(0);
 91     }
 92     for(i=0;!feof(fp);i++,p++)
 93     fscanf(fp,"%s\t%s\t%d\t%d\t%d\t%d\n",&p->name,&p->num,&p->chinese,&p->math,&p->English,&p->sum);
 94     fclose(fp);
 95 
 96     //把txt2內容輸到數組r[3] 
 97     int j,n,m;
 98     q=r;
 99     if((fp=fopen(str2,"rt"))==NULL)
100     {
101         printf("cannot open this file\n");
102         
103         exit(0);
104     }
105     for(n=0;!feof(fp);n++,q++)
106     fscanf(fp,"%s\t%s\t%d\t%d\t%d\t%d\n",&q->name,&q->num,&q->chinese,&q->math,&q->English,&q->sum);
107     fclose(fp);
108 //數組s[3],r[MAXSIZE]合並到數組c[MAXSIZE]    
109     for(j=0;j<i;j++)
110     c[j]=s[j];
111     for(int l=0,j=i;j<n+i;j++,l++)
112     c[j]=r[l];
113     for(j=0;j<n+i;j++)
114     L->elem[j+1]=c[j];
115     L->length=j+1;
116     for(j=0;j<n+i;j++)
117     L3->elem[j+1]=c[j];    
118     L3->length=j+1;
119     
120 }
121 //直接插入排序
122 void InsertSort(SqList &L)
123 {
124     int j;
125     for(int i=2;i<=L.length-1;i++)
126     if(L.elem[i].sum>L.elem[i-1].sum)
127     {
128         L.elem[0]=L.elem[i];
129         L.elem[i]=L.elem[i-1];
130         for(j=i-2;L.elem[0].sum>L.elem[j].sum;j--)
131         L.elem[j+1]=L.elem[j];
132         L.elem[j+1]=L.elem[0];    
133     }
134 
135  } 
136  //生成txt3,4
137 void Create(SqList &L,char str[40])
138 {
139     FILE *fp;
140     p=c;
141     int i;
142     fp=fopen(str,"wt");
143     for(int i=0;i<L.length-1;i++)
144     fprintf(fp,"%s\t%s\t%d\t%d\t%d\t%d\n",L.elem[i+1].name,L.elem[i+1].num,L.elem[i+1].chinese,L.elem[i+1].math,L.elem[i+1].English,L.elem[i+1].sum);
145     fclose(fp);
146     if((fp=fopen(str,"rt"))==NULL)
147     {
148         printf("cannot open this file\n");
149         
150         exit(0);
151     }
152     printf("姓名\t學號\t語文\t數學\t英語\t總分\n");
153     for(i=0;!feof(fp);i++,p++)
154     fscanf(fp,"%s%s%d%d%d%d",&p->name,&p->num,&p->chinese,&p->math,&p->English,&p->sum);
155     fclose(fp);
156     for(p=c;p<c+i-1;p++)
157     printf("%s\t%s\t%d\t%d\t%d\t%d\n",p->name,p->num,p->chinese,p->math,p->English,p->sum);    
158  } 
159  //找出補考學生 
160 void find_bukao(SqList &L,SqList &L2)
161 {
162     int j=1;
163     for(int i=0;i<L.length-1;i++)
164     if(L.elem[i+1].chinese<60||L.elem[i+1].math<60||L.elem[i+1].English<60)
165     {
166     
167         L2.elem[j]=L.elem[i+1];
168         j++;                
169     }
170     L2.length=j;
171 } 
172 
173 ElemType GetElem(SqList &L,int i) // 訪問順序表,找到 i位置,返回給 e
174 {
175     return L.elem[i];
176 }
177 //根據學號查找 
178 int Search_id(SqList &L,char k[]) 
179 {
180     int low = 1;
181     int high = L.length;
182     while(low <= high)
183     {
184         int mid = (low + high) / 2;
185         if(strcmp(k,L.elem[mid].num)==0)
186         {
187             return mid;
188     }
189         else if(strcmp(k,L.elem[mid].num)<0)
190         {
191             high = mid - 1;
192         }
193         else
194         {
195             low = mid + 1;
196         }
197     }
198   
199     return 0;
200 }
201 //按姓名查找 
202 int Search_name(SqList &L,char k[]) 
203 {
204     for(int i=1;i<L.length;i++)
205     {
206         if(strcmp(L.elem[i].name,k)==0)
207         return i;
208     }
209     
210 } 
211 //添加學生信息
212 void tianjia_stu(ElemType e,char str[40]) 
213 {
214     FILE *fp;
215     fp=fopen(str,"at");    
216     fprintf(fp,"\n%s\t%s\t%d\t%d\t%d\t%d",e.name,e.num,e.chinese,e.math,e.English,e.sum);
217     fclose(fp);
218 }
219 //刪除學生信息 
220 void Delete_stu(SqList &L,int id,int n) 
221 {
222     for(int j=id;j<L.length-1;j++)
223     L.elem[j]=L.elem[j+1];
224     L.length-=1;
225     for(int i=0;i<L.length-1;i++)
226     printf("%s\t%s\t%d\t%d\t%d\t%d\n",L.elem[i+1].name,L.elem[i+1].num,L.elem[i+1].chinese,L.elem[i+1].math,L.elem[i+1].English,L.elem[i+1].sum);
227     
228     FILE *fp;
229     if(id<=3)
230     {
231         fp=fopen(str1,"wt");
232         for(int i=0;i<3-n;i++)
233         fprintf(fp,"%s\t%s\t%d\t%d\t%d\t%d\n",L.elem[i+1].name,L.elem[i+1].num,L.elem[i+1].chinese,L.elem[i+1].math,L.elem[i+1].English,L.elem[i+1].sum);
234         fclose(fp);
235 
236     }
237     else
238     {
239         fp=fopen(str2,"wt");
240         for(int i=3;i<L.length-n;i++)
241         fprintf(fp,"%s\t%s\t%d\t%d\t%d\t%d\n",L.elem[i+1].name,L.elem[i+1].num,L.elem[i+1].chinese,L.elem[i+1].math,L.elem[i+1].English,L.elem[i+1].sum);
242         fclose(fp);
243     
244     }
245 }
246 //修改學生信息
247 void Xiugai_stu(SqList &L,int id)
248 {
249     int m;
250     printf("\n1:語文\t2:數學\t3:英語\n");    
251     printf("請選擇要修改的科目:");
252 L102:    scanf("%d",&m);
253         getchar();
254         if(m==1)
255             {
256             printf("請輸入要修改的語文成績:");
257             scanf("%d",&L.elem[id].chinese);
258             L.elem[id].sum=L.elem[id].chinese+L.elem[id].math+L.elem[id].English;
259         }
260         else if(m==2)
261         {
262             printf("請輸入要修改的數學成績:");
263             scanf("%d",&L.elem[id].math);
264             L.elem[id].sum=L.elem[id].chinese+L.elem[id].math+L.elem[id].English;
265         }
266         else if(m==3)
267         {
268             printf("請輸入要修改的英語成績:");
269             scanf("%d",&L.elem[id].English);
270             L.elem[id].sum=L.elem[id].chinese+L.elem[id].math+L.elem[id].English;
271         }
272         else
273         {
274             printf("請按提示輸入。\n");
275             goto    L102;
276         }    
277     FILE *fp;
278     if(id<=3)
279     {
280         fp=fopen(str1,"wt");
281         for(int i=0;i<3;i++)
282         fprintf(fp,"%s\t%s\t%d\t%d\t%d\t%d\n",L.elem[i+1].name,L.elem[i+1].num,L.elem[i+1].chinese,L.elem[i+1].math,L.elem[i+1].English,L.elem[i+1].sum);
283         fclose(fp);
284 
285     }
286     else
287     {
288         fp=fopen(str2,"wt");
289         for(int i=3;i<L.length-1;i++)
290         fprintf(fp,"%s\t%s\t%d\t%d\t%d\t%d\n",L.elem[i+1].name,L.elem[i+1].num,L.elem[i+1].chinese,L.elem[i+1].math,L.elem[i+1].English,L.elem[i+1].sum);
291         fclose(fp);
292     }    
293 } 
294 
295  
296 void Output(SqList &L)
297 {
298     printf("姓名\t學號\t語文\t數學\t英語\t總分\n");
299     for(int j=1;j<L.length;j++)
300     printf("%s\t%s\t%d\t%d\t%d\t%d\n",L.elem[j].name,L.elem[j].num,L.elem[j].chinese,L.elem[j].math,L.elem[j].English,L.elem[j].sum);
301 }
302  
303 int main()
304 {
305 
306     SqList L,L2,L3;//順序表L進行排序,L2用於補考功能,L3記錄排序前學生信息 
307     InitList(&L);
308     InitList(&L2);
309     InitList(&L3);
310     ElemType a,b,c,d;
311 L:    printf("\n\t\t****************************************************************************\n\n");
312         puts("\t\t************\t1.讀取學生文檔1.txt\t\t\t\t************");
313         puts("\t\t************\t2.讀取學生文檔2.txt\t\t\t\t************");
314         puts("\t\t************\t3.學生排名(創建學生文檔3.txt,降序排列)\t************");
315         puts("\t\t************\t4.補考學生信息(創建學生文檔4)\t\t\t************");
316         puts("\t\t************\t5.輸入姓名,查找該學生\t\t\t\t************");
317         puts("\t\t************\t6.輸入學號,查找該學生\t\t\t\t************");
318         puts("\t\t************\t7.添加學生信息\t\t\t\t\t************");
319         puts("\t\t************\t8.刪除學生信息\t\t\t\t\t************");
320         puts("\t\t************\t9.修改學生信息\t\t\t\t\t************");
321         puts("\t\t************\t10.顯示學生信息\t\t\t\t\t************");
322         puts("\t\t************\t0. 退出\t\t\t\t\t\t************");
323     printf("\n\t\t****************************************************************************\n\n");
324     int x,choose;
325     while(1)
326     {
327         printf("請選擇:");
328         while(1)
329         {
330             if(!(scanf("%d",&choose))||choose>10||choose<0)
331             {
332                 printf("請按提示輸入\n");
333                 fflush(stdin);// 清除緩沖區 
334                 system("pause");
335                 system("cls");
336                 goto L; 
337                 continue; 
338             }
339             break;
340         }
341         if(choose==0)    break;
342         switch(choose)
343         {
344             case 1:
345                     read(str1);    
346                     break;
347             case 2:
348                     read(str2);
349                     system("pause");
350                     system("cls");
351                     goto L;
352                     break;            
353             case 3:
354                     fuzhi_sq(&L,&L3);
355                     InsertSort(L);
356                     printf("文檔創建成功\n");    
357                     Create(L,str3);
358                     system("pause");
359                     system("cls");
360                     goto L;
361                     break;
362             case 4:
363                     fuzhi_sq(&L,&L3);
364                     find_bukao(L3,L2);//把順序表L中的補考學生錄入順序表L2 
365                     printf("文檔創建成功\n");    
366                     Create(L2,str4);
367                     printf("補考信息如下:\n");
368                     printf("\t語文補考:");
369                     for(int i=1;i<L2.length;i++)
370                     {
371                         if(L2.elem[i].chinese<60)
372                         printf("%s(%d) ",L2.elem[i].name,L2.elem[i].chinese);
373                     }
374                     
375                     printf("\n\t數學補考:");
376                     for(int i=1;i<L2.length;i++)
377                     {
378                         if(L2.elem[i].math<60)
379                         printf("%s(%d) ",L2.elem[i].name,L2.elem[i].math);
380                     }
381                     printf("\n\t英語補考:");
382                     for(int i=1;i<L2.length;i++)
383                     {
384                         if(L2.elem[i].English<60)
385                         printf("%s(%d )",L2.elem[i].name,L2.elem[i].English);
386                     }
387                     printf("\n");
388                     system("pause");
389                     system("cls");
390                     goto L;
391                     break;
392             case 5:
393                     
394 L5:                    char name[8];
395                     printf("請輸入要查找的學生姓名:");
396                     scanf("%s",&name);
397                     if(int g=Search_name(L3,name))
398                     {
399                         printf("姓名\t學號\t語文\t數學\t英語\t總分\n");
400                         printf("%s\t%s\t%d\t%d\t%d\t%d\n",L3.elem[g].name,L3.elem[g].num,L3.elem[g].chinese,L3.elem[g].math,L3.elem[g].English,L3.elem[g].sum);    
401                     }
402                     else
403                           printf("對不起,查無此人!\n"); 
404             L5a:    printf("是否繼續查詢(y/n):");
405                     char d; 
406                     scanf("%s",&d);
407                     switch(d)
408                     {
409                         case 'y':
410                             goto L5;break;
411                         case 'n':
412                             system("pause");
413                             system("cls");
414                             goto L;
415                             break;
416                         default:
417                             printf("請按提示輸入!!!\n");
418                             goto L5a;
419                             break;
420                     }
421                     break;
422             case 6:    
423 L6:                    printf("請輸入要查詢的學號:");
424                     char id[3];
425                     scanf("%s",&id);
426                     if(    int i=Search_id(L3,id))
427                     {
428                         printf("姓名\t學號\t語文\t數學\t英語\t總分\n");
429                         printf("%s\t%s\t%d\t%d\t%d\t%d\n",L3.elem[i].name,L3.elem[i].num,L3.elem[i].chinese,L3.elem[i].math,L3.elem[i].English,L3.elem[i].sum);
430                     }
431                     else
432                           printf("對不起,查無此人!\n"); 
433             L6a:    printf("是否繼續查詢(y/n):");
434                     char v; 
435                     scanf("%s",&v);
436                     switch(v)
437                     {
438                         case 'y':
439                             goto L6;break;
440                         case 'n':
441                             system("pause");
442                             system("cls");
443                             goto L;
444                             break;
445                         default:
446                             printf("請按提示輸入!!!\n");
447                             goto L8a;
448                     }
449                     break;
450             
451             case 7:
452 L7:                    printf("請輸入學生信息:\n");
453                     printf("姓名:");    scanf("%s",u.name);
454                     printf("學號:");    scanf("%s",u.num);
455                     printf("語文:");    scanf("%d",&u.chinese);
456                     printf("數學:");    scanf("%d",&u.math);
457                     printf("英語:");    scanf("%d",&u.English);
458                     u.sum=u.chinese+u.math+u.English;
459                     printf("輸入完成\n\n");
460                     tianjia_stu(u,str2);
461                     read(str2);
462             L7a:    printf("是否繼續添加(y/n):");
463                     char b; 
464                     scanf("%s",&b);
465                     switch(b)
466                     {
467                         case 'y':
468                             goto L7;break;
469                         case 'n':
470                             system("pause");
471                             system("cls");
472                             goto L;
473                             break;
474                         default:
475                             printf("請按提示輸入!!!\n");
476                             goto L7a;
477                     }
478                     system("pause");
479                     system("cls");
480                     goto L;
481                     break;
482             case 8:
483                     int number;
484                     number=1; //記錄刪除的個數 (一次操作) 
485 L8:                    printf("請輸入要刪除的學生學號:");
486                     char id1[3];
487                     scanf("%s",&id1);
488                     if(int m=Search_id(L3,id1))
489                         {
490                             Delete_stu(L3,m,number);
491                             puts("刪除成功");
492                         }
493                     else
494                             printf("學號不存在,請輸入正確學號。\n");
495             L8a:    char f;    
496                     printf("是否繼續刪除?(y/n)");
497                     getchar();
498                     scanf("%s",&f);
499                     
500                     switch(f)
501                     {
502                         case 'y':
503                             number++;
504                             goto L8;
505                             break;
506                         case 'n':
507                             system("pause");
508                             system("cls");
509                             goto L;
510                             break;
511                         default:
512                             printf("請按提示輸入!!!\n");
513                             goto L8a;
514                     }
515                     break;
516             
517             case 9:
518                     char id2[3],m,n;
519                     int grade;
520         L10a:        printf("請輸入要修改的學生學號:");
521                     scanf("%s",&id2);
522                     if(!(n=Search_id(L3,id2)))
523                     {
524                         printf("學號不存在,請輸入正確學號。\n");
525                         goto L10a;    
526                     }
527                     Xiugai_stu(L3,n);
528                     printf("修改成功!\n");
529                     printf("姓名\t學號\t語文\t數學\t英語\t總分\n");
530                     printf("%s\t%s\t%d\t%d\t%d\t%d\n",L3.elem[n].name,L3.elem[n].num,L3.elem[n].chinese,L3.elem[n].math,L3.elem[n].English,L3.elem[n].sum);
531                     system("pause");
532                     system("cls");
533                     goto L;
534                     break;
535             case 10:
536                     fuzhi_sq(&L,&L3);
537                     Output(L3);
538                     printf("\n已錄入的學生個數為:%d\n\n",L3.length-1);
539                     system("pause");
540                     system("cls");
541                     goto L;
542                     break;                                    
543         }
544     }
545     printf("\n\n謝謝您的使用,請按任意鍵退出\n\n\n");
546     system("pause");
547     return 0;
548 }

功能一:讀取txt1

 

功能二:讀取txt2

功能三:學生排名(創建學生文檔3.txt,降序排列)

 

功能四:補考學生信息(創建學生文檔4)

 功能五:輸入姓名,查找該學生

功能六:輸入學號,查找該學生

功能七:添加學生信息

 

功能八:刪除學生信息

 

功能九:修改學生信息

 功能十:退出

 

*************************

***author:knocker***

*************************


免責聲明!

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



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