学生成绩管理问题
问题描述:建立两个学生成绩信息表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***
*************************