開發環境:Linux
開發語言:C
相關文件下載:
碼雲:傳送門
GitHub:傳送門
程序主界面:
相關功能:參考碼雲中的文檔
/*************************************************************************************************************
校長 老師的登錄信息存儲在對應的txt文件中
校長的賬號是admin 密碼是123,某教師賬號1,密碼1。某學生賬號1,密碼123。
*************************************************************************************************************/
文件:
main.c ,student.c ,student.h ,teacher.c , teacher.h , admin.c , admin.h, tools.c , tools.h, struct.h, sams.c, sams.h, stu.txt, tea.txt , admin.txt, project_create.sh, Makefile
結構:
- 主界面:“1.學生登錄”“2.教師登錄”“3.校長登錄”“0.退出系統”,4個選項進行跳轉。(main.c)
2.1 選擇1,跳轉“學生登錄界面”,輸入學號及默認密碼(三次錯誤及鎖定此學號,登錄成功后即進入“修改密碼子界面”)
2.2 選擇2,跳轉“教師登錄界面”,輸入工號及默認密碼(三次錯誤及鎖定此工號,登錄成功后即進入“修改密碼子界面”)
2.3 選擇3,跳轉“校長登錄界面”,輸入學號及默認密碼(登錄成功后即進入“修改密碼子界面”)
2.4 選擇0,關閉程序。
3.1 成功登錄及修改密碼后,跳轉“學生功能界面”(student.c, student.h)
1、第一次登錄強制修改密碼。
2、查詢成績
排名 不顯示姓名和學號。
平均分
最高分
最低分
3、修改密碼
4、查看個人信息
5、三次密碼錯誤鎖定帳號,由教師解鎖
0、返回上一級
3.2 成功登錄及修改密碼后,跳轉“教師功能界面”(teacher.c ,teacher.h)
1、第一次登錄強制修改密碼。
2、添加學生(學生的學號自動生成)
單個添加
批量導入
3、刪除學生
輸入兩人次學號確定
刪除的學生要記錄保存在已退學的文件中
4、查找學生
按姓名查找
按學號查找
5、修改學生信息
修改學生基礎信息
修改學生成績
6、錄入學生成績
單個錄入
批量導入
7、重置學生密碼
8、顯示所有在校學生信息
9、顯示所有退出學生信息
10、三次密碼錯誤鎖定帳號,由校長解鎖
0、返回上一級
3.3 成功登錄及修改密碼后,跳轉“校長功能界面”(admin.c ,admin.h)
1、第一次登錄強制修改密碼。
2、能重置自己的密碼
3、能重置教師密碼
4、添加教師
5、刪除教師
6、顯示所有在職教師
7、顯示所有離職教師
0、返回上一級
效果展示:
我給Windows單獨寫了個。
補上 stu.txt, tea.txt , admin.txt。編譯運行,數據參考結構體。
main.c
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stdbool.h> 4 #include <conio.h> 5 //#include "getch.h" 6 #include <string.h> 7 #include <stddef.h> 8 9 #define pf printf 10 #define sf scanf 11 #define MAX_STU 100 12 #define MAX_TEA 50 13 14 typedef struct Student 15 { 16 char name[20]; 17 char sex; 18 char id[20]; 19 char passwd[20]; 20 short chinese; 21 short english; 22 short math; 23 short time; 24 short birth; 25 short exist; 26 }Student; 27 28 typedef struct Teacher 29 { 30 char name[20]; 31 char sex; 32 char id[20]; 33 char passwd[20]; 34 short time; 35 short birth; 36 short exist; 37 }Teacher; 38 39 typedef struct Admin 40 { 41 char id[20]; 42 char passwd[20]; 43 short birth; 44 }Admin; 45 46 // 聲明全局變量 47 Student* STU; 48 Teacher* TEA; 49 Admin* ADM; 50 51 // 下標 52 int temp = 0; 53 int pos = 0; 54 int i = 0; 55 56 // 系統初始化 57 void sams_init(void); 58 // 系統開始運行 59 void sams_start(void); 60 // 系統結束 61 void sams_exit(void); 62 63 // 管理子系統菜單 64 void admin_menu(void); 65 // 管理員添加老師 66 void admin_add_tea(void); 67 // 管理員刪除老師 68 void admin_del_tea(void); 69 // 管理員重置老師 70 void admin_reset_tea(void); 71 // 管理員顯示在職教師列表 72 void admin_list_tea(void); 73 // 管理員顯示離職教師列表 74 void admin_list_ubtea(void); 75 // 管理員修改密碼 76 void admin_change_pw(void); 77 // 管理員登錄 78 bool admin_login(void); 79 // 運行管理員子系統 80 void admin_start(void); 81 82 // 學生子系統菜單 83 void student_menu(void); 84 // 學生查詢成績 85 void student_find_score(void); 86 // 學生查詢成績 87 void student_find_score(void); 88 // 學生修改密碼 89 void student_ch_pw(void); 90 // 學生查詢個人信息 91 void student_find_info(void); 92 // 學生登錄 93 int student_login(void); 94 // 運行學生子系統 95 void student_start(void); 96 97 // 老師子系統菜單 98 void teacher_menu(void); 99 // 老師添加學生 100 void teacher_add_stu(void); 101 // 老師刪除學生 102 void teacher_del_stu(void); 103 // 老師查詢學生 104 void teacher_find_stu(void); 105 // 老師修改學生信息 106 void teacher_ch_stu_info(void); 107 // 老師添加學生成績 108 void teacher_add_stu_score(void); 109 // 老師重置學生密碼 110 void teacher_reset_stu_pw(void); 111 // 老師顯示在校學生列表 112 void teacher_list_stu(void); 113 // 老師顯示退學學生列表 114 void teacher_list_ubstu(void); 115 // 老師修改密碼 116 void teacher_ch_pw(void); 117 // 老師登錄 118 int teacher_login(void); 119 // 老師登錄 120 int teacher_login(void); 121 // 運行老師子系統 122 void teacher_start(void); 123 124 // 獲取字符串 125 char* get_str(char* str,size_t len); 126 // 清理緩沖區 127 void clear_stdin(void); 128 // 獲取性別 129 char get_sex(void); 130 // 獲取鍵盤指令 131 char get_cmd(char start,char end); 132 // 獲取密碼 133 char* get_pw(char* passwd,bool is_show,size_t size); 134 135 // 主函數 136 int main() 137 { 138 sams_init(); 139 140 sams_start(); 141 142 sams_exit(); 143 } 144 145 // 主菜單 146 void sams_menu(void) 147 { 148 pf("***歡迎使用指針學生成績管理系統***\n"); 149 pf("1、管理員子系統\n"); 150 pf("2、教師子系統\n"); 151 pf("3、學生子系統\n"); 152 pf("4、退出系統\n"); 153 pf("-----------------------------\n"); 154 } 155 156 // 系統初始化 157 void sams_init(void) 158 { 159 // 申請堆內存、加載數據 160 STU = calloc(MAX_STU,sizeof(Student)); 161 TEA = calloc(MAX_TEA,sizeof(Teacher)); 162 ADM = calloc(1,sizeof(Admin)); 163 pf("系統初始化...\n"); 164 165 FILE* afrp = fopen("admin.txt","r"); 166 int num = 0; 167 num = fscanf(afrp,"%s %s %hd",ADM[0].id,ADM[0].passwd,&ADM[0].birth); 168 fclose(afrp); 169 170 FILE* sfrp = fopen("stu.txt","r"); 171 for(i=0; i<100; i++) 172 { 173 int num = 0; 174 num = fscanf(sfrp,"%s %c %s %s %hd %hd %hd %hd %hd %hd",STU[i].name,&STU[i].sex,STU[i].id,STU[i].passwd,&STU[i].chinese,&STU[i].english,&STU[i].math,&STU[i].time,&STU[i].birth,&STU[i].exist); 175 } 176 fclose(sfrp); 177 178 FILE* tfrp = fopen("tea.txt","r"); 179 for(i=0; i<50; i++) 180 { 181 int num = 0; 182 num = fscanf(tfrp,"%s %c %s %s %hd %hd %hd",TEA[i].name,&TEA[i].sex,TEA[i].id,TEA[i].passwd,&TEA[i].time,&TEA[i].birth,&TEA[i].exist); 183 } 184 fclose(tfrp); 185 } 186 187 // 系統開始運行 188 void sams_start(void) 189 { 190 // 進入系統的業務流程控制 191 pf("系統開始運行...\n"); 192 while(true) 193 { 194 sams_menu(); 195 switch(get_cmd('1','4')) 196 { 197 case '1': admin_start(); break; 198 case '2': teacher_start(); break; 199 case '3': student_start(); break; 200 case '4': return; 201 } 202 } 203 } 204 205 // 系統結束 206 void sams_exit(void) 207 { 208 FILE* afwp = fopen("admin.txt","w"); 209 int num = 0; 210 num = fprintf(afwp,"%s %s %hd",ADM[0].id,ADM[0].passwd,ADM[0].birth); 211 fclose(afwp); 212 213 FILE* sfwp = fopen("stu.txt","w"); 214 for(i=0; i<100; i++) 215 { 216 int num = 0; 217 if(STU[i].sex != 0) 218 { 219 num = fprintf(sfwp,"%s %c %s %s %hd %hd %hd %hd %hd %hd\n",STU[i].name,STU[i].sex,STU[i].id,STU[i].passwd,STU[i].chinese,STU[i].english,STU[i].math,STU[i].time,STU[i].birth,STU[i].exist); 220 } 221 } 222 fclose(sfwp); 223 224 FILE* tfwp = fopen("tea.txt","w"); 225 for(i=0; i<50; i++) 226 { 227 int num = 0; 228 if(TEA[i].sex != 0) 229 { 230 num = fprintf(tfwp,"%s %c %s %s %hd %hd %hd\n",TEA[i].name,TEA[i].sex,TEA[i].id,TEA[i].passwd,TEA[i].time,TEA[i].birth,TEA[i].exist); 231 } 232 } 233 fclose(tfwp); 234 // 釋放內存、保存數據 235 free(STU); 236 free(TEA); 237 free(ADM); 238 pf("系統退出...\n"); 239 } 240 241 // 管理子系統菜單 242 void admin_menu(void) 243 { 244 pf("\n進入管理子系統...\n"); 245 pf("1、添加教師\n"); 246 pf("2、刪除教師\n"); 247 pf("3、重置並解鎖教師密碼\n"); 248 pf("4、顯示在職教師\n"); 249 pf("5、顯示已離職教師\n"); 250 pf("6、修改自己密碼\n"); 251 pf("7、返回上一級\n"); 252 pf("-----------------\n"); 253 } 254 255 // 管理員添加老師 256 void admin_add_tea(void) 257 { 258 pf("添加教師\n"); 259 char Cteacher_name[20]; 260 char Cteacher_sex; 261 char Cteacher_id[20]; 262 char Cteacher_pw[20]; 263 pf("請輸入教師姓名:"); 264 get_str(Cteacher_name,20); 265 pf("請輸入教師性別:"); 266 Cteacher_sex = get_sex(); 267 pf("請輸入教師工號:"); 268 get_str(Cteacher_id,20); 269 pf("請輸入教師密碼:"); 270 get_str(Cteacher_pw,20); 271 int pos = -1; //插入的位置 272 pf("id:%s。\n",TEA[0].id); 273 for(i=0; i<50; i++) 274 { 275 if(TEA[i].sex == '\0' && pos == -1) 276 { 277 pf("pos已定位\n"); 278 pos = i; 279 } 280 if(strcmp(TEA[i].id,Cteacher_id)==0) 281 { 282 pf("工號重復,請重新輸入!\n"); 283 break; 284 } 285 if(i==49) 286 { 287 strcpy(TEA[pos].name,Cteacher_name); 288 TEA[pos].sex = Cteacher_sex; 289 strcpy(TEA[pos].id,Cteacher_id); 290 strcpy(TEA[pos].passwd,Cteacher_pw); 291 pf("添加成功。\n"); 292 } 293 } 294 pf("id:%s。\n",TEA[0].id); 295 } 296 297 // 管理員刪除老師 298 void admin_del_tea(void) 299 { 300 pf("刪除教師\n"); 301 pf("請輸入教師工號:"); 302 char Cteacher_id[20]={}; 303 get_str(Cteacher_id,20); 304 for(i=0; i<50; i++) 305 { 306 if(strcmp(Cteacher_id,TEA[i].id)==0) 307 { 308 TEA[i].exist = 1; 309 pf("刪除成功!\n"); 310 break; 311 } 312 if(i==49) 313 { 314 pf("無此工號!\n"); 315 } 316 } 317 318 } 319 320 // 管理員重置老師 321 void admin_reset_tea(void) 322 { 323 pf("重置密碼\n"); 324 pf("請輸入教師工號:"); 325 char Cteacher_id[20]={}; 326 get_str(Cteacher_id,20); 327 char Cteacher_pw[20] = "123"; 328 for(i=0; i<50; i++) 329 { 330 if(strcmp(TEA[i].id,Cteacher_id)==0) 331 { 332 TEA[i].time = 0; 333 TEA[i].birth = 0; 334 TEA[i].exist = 0; 335 strcpy(TEA[i].passwd,Cteacher_pw); 336 pf("重置成功!\n"); 337 break; 338 } 339 if(i==49) 340 { 341 pf("無此工號.\n"); 342 } 343 } 344 345 } 346 347 // 管理員顯示在職教師列表 348 void admin_list_tea(void) 349 { 350 pf("顯示在職教師"); 351 for(i=0; i<50; i++) 352 { 353 if(TEA[i].sex != '\0') 354 { 355 if(TEA[i].exist != 1) 356 { 357 pf("\n姓名:%s 性別:%c 工號:%s",TEA[i].name,TEA[i].sex,TEA[i].id); 358 } 359 } 360 else 361 { 362 break; 363 } 364 } 365 } 366 367 // 管理員顯示離職教師列表 368 void admin_list_ubtea(void) 369 { 370 pf("顯示離職教師"); 371 for(i=0; i<50; i++) 372 { 373 if(TEA[i].sex != '\0') 374 { 375 if(TEA[i].exist == 1) 376 { 377 pf("\n姓名:%s 性別:%c 工號:%s",TEA[i].name,TEA[i].sex,TEA[i].id); 378 } 379 } 380 else 381 { 382 break; 383 } 384 } 385 } 386 387 //char admin_pw[20]="123"; 388 //strcpy(admin_pw,admin_passwd); 389 390 // 管理員修改密碼 391 void admin_change_pw(void) 392 { 393 char old_pw[20]={}; 394 char new_pw[20]={}; 395 char new_two_pw[20]={}; 396 pf("請輸入原密碼:"); 397 get_pw(old_pw,true,20); 398 printf("\n"); 399 pf("請輸入新密碼:"); 400 get_pw(new_pw,true,20); 401 printf("\n"); 402 pf("請再次輸入新密碼:"); 403 get_pw(new_two_pw,true,20); 404 printf("\n"); 405 if(strcmp(old_pw,ADM[0].passwd)==0) 406 { 407 if(strcmp(new_pw,new_two_pw)==0) 408 { 409 pf("修改密碼成功\n"); 410 if(ADM[0].birth==0) 411 { 412 ADM[0].birth = 1; 413 } 414 strcpy(ADM[0].passwd,new_pw); 415 } 416 else 417 { 418 pf("兩次密碼不一致\n"); 419 } 420 } 421 else 422 { 423 pf("原密碼錯誤。\n"); 424 } 425 } 426 427 // 管理員登錄 428 bool admin_login(void) 429 { 430 //char admin_id[20] = "admin"; 431 char Cadmin_id[20]={}; 432 char Cadmin_pw[20]={}; 433 pf("請輸入用戶名:"); 434 get_str(Cadmin_id,20); 435 if(Cadmin_id[0]=='\0') 436 { 437 pf("用戶名不能為空!\n"); 438 return false; 439 } 440 //pf("*%s*\n",Cadmin_id); 441 pf("請輸入密碼:"); 442 get_pw(Cadmin_pw,true,20); 443 //printf("\n*%s*",Cadmin_pw); 444 printf("\n"); 445 if(strcmp(Cadmin_id,ADM[0].id)==0 && strcmp(Cadmin_pw,ADM[0].passwd)==0) 446 { 447 //printf("正確\n"); 448 return true; 449 } 450 else 451 { 452 return false; 453 } 454 } 455 456 // 運行管理員子系統 457 void admin_start(void) 458 { 459 if(!admin_login()) 460 { 461 pf("登錄失敗!\n"); 462 return; 463 } 464 while(true) 465 { 466 if(ADM[0].birth==0) 467 { 468 admin_change_pw(); 469 } 470 else 471 { 472 admin_menu(); 473 switch(get_cmd('1','7')) 474 { 475 case '1': admin_add_tea(); break; 476 case '2': admin_del_tea(); break; 477 case '3': admin_reset_tea(); break; 478 case '4': admin_list_tea(); break; 479 case '5': admin_list_ubtea(); break; 480 case '6': admin_change_pw(); break; 481 case '7': return; 482 } 483 } 484 } 485 } 486 487 488 // 學生子系統菜單 489 void student_menu(void) 490 { 491 pf("進入學生子系統...\n"); 492 pf("1、查詢成績\n"); 493 pf("2、修改密碼\n"); 494 pf("3、查看個人信息\n"); 495 pf("4、返回上一級\n"); 496 pf("---------------\n"); 497 } 498 499 // 學生查詢成績 500 void student_find_score(void) 501 { 502 pf("成績查詢\n"); 503 pf("語文:%hd ,英語: %hd ,數學: %hd\n",STU[temp].chinese,STU[temp].english,STU[temp].math); 504 } 505 506 // 學生修改密碼 507 void student_ch_pw(void) 508 { 509 char old_stu_pw[20]={}; 510 char new_stu_pw[20]={}; 511 char new_stu_two_pw[20]={}; 512 pf("請輸入原密碼:"); 513 get_pw(old_stu_pw,true,20); 514 printf("\n"); 515 pf("請輸入新密碼:"); 516 get_pw(new_stu_pw,true,20); 517 printf("\n"); 518 pf("請再次輸入新密碼:"); 519 get_pw(new_stu_two_pw,true,20); 520 printf("\n"); 521 if(strcmp(old_stu_pw,STU[temp].passwd)==0) 522 { 523 if(strcmp(new_stu_pw,new_stu_two_pw)==0) 524 { 525 pf("修改密碼成功\n"); 526 if(STU[temp].birth==0) 527 { 528 STU[temp].birth = 1; 529 } 530 strcpy(STU[temp].passwd,new_stu_pw); 531 } 532 else 533 { 534 pf("兩次密碼不一致\n"); 535 } 536 } 537 else 538 { 539 pf("原密碼錯誤。\n"); 540 } 541 } 542 543 // 學生查詢個人信息 544 void student_find_info(void) 545 { 546 pf("個人信息\n"); 547 pf("姓名:%s ,性別:%c ,學號: %s\n",STU[temp].name,STU[temp].sex,STU[temp].id); 548 } 549 550 // 學生登錄 551 int student_login(void) 552 { 553 char Cstudent_id[20]={}; 554 char Cstudent_pw[20]={}; 555 pf("請輸入用戶名:"); 556 get_str(Cstudent_id,20); 557 if(Cstudent_id[0]=='\0') 558 { 559 pf("用戶名不能為空!\n"); 560 return -1; 561 } 562 //pf("*%s*\n",Cstudent_id); 563 pf("請輸入密碼:"); 564 get_pw(Cstudent_pw,true,20); 565 //printf("\n*%s*",Cstudent_passwd); 566 printf("\n"); 567 for(i=0; i<100; i++) 568 { 569 if(strcmp(Cstudent_id,STU[i].id)==0) 570 { 571 if(STU[i].time==3) 572 { 573 pf("此學號已被鎖定,請找教師解鎖。\n"); 574 return -1; 575 } 576 if(STU[i].exist==1) 577 { 578 pf("此學生已退學。\n"); 579 return -1; 580 } 581 if(strcmp(Cstudent_pw,STU[i].passwd)==0) 582 { 583 return i; 584 } 585 else 586 { 587 STU[i].time++; 588 pf("密碼錯誤.\n"); 589 return -1; 590 } 591 } 592 } 593 pf("不存在此學生。\n"); 594 return -1; 595 } 596 597 // 運行學生子系統 598 void student_start(void) 599 { 600 temp = student_login(); 601 if(temp==-1) 602 { 603 pf("登錄失敗!\n"); 604 return; 605 } 606 while(true) 607 { 608 if(STU[temp].birth==0) 609 { 610 student_ch_pw(); 611 } 612 else 613 { 614 student_menu(); 615 switch(get_cmd('1','4')) 616 { 617 case '1': student_find_score(); break; 618 case '2': student_ch_pw(); break; 619 case '3': student_find_info(); break; 620 case '4': return; 621 } 622 } 623 } 624 } 625 626 627 // 老師子系統菜單 628 void teacher_menu(void) 629 { 630 pf("\n進入教師子系統...\n"); 631 pf("1、添加學生\n"); 632 pf("2、刪除學生\n"); 633 pf("3、查找學生\n"); 634 pf("4、修改學生信息\n"); 635 pf("5、錄入學生成績\n"); 636 pf("6、重置學生密碼\n"); 637 pf("7、顯示所有在校學生信息\n"); 638 pf("8、顯示所有退學學生信息\n"); 639 pf("9、修改自己密碼\n"); 640 pf("0、返回上一級\n"); 641 pf("-----------------\n"); 642 } 643 644 // 老師添加學生 645 void teacher_add_stu(void) 646 { 647 pf("添加學生\n"); 648 char Cstudent_name[20]; 649 char Cstudent_sex; 650 char Cstudent_id[20]; 651 char Cstudent_pw[20]; 652 pf("請輸入學生姓名:"); 653 get_str(Cstudent_name,20); 654 pf("請輸入學生性別:"); 655 Cstudent_sex = get_sex(); 656 pf("請輸入學生工號:"); 657 get_str(Cstudent_id,20); 658 pf("請輸入學生密碼:"); 659 get_str(Cstudent_pw,20); 660 int pos = -1; //插入的位置 661 pf("id:%s。\n",STU[0].id); 662 for(i=0; i<100; i++) 663 { 664 if(STU[i].sex == '\0' && pos == -1) 665 { 666 pf("pos已定位\n"); 667 pos = i; 668 } 669 if(strcmp(STU[i].id,Cstudent_id)==1) 670 { 671 pf("學號重復,請重新輸入!\n"); 672 break; 673 } 674 if(i==99) 675 { 676 strcpy(STU[pos].name,Cstudent_name); 677 STU[pos].sex = Cstudent_sex; 678 strcpy(STU[pos].id,Cstudent_id); 679 strcpy(STU[pos].passwd,Cstudent_pw); 680 pf("添加成功。\n"); 681 } 682 } 683 pf("id:%s。\n",STU[0].id); 684 } 685 686 // 老師刪除學生 687 void teacher_del_stu(void) 688 { 689 pf("刪除學生\n"); 690 pf("請輸入學生學號:"); 691 char Cstudent_id[20]={}; 692 get_str(Cstudent_id,20); 693 for(i=0; i<100; i++) 694 { 695 if(strcmp(Cstudent_id,STU[i].id)==0) 696 { 697 STU[i].exist = 1; 698 pf("刪除成功!\n"); 699 break; 700 } 701 if(i==99) 702 { 703 pf("無此學號!\n"); 704 } 705 } 706 707 } 708 709 // 老師查詢學生 710 void teacher_find_stu(void) 711 { 712 pf("請輸入學生學號:"); 713 char Cstudent_id[20]={}; 714 get_str(Cstudent_id,20); 715 for(i=0; i<100; i++) 716 { 717 if(strcmp(Cstudent_id,STU[i].id)==0) 718 { 719 pf("姓名:%s 性別:%c 學號:%s\n",STU[i].name,STU[i].sex,STU[i].id); 720 break; 721 } 722 else if(i==99) 723 { 724 pf("無此學號。\n"); 725 } 726 } 727 } 728 729 // 老師修改學生信息 730 void teacher_ch_stu_info(void) 731 { 732 pf("請輸入學生學號:"); 733 char Cstudent_id[20]={}; 734 get_str(Cstudent_id,20); 735 for(i=0; i<100; i++) 736 { 737 if(strcmp(Cstudent_id,STU[i].id)==0) 738 { 739 char ch_name[20]; 740 char ch_sex; 741 char ch_id[20]; 742 pf("原信息:姓名:%s 性別:%c 學號:%s\n",STU[i].name,STU[i].sex,STU[i].id); 743 pf("請輸入新姓名:"); 744 get_str(ch_name,20); 745 pf("請輸入新性別:"); 746 if(sf("%c",&ch_sex)==1) 747 { 748 getchar(); 749 } 750 pf("請輸入新學號:"); 751 get_str(ch_id,20); 752 753 strcpy(STU[i].name,ch_name); 754 STU[i].sex = ch_sex; 755 strcpy(STU[i].id,ch_id); 756 757 pf("信息修改成功。\n"); 758 break; 759 } 760 else if(i==99) 761 { 762 pf("無此學號。\n"); 763 } 764 } 765 } 766 767 // 老師添加學生成績 768 void teacher_add_stu_score(void) 769 { 770 pf("請輸入學生學號:"); 771 char Cstudent_id[20]={}; 772 get_str(Cstudent_id,20); 773 for(i=0; i<100; i++) 774 { 775 if(strcmp(Cstudent_id,STU[i].id)==0) 776 { 777 short chinese = 0; 778 short english = 0; 779 short math = 0; 780 pf("原信息:語文:%hd 英語:%hd 數學:%hd\n",STU[i].chinese,STU[i].english,STU[i].math); 781 pf("請輸入新語文成績:"); 782 if(sf("%hd",&chinese)==1) 783 { 784 getchar(); 785 } 786 pf("請輸入新英語成績:"); 787 if(sf("%hd",&english)==1) 788 { 789 getchar(); 790 } 791 pf("請輸入新數學成績:"); 792 if(sf("%hd",&math)==1) 793 { 794 getchar(); 795 } 796 797 STU[i].chinese = chinese; 798 STU[i].english = english; 799 STU[i].math = math; 800 801 pf("信息修改成功。\n"); 802 break; 803 } 804 else if(i==99) 805 { 806 pf("無此學號。\n"); 807 } 808 } 809 } 810 811 // 老師重置學生密碼 812 void teacher_reset_stu_pw(void) 813 { 814 pf("重置密碼\n"); 815 pf("請輸入學生學號:"); 816 char Cstudent_id[20]={}; 817 get_str(Cstudent_id,20); 818 char Cstudent_pw[20] = "123"; 819 for(i=0; i<100; i++) 820 { 821 if(strcmp(STU[i].id,Cstudent_id)==0) 822 { 823 STU[i].time = 0; 824 STU[i].birth = 0; 825 STU[i].exist = 0; 826 strcpy(STU[i].passwd,Cstudent_pw); 827 pf("重置成功!\n"); 828 break; 829 } 830 if(i==99) 831 { 832 pf("無此學號.\n"); 833 } 834 } 835 } 836 837 // 老師顯示在校學生列表 838 void teacher_list_stu(void) 839 { 840 pf("顯示在校學生"); 841 for(i=0; i<100; i++) 842 { 843 if(STU[i].sex != '\0') 844 { 845 if(STU[i].exist != 1) 846 { 847 pf("\n姓名:%s 性別:%c 學號:%s",STU[i].name,STU[i].sex,STU[i].id); 848 } 849 } 850 else 851 { 852 break; 853 } 854 } 855 } 856 857 // 老師顯示退學學生列表 858 void teacher_list_ubstu(void) 859 { 860 pf("顯示退學學生"); 861 for(i=0; i<100; i++) 862 { 863 if(STU[i].sex != '\0') 864 { 865 if(STU[i].exist == 1) 866 { 867 pf("\n姓名:%s 性別:%c 工號:%s",STU[i].name,STU[i].sex,STU[i].id); 868 } 869 } 870 else 871 { 872 break; 873 } 874 } 875 } 876 877 // 老師修改密碼 878 void teacher_ch_pw(void) 879 { 880 char old_pw[20]={}; 881 char new_pw[20]={}; 882 char new_two_pw[20]={}; 883 pf("請輸入原密碼:"); 884 get_pw(old_pw,true,20); 885 printf("\n"); 886 pf("請輸入新密碼:"); 887 get_pw(new_pw,true,20); 888 printf("\n"); 889 pf("請再次輸入新密碼:"); 890 get_pw(new_two_pw,true,20); 891 printf("\n"); 892 if(strcmp(old_pw,TEA[pos].passwd)==0) 893 { 894 if(strcmp(new_pw,new_two_pw)==0) 895 { 896 pf("修改密碼成功\n"); 897 if(TEA[pos].birth==0) 898 { 899 TEA[pos].birth = 1; 900 } 901 strcpy(TEA[pos].passwd,new_pw); 902 } 903 else 904 { 905 pf("兩次密碼不一致\n"); 906 } 907 } 908 else 909 { 910 pf("原密碼錯誤。\n"); 911 } 912 } 913 914 // 老師登錄 915 int teacher_login(void) 916 { 917 char Cteacher_id[20]={}; 918 char Cteacher_pw[20]={}; 919 pf("請輸入用戶名:"); 920 get_str(Cteacher_id,20); 921 if(Cteacher_id[0]=='\0') 922 { 923 pf("用戶名不能為空!\n"); 924 return -1; 925 } 926 //pf("*%s*\n",Cteacher_id); 927 pf("請輸入密碼:"); 928 get_pw(Cteacher_pw,true,20); 929 //printf("\n*%s*",Cadmin_passwd); 930 printf("\n"); 931 for(i=0; i<50; i++) 932 { 933 if(strcmp(Cteacher_id,TEA[i].id)==0) 934 { 935 if(TEA[i].time==3) 936 { 937 pf("此工號已被鎖定,請找管理員解鎖。\n"); 938 return -1; 939 } 940 if(TEA[i].exist==1) 941 { 942 pf("此教師已離職。\n"); 943 return -1; 944 } 945 if(strcmp(Cteacher_pw,TEA[i].passwd)==0) 946 { 947 return i; 948 } 949 else 950 { 951 TEA[i].time++; 952 pf("密碼錯誤.\n"); 953 return -1; 954 } 955 } 956 } 957 pf("不存在此教師。\n"); 958 return -1; 959 } 960 961 // 運行老師子系統 962 void teacher_start(void) 963 { 964 pos = teacher_login(); 965 if(pos==-1) 966 { 967 pf("登錄失敗!\n"); 968 return; 969 } 970 while(true) 971 { 972 if(TEA[pos].birth==0) 973 { 974 teacher_ch_pw(); 975 976 } 977 else 978 { 979 teacher_menu(); 980 switch(get_cmd('0','9')) 981 { 982 case '1': teacher_add_stu(); break; 983 case '2': teacher_del_stu(); break; 984 case '3': teacher_find_stu(); break; 985 case '4': teacher_ch_stu_info(); break; 986 case '5': teacher_add_stu_score(); break; 987 case '6': teacher_reset_stu_pw(); break; 988 case '7': teacher_list_stu(); break; 989 case '8': teacher_list_ubstu(); break; 990 case '9': teacher_ch_pw(); break; 991 case '0': return; 992 } 993 } 994 } 995 } 996 997 /** tools **/ 998 // 清理輸入緩沖區 999 void clear_stdin(void) 1000 { 1001 //stdin->_IO_read_ptr = stdin->_IO_read_end;//清理輸入緩沖區 1002 } 1003 1004 // 獲取字符串 1005 char* get_str(char* str,size_t len) 1006 { 1007 if(NULL == str) 1008 { 1009 puts("empty ptr!"); 1010 return NULL; 1011 } 1012 1013 char *in=fgets(str,len,stdin); 1014 1015 size_t cnt = strlen(str); 1016 if('\n' == str[cnt-1]) 1017 { 1018 str[cnt-1] = '\0'; 1019 } 1020 else 1021 { 1022 scanf("%*[^\n]"); 1023 scanf("%*c"); 1024 } 1025 1026 clear_stdin(); 1027 1028 return str; 1029 } 1030 1031 // 獲取性別 1032 char get_sex(void) 1033 { 1034 printf("(m男,w女):"); 1035 while(true) 1036 { 1037 char sex = getch(); 1038 if('w' == sex || 'm' == sex) 1039 { 1040 printf("%s\n",'w'==sex?"女":"男"); 1041 return sex; 1042 } 1043 } 1044 } 1045 1046 // 獲取鍵盤指令 1047 char get_cmd(char start,char end) 1048 { 1049 clear_stdin(); 1050 1051 printf("請輸入指令:"); 1052 while(true) 1053 { 1054 char val = getch(); 1055 if(val >= start && val <= end) 1056 { 1057 printf("%c\n",val); 1058 return val; 1059 } 1060 } 1061 } 1062 1063 // 獲取密碼 1064 char* get_pw(char* passwd,bool is_show,size_t size) 1065 { 1066 if(NULL == passwd) return NULL; 1067 1068 int count = 0; 1069 do{ 1070 char val = getch(); 1071 if(8 == val) 1072 { 1073 if(count > 0) 1074 { 1075 if(is_show)printf("\b \b"); 1076 count--; 1077 } 1078 continue; 1079 } 1080 else if(13 == val) 1081 { 1082 break; 1083 } 1084 passwd[count++] = val; 1085 if(is_show) printf("*"); 1086 }while(count < size -1); 1087 1088 passwd[count] = '\0'; 1089 return passwd; 1090 }