学生成绩管理系统(数据结构课程设计)

学生成绩管理问题 

问题描述:建立两个学生成绩信息表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
");
 59         
 60         exit(0);
 61     }
 62     printf("姓名	学号	语文	数学	英语	总分
");
 63     for(i=0;!feof(fp);i++,p++)
 64     fscanf(fp,"%s	%s	%d	%d	%d	%d
",&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	%s	%d	%d	%d	%d
",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
");
 89         
 90         exit(0);
 91     }
 92     for(i=0;!feof(fp);i++,p++)
 93     fscanf(fp,"%s	%s	%d	%d	%d	%d
",&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
");
102         
103         exit(0);
104     }
105     for(n=0;!feof(fp);n++,q++)
106     fscanf(fp,"%s	%s	%d	%d	%d	%d
",&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	%s	%d	%d	%d	%d
",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
");
149         
150         exit(0);
151     }
152     printf("姓名	学号	语文	数学	英语	总分
");
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	%s	%d	%d	%d	%d
",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,"
%s	%s	%d	%d	%d	%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	%s	%d	%d	%d	%d
",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	%s	%d	%d	%d	%d
",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	%s	%d	%d	%d	%d
",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("
1:语文	2:数学	3:英语
");    
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("请按提示输入。
");
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	%s	%d	%d	%d	%d
",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	%s	%d	%d	%d	%d
",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("姓名	学号	语文	数学	英语	总分
");
299     for(int j=1;j<L.length;j++)
300     printf("%s	%s	%d	%d	%d	%d
",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("
		****************************************************************************

");
312         puts("		************	1.读取学生文档1.txt				************");
313         puts("		************	2.读取学生文档2.txt				************");
314         puts("		************	3.学生排名(创建学生文档3.txt,降序排列)	************");
315         puts("		************	4.补考学生信息(创建学生文档4)			************");
316         puts("		************	5.输入姓名,查找该学生				************");
317         puts("		************	6.输入学号,查找该学生				************");
318         puts("		************	7.添加学生信息					************");
319         puts("		************	8.删除学生信息					************");
320         puts("		************	9.修改学生信息					************");
321         puts("		************	10.显示学生信息					************");
322         puts("		************	0. 退出						************");
323     printf("
		****************************************************************************

");
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("请按提示输入
");
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("文档创建成功
");    
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("文档创建成功
");    
366                     Create(L2,str4);
367                     printf("补考信息如下:
");
368                     printf("	语文补考:");
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("
	数学补考:");
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("
	英语补考:");
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("
");
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("姓名	学号	语文	数学	英语	总分
");
400                         printf("%s	%s	%d	%d	%d	%d
",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("对不起,查无此人!
"); 
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("请按提示输入!!!
");
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("姓名	学号	语文	数学	英语	总分
");
429                         printf("%s	%s	%d	%d	%d	%d
",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("对不起,查无此人!
"); 
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("请按提示输入!!!
");
447                             goto L8a;
448                     }
449                     break;
450             
451             case 7:
452 L7:                    printf("请输入学生信息:
");
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("输入完成

");
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("请按提示输入!!!
");
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("学号不存在,请输入正确学号。
");
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("请按提示输入!!!
");
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("学号不存在,请输入正确学号。
");
525                         goto L10a;    
526                     }
527                     Xiugai_stu(L3,n);
528                     printf("修改成功!
");
529                     printf("姓名	学号	语文	数学	英语	总分
");
530                     printf("%s	%s	%d	%d	%d	%d
",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("
已录入的学生个数为:%d

",L3.length-1);
539                     system("pause");
540                     system("cls");
541                     goto L;
542                     break;                                    
543         }
544     }
545     printf("

谢谢您的使用,请按任意键退出


");
546     system("pause");
547     return 0;
548 }

功能一:读取txt1

 

功能二:读取txt2

功能三:学生排名(创建学生文档3.txt,降序排列)

 

功能四:补考学生信息(创建学生文档4)

 功能五:输入姓名,查找该学生

功能六:输入学号,查找该学生

功能七:添加学生信息

 

功能八:删除学生信息

 

功能九:修改学生信息

 功能十:退出

 

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

***author:knocker***

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

你可能感兴趣的