学生成绩管理问题
问题描述:建立两个学生成绩信息表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***
*************************
来源:oschina
链接:https://my.oschina.net/u/4369994/blog/4319719