C語言實現—學生成績管理系統


開發環境: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. 主界面:“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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM