这是我的第一个项目,以下是我的一些总结:
我们的项目名称是学生成绩管理系统,主要功能是:
- 学生能够登陆系统查询语数外三科成绩,及三科平均分、总分、排名。
- 教师能够管理学生、录入成绩。
- 管理员能够管理教师,超级管理员能够管理管理员。
- 超级管理员外,其他人输错密码3次账号即锁定,向上级请求才能解锁。
5.除超级管理员外,每个用户第一次登陆必须修改密码。
在这个项目中我与其他两位同学合作,我负责的是登陆密码模块和主界面模块以及学生模块。主要实现方法是:首先判断输入的ID是否存在,存在且未锁定,则继续输入密码,否则显示账号不存在。判断密码是否正确,若正确则登陆,若不正确则减少登陆次数,直至次数为零。当再次登录时,若账号已被锁定,则显示账号被锁定,需要向上级请求解锁。
以下是代码部分:
密码模块:
//教师登录
15 void tea_username_and_password(void)
16 {
17 char id[20];
18 int tea_cur = 0;
19 char str[10];
20 int n = 3;
21 puts("请输入工号:");
22 {
23 int flag = 1;
24 while(flag){
25 scanf("%s",id);
26 for(int i = 0;i < 50;i++ ){
27 //输入的id存在且该id在职
28 if(0 == strcmp(tea[i].tea_id,id) && tea[i].is_work == 1){
29 //若被锁定则显示
30 if(tea[i].is_lock == 1){
31 printf("该工号被锁定!请向上一级(管理员)申诉\n");
32 sleep(1);
33 return;
34 //否则,退出循环,记录是第a个人
35 }else{
36 flag = 0;
37 tea_cur = i;
38 break;
39 }
40 //输入id存在但离职或不存在,显示不存在
41 }else if((0 == strcmp(tea[i].tea_id,id) && tea[i].is_work == 2) || (i == 49)){
42 printf("该工号不存在\n");
43 sleep(1);
44 return;
45 }
46 }
47 }
48 }
49 puts("请输入密码:");
50 do{
51 n--;
52 scanf("%s",str);
53 //输入的密码与该账号密码不相同,则进入
54 if(0 != strcmp(tea[tea_cur].tea_pass_word,str)){
55 //n记录剩余次数
56 if(n > 0){
57 printf("密码错误,请重新输入(还有%d次)\n",n);
58 }else{
59 printf("工号被锁定!请向上一级(管理员)申诉\n");
60 tea[tea_cur].is_lock=1;
61 sleep(1);
62 return;
63 }
64 }
65 //如果相同则进入教师模块
66 else{
67 //传参内容:第a个教师
68 teacher_func(tea_cur);
69 n = 0;
70 }
71 }while(n);
72 }
学生模块代码:
1 #include "student.h"
2 #include "stu_tea_adm_struct.h"
3 #include "get_cmd.h"
4 #include "display.h"
5 extern Student stu[500];
6 extern Teacher tea[50];
7 extern Administrator adm[10];
8
9
10 //修改密码
11 void stu_cha_pass(int i)
12 {
13 printf("请输入新的密码:");
14 scanf("%s",stu[i].stu_pass_word);
15 puts("修改成功!");
16 sleep(1);
17 stu[i].is_first=1;
18 }
19 //显示个人信息
20 void inf_my(int i)
21 {
22 printf("姓名:%s 语文:%d 数学:%d 英语:%d 平均分:%.2lf 总分:%d\n",stu[i].name,stu[i].ach_chi,stu[i].ach_mat,stu[i].ach_eng,stu[i].ach_avg,stu[i].ach_sco);
23 printf("请按任意键返回...");
24 getch();
25 }
26
27 //总分排名
28 void sco_rank(int i)
29 {
30 printf("您的总分排名是%d\n",stu[i].sco_rank);
31 printf("按任意键返回...");
32 getch();
33 }
34 //数学成绩排名
35 void mat_rank(int i)
36 {
37 printf("您的数学排名是%d\n",stu[i].mat_rank);
38 printf("按任意键返回...");
39 getch();
40 }
41
42 void eng_rank(int i)
43 {
44 printf("您的英语排名是%d\n",stu[i].eng_rank);
45 printf("按任意键返回...");
46 getch();
47 }
48 //语文成绩排名显示
49 void chi_rank(int i)
50 {
51 printf("您的语文排名是%d\n",stu[i].chi_rank);
52 printf("按任意键返回...");
53 getch();
54 }
55
56 //在查询成绩排名时选择科目
57 void switch_course(int i)
58 {
59 printf("请选择你要查询的项目:");
60 printf("1.数学");
61 printf("2.英语");
62 printf("3.语文");
63 printf("4.总分");
64 printf("5.返回");
65 switch(get_cmd('1','5'))
66 {
67 case '1':mat_rank(i);break;
68 case '2':eng_rank(i);break;
69 case '3':chi_rank(i);break;
70 case '4':sco_rank(i);break;
71 case '5':return;
72 }
73 }
74
75 int student_use(int x)
76 {
77 //判断是否第一次登录,是则要求修改
78 if(0==stu[x].is_first)
79 {
80 stu_display();
81 puts("您使用的是默认密码,请修改密码:");
82 scanf("%s",stu[x].stu_pass_word);
83 puts("修改成功!");
84 stu[x].is_first=1;
85 sleep(1);
86 }
87 while(1)
88 {
89 stu_display();
90 //根据输入1~4选择功能
91 switch(get_cmd('1','4'))
92 {
93 case '1':stu_cha_pass(x);break;
94 case '2':inf_my(x);break;
95 case '3':switch_course(x);break;
96 case '4':return 0;break;
97 }
98 }
99 }
这次项目练习是我们的第一次练习,还有很多的不足:
1.首先代码不够规范,对于变量的命名不够准确,使得其他人在阅读代码时,可读性不高,理解起来有困难。
2.其次我们的代码有很多的重复,优化不够,会浪费很多的资源。
3.再者就是我们对于问题的思考不够缜密,导致了一些逻辑问题。
4.然后就是我们的小组开始前讨论不够充分,使工作的分配有一些问题。
5.最后就是我们的测试不够认真,致使一些bug未被发现,结果在演示时出错。
经过这次的经历,我总结了一些问题,在下一次做项目的时候希望可以避免这些问题。