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.学生登录”“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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具