学生管理系统项目的收获
学生信息管理系统
学生信息管理系统实现的功能
- 本项目能实现管理员、老师、学生三层用户完善的使用功能,并且添加隐藏的4号键位超级管理员的功能。
- 安全保密性能大大提高,超级管理员密码可以被设置为30位的数字和字符。为整个系统的密码安全也加了一层保护。
此外,本系统是相邻两级之间的制约型系统,即超级管理员只能设置、重置、添加、删除、查看管理员;而管理员也只能对老师信息进行修改重置,老师可以对学生的信息进行修改添加上传成绩排名等。学生作为最底层用户,仅能查看自己的各科排名情况和总分排名情况。
- 在添加下一级用户时,本系统人性化的添加了单人添加功能和批量添加功能。为如老师这样的用户大量添加下级以良好的操作体验。也可以进行逐个添加,以防后期的人员变动等等。
- 本系统的批量添加下级需要进行.txt文本形式进行。
本项目的主要构造。
- ‘’'int main()
{
stu_count=0;
tea_count=0;
ma_count=0;
FILE* stu_r=fopen(“stu.txt”,“r”);
fseek(stu_r,0,SEEK_END);
long ret_stu=ftell(stu_r);
rewind(stu_r);
stu_count=ret_stu/92;
for(int i=0;i<stu_count;i++)
{
fread(&stu[i],92,1,stu_r);
}
FILE* tea_r=fopen(“tea.txt”,“r”);
fseek(tea_r,0,SEEK_END);
long ret_tea=ftell(tea_r);
rewind(tea_r);
tea_count=ret_tea/60;
for(int i=0;i<tea_count;i++)
{
fread(&tea[i],60,1,tea_r);
}
while(1)
{
major_menu();
switch(get_cmd(‘0’,‘4’))
{
case ‘1’: manager_admin();break;
case ‘2’: teacher_admin();break;
case ‘3’: student_admin();break;
case ‘0’: quit();return 0;
case ‘4’: super_admin();break;
}
}
}
‘’’
将添加分块功能写入另一个.c文件
然后将每个分功能再分部,然后用Make file集中编译。
‘’’
all:
gcc -std=gnu99 -c main.c
gcc -std=gnu99 -c admin.c
gcc -std=gnu99 -c menuc.c
gcc -std=gnu99 -c tool.c
gcc -std=gnu99 -c supermanager.c
gcc -std=gnu99 -c manager.c
gcc -std=gnu99 -c teacher.c
gcc -std=gnu99 -c student.c
gcc -std=gnu99 -c teacher_info.c
gcc -std=gnu99 -c teacher_score.c
gcc main.o admin.o menuc.o tool.o supermanager.o manager.o teacher.o student.o teacher_info.o teacher_score.o -o Stu
‘’’
本项目遇到的问题。
- 首先编写时没有先采用文件的形式进行,而是仅仅先对逻辑功能进行了编译,最开始的版本在功能上还不能实现完全,比如添加学生信息时年龄和各种信息输入时的scanf和guetuso('w)函数接受换行问题,很多次都无法正确接受输入的字符串甚至是直接直接输出输入行时就直接跳过。随后先开始采用的时getchar()函数用来接受上一次的输入‘\n’问题,但是麻烦至极并且在下一级的输入会遇到同样的问题。所以经过不少的实验之后,采用了字符串批量输入的方式,然后再输入整形变量的方法,比较实用简单的解决了这个问题。
- 在进行管理员以及老师等新用户登陆的的时候,遇到了不输入密码一路回车就能进入系统的bug。后来我们采用标志位的方式避免这种尴尬的问题的发生。
‘’’
void manager_admin()void manager_admin()void manager_admin()void manager_admin()
{
system(“clear”);
char password[10]={};
char name[20]={};
int count=0;
printf(“请输入您的用户名:”);
gets(name);
for(int i=0;i<ma_count;i++)
{
if(strcmp(name,ma[i].name)==0 && ma[i].lock == 1)
{
printf(“你的账户已被锁定,请联系超级管理员\n”);
anykey_continue();
return;
}
if(strcmp(name,ma[i].name)0 && ma[i].lock == 0 && ma[i].index1)
{
printf(“此人已经离职\n”);
anykey_continue();
return;
}
if(strcmp(name,ma[i].name)0 && ma[i].lock == 0 && ma[i].index0)
{
while(count < 3)
{
printf(“请输入密码\n”);
hide(password);
if(strcmp(password,ma[i].password)==0)
{
if(strcmp(password,“000000”)==0)
{
char new[10]={};
system(“clear”);
printf(“请修改您的密码\n”);
hide(new);
strcpy(ma[i].password,new);
printf(“修改成功\n”);
getchar();
}
while(1)
{
manager_menu();
switch(get_cmd(‘0’,‘9’))
{
case ‘1’: add_tea(); break;
case ‘2’: del_teacher(); break;
case ‘3’: change_teacher(); break;
case ‘4’: reset_teacher(); break;
case ‘5’: unlock_teacher(); break;
case ‘6’: find_teacher();break;
case ‘7’: view_on_teacher();break;
case ‘8’: view_off_teacher();break;
case ‘9’: change_password(&i);break;
case ‘0’:return ;
}
}
}
else
{
printf(“您的密码错误\n”);
count++;
}
}
ma[i].lock=1;
printf(“你的账户已被锁定,请联系超级管理员\n”);
getch();
anykey_continue();
return ;
}
}
}
‘’’
- 实现密码的号保护输入。
‘’’
void hide(char pass)
{
for(int i = 0;i<10;i++)
{
pass[i] = getch();
if(i0 && 127pass[i])
{ i–;
printf("\b \b");
continue;
}
if(i>0&&127 == pass[i])
{
i-=2;
printf("\b \b");
continue;
}
if(’\n’ == pass[i])
{
pass[i] = ‘\0’;
break;
}
putchar(’’);
}
printf("\n");
}
‘’’
这个最大的问题就是号跟随输入的删除增加而增减的问题。后来还是使用了分情况讨论的比较简单的方法进行逻辑判断,避免了段错误的产生。
- 最大的一个问题就是文件的批量写入问题。
主要在老师模块的主c文件中,对学生的批量添加操作中,学生批量添加进入系统的问题i总是很大,因为fscanf的读取问题找了较久的bug,对于学生的信息无法正确的分解进入展示页面,总是会发生部分信息的缺失和错误展示。
‘’’
void batch_add_student(void)
{
system(“clear”);
FILE *frp=fopen(“batch_stu.txt”,“r”);
if(NULL==frp)
{
printf(“打开文件失败\n”);
return;
}
while(!feof(frp))
{
fscanf(frp,"%d %s %s %c %s %d %d %d %f %d %d %d %d %d %d %d\n",&stu[stu_count].num,stu[stu_count].password,stu[stu_count].name,&stu[stu_count].sex,stu[stu_count].age,&stu[stu_count].chinese,&stu[stu_count].math,&stu[stu_count].english,&stu[stu_count].avg,&stu[stu_count].sum,&stu[stu_count].rank_all,&stu[stu_count].rank_chinese,&stu[stu_count].rank_math,&stu[stu_count].rank_english,&stu[stu_count].index,&stu[stu_count].lock);
stu_count++;
}
fclose(frp);
frp=NULL;
puts(“导入成功”);
anykey_continue();
}
‘’’
在批量导入这部分最后采用,严格要求输入格式的方式来避免fscanf出错。如以上代码。
本次的学生成绩管理系统算是学习以来做的比较大的一个项目文件。因为对于知识掌握度不怎么扎实的我首先在写逻辑文件的菜单文件编排就做了很久。总算是可以大致的实现必要的功最能。
在项目编写的过程中最痛苦的就是查bug了,不断的重复自己的功能,尝试找各种问题,最开始的makefile都一页多的错误警告提示。然后一个一个排查验证。
本次项目的体会就12个字:不断学习、认真思考、细心编码。