1. 程式人生 > >學生成績管理系統(資料結構課程設計)

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

學生成績管理問題 

問題描述:建立兩個學生成績資訊表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***

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