学生管理系统项目总结分析(附代码)
一、项目要求
学生:
姓名 性别 学号 密码 语文 数学 英语
1、第一次登录强制修改密码。
2、查询成绩
排名 不显示姓名和学号、平均分、最高分、最低分
3、修改密码
4、查看个人信息
5、三次密码错误锁定帐号,由教师解锁
教师:
姓名 性别 工号 密码
1、第一次登录强制修改密码。
2、添加学生(学生的学号自动生成)
单个添加、批量导入
3、删除学生 输入两人次学号确定、删除的学生要记录保存在已退学的文件中
4、查找学生 按姓名查找、按学号查找
5、修改学生信息 修改学生基础信息、修改学生成绩
6、录入学生成绩 单个录入、批量导入
7、重置学生密码
8、显示所有在校学生信息
9、显示所有退出学生信息
10、三次密码错误锁定帐号,由校长解锁
校长:
1、第一次登录强制修改密码
2、能重置自己的密码
3、能重置教师密码
4、添加教师
5、删除教师
6、显示所有在职教师
7、显示所有离职教师
二、思考过程及反思
1、根据项目的要求,我们选择了数据结构和文件读写的这两个主要知识点,来作为解决问题途径;
2、按区块任务分配,分为主界面、学生、教师、管理员以及Makefile和部分工具函数;
3、后期发现由于用户名和密码设置不合理,输入过长后数组越界,会发生段错误,更改了密码的显示方式,优化了操作过程;
这是第一次和团队完成一个小项目,代码又臭又长,而且功能未完全实现,操作方式不统一,限制条件不充分,在过多输入时会发生段错误,仅供参考。后期我们团队会优化代码减少代码量。让代码更加简洁,方便阅读。本次只是上传代码,希望大家多多批评提出建议 感谢!!!)
三、简单代码
管理员
#include"admin.h"
#include"tool.h"
#include"teacher.h"
//管理员账号
Admin adm={"xixi",'m',"9527","123456",0};
extern uint32_t id_a[2];
//修改自己的密码
void a_change_password_myself(void)
{
char new[A_PASS];
while(true)
{
printf("请输入新的密码:");
get_passwd(new,A_PASS,false);
if(islegal_pass(new))
{
strcpy(adm.password,new);
printf("修改成功!!");
anykey_continue();
return;
}
else
{
printf("密码不合法,重新输入!!!");
anykey_continue();
}
}
}
//重置自己的密码
//void a_reset_password_myself(void)
//{
// printf("是否确定重置密码!!!!(y/n)");
// char temp=getchar();
// if(temp=='Y'||temp=='y')
// {
// strcpy(adm.password,"123456");
// printf("初始化成功!!初始密码为123456");
// anykey_continue();
// return;
// }
//}
//重置教师密码
void a_reset_password_teacher(void)
{
uint32_t number;
char new[T_PASS];
printf("请输入要修改的教师的工号:");
scanf("%d",&number);
for(int i=0;i<T_COUNT;i++)
{
if(tea[i].number==number&&tea[i].sex!=0)
{
while(true)
{
printf("\n请输入修改后该教师的密码:");
get_passwd(new,T_PASS,true);
if(islegal_pass(new))
{
strcpy(tea[i].password,new);
printf("修改成功!!!");
anykey_continue();
return;
}
else
{
printf("密码不合法,请重新输入!!!");
anykey_continue();
}
}
}
}
printf("未找到该教师,请重新确认后再进行修改!!!");
anykey_continue();
return;
}
//添加教师
void a_add_teacher(void)
{
if(t_count>T_COUNT)
{
printf("vip可享受更多存储空间!!!");
return;
}
int the_number=0;
for(int i=0;i<T_COUNT;i++) //找到可以添加的空位
{
if(tea[i].sex==0)
{
the_number=i;
break;
}
}
char name[T_NAME];
char sex;
uint32_t number=0;
printf("请输入教师姓名:");
scanf("%s",name);
strcpy(tea[the_number].name,name);
printf("请输入教师性别: ");
while(true)
{
scanf(" %c",&sex);
if('w'==sex||'m'==sex)
{
tea[the_number].sex=sex;
break;
}
printf("输入有误请重新输入!!!\n");
}
tea[the_number].number=id_a[0]++;
tea[the_number].landing=0;
tea[the_number].Account_status=1;
printf("教师:%s 性别:%c 工号:%d\n\n",tea[the_number].name,
tea[the_number].sex,tea[the_number].number);
sscanf("123456","%s",tea[the_number].password);
printf("录入成功----(^-^)\n\n");
t_count++;
anykey_continue();
}
//删除教师
void a_delete_teacher(void)
{
uint32_t number=0;
printf("请输入要删除的教师的工号:");
scanf("%d",&number);
for(int i=0;i<T_COUNT;i++)
{
if(tea[i].number==number&&tea[i].sex!=0)
{
//文件存储离职教师的信息
//删除离职老师的信息
FILE *fwp = fopen("downteacher.txt","a");
if(NULL==fwp)
{
printf("文件打开失败!!");
return;
}
fprintf(fwp,"%s %c %d",tea[i].name,tea[i].sex,tea[i].number);
fclose(fwp);
tea[i].sex=0;
t_count--;
printf("删除成功!!!");
anykey_continue();
return;
}
}
printf("未找到该老师的工号!!");
anykey_continue();
}
//显示所有在职教师
void a_show_in_teacher(void)
{
for(int i=0;i<T_COUNT;i++)
{
if(tea[i].sex!=0)
{
printf("姓名:%s ",tea[i].name);
printf("性别:%s ",tea[i].sex=='w'?"女":"男");
printf("编号:%d\n",tea[i].number);
}
}
anykey_continue();
}
//显示所有离职教师
void a_show_down_teacher(void)
{
char name[T_NAME];
char sex;
uint32_t number=0;
FILE *frp = fopen("downteacher.txt","r");
FILE *fsw=fopen("stu_tec.txt","w");
if(NULL==frp)
{
printf("文件打开失败!!");
return;
}
if(NULL==fsw)
{
printf("文件打开失败!!");
return;
}
while(!feof(frp))
{
fscanf(frp,"%s %c %d",name,&sex,&number);
printf("姓名:%s 性别:%s 编号:%d\n",name,sex=='w'?"女":"男",number);
anykey_continue();
}
fprintf(fsw,"%d %d",id_a[0],id_a[1]);
fclose(frp);
}
//给教师解锁
void a_unlock(void)
{
uint32_t number=0;
printf("请输入要解锁的教师工号:");
scanf("%d",&number);
while(true)
{
for(int i=0;i<T_COUNT;i++)
{
if(tea[i].number==number&&tea[i].Account_status==0)
{
tea[i].Account_status=1;
printf("解锁成功!!");
anykey_continue();
return;
}
else if(tea[i].number==number)
{
printf("你输入的教师状态为未锁定请重新确认!!");
anykey_continue();
return;
}
}
printf("你找到工号不存在!!!");
anykey_continue();
return;
}
}
//恢复出厂设置
void clean_storage()
{
printf("恢复出厂设置以就绪\n\n");
char number[A_NUMBER];
char pd[A_PASS];
do
{ printf("请输入管理员帐号:\n");
get_number(number,A_NUMBER);
printf("请输入管理员密码:\n");
get_passwd( pd,A_PASS,true);
}while(!strcmp(number,adm.number)&&strcmp(pd,adm.password));
t_count=0;
init_storage();
anykey_continue();
}
学生
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<getch.h>
#include"student.h"
#include"tool.h"
Student stu[S_COUNT];
Student s;
int s_position=0;
int s_count=0;
void sorce(void)
{
//记录排名
int ranking=1;
int max=-1,min=101;
for(int i=0;i<S_COUNT;i++)
{
if(stu[i].sex!=0)
{
//计算个人总分
stu[i].sum=stu[i].math+stu[i].chinese+stu[i].english;
//查找最大 最小
if(stu[i].sum>max) max=stu[i].sum;
if(stu[i].sum<min) min=stu[i].sum;
//计算排名
if(s.sum<stu[i].sum) ranking++;
}
}
printf("1.排名 2.平均分 3.最高分 4.最低分\n");
printf("请输入你需要查询的内容\n");
//成绩查询功能
switch(getch())
{
case '1':printf("\n你的排名为:%d",ranking);
anykey_continue();
break;
case '2':printf("\n你的平均分为:%d",s.sum/3);
anykey_continue();
break;
case '3':printf("\n最高分为:%d",max);
anykey_continue();
break;
case '4':printf("\n最低分为:%d",min);
anykey_continue();
break;
case '5':break;
}
}
//更改密码
void Pass(void)
{
char pass1[S_PASS],pass2[S_PASS],pass3[S_PASS];
for(;;)
{
printf("输入原密码:\n");
get_passwd(pass1,S_PASS,true);
//判断密码是否和登入密码相同
if(strcmp(pass1,s.password)==0)
{
//输入两个要修改的密码
printf("输入要更改的密码(6~20位密码):\n");
get_passwd(pass2,S_PASS,true);
printf("\n确认要修改的密码:\n");
get_passwd(pass3,S_PASS,true);
//判断两个密码是否合法相等
if(islegal_pass(pass2)&&islegal_pass(pass3)&&!strcmp(pass2,pass3))
{
//更新结构体内容,修改密码成功跳出循环
strcpy(s.password,pass3);
for(int i=0;i<S_COUNT;i++)
{
if(s.number==stu[i].number)
{
stu[i]=s;
stu[i].landing=1;
}
}
printf("修改成功,请妥善保存密码\n");
anykey_continue();
return;
}
//返回循环,重新修改
else
{
printf("密码不合法或者两次密码不相同\n");
anykey_continue();
continue;
}
}
//返回循环,重新修改
else
{
printf("原密码错误重新输入:\n");
continue;
}
}
}
void Allmessage(void)
{
for(int i=0;i<S_COUNT;i++)
{
if(s.number==stu[i].number)
{
printf("姓名:%s 性别:%c 学号:%d 语文:%d 数学:%d 英语:%d\n",stu[i].name,stu[i].sex,stu[i].number,stu[i].chinese,stu[i].math,stu[i].english);
anykey_continue();
}
}
}
教师
#include<stdio.h>
#include<stdbool.h>
#include"tool.h"
#include"teacher.h"
#include"student.h"
Teacher tea[T_COUNT];
Teacher t;
int t_position=0;
int t_count=0;
uint32_t id_a[2]={200000,300000};//教师和学生的初始工号
int index_stu=0;
//添加学生
bool t_add_stu(void)
{
if (s_count >= S_COUNT)
return false;
printf("请选择你要添加的方式\n");
printf("1、单个添加\n");
printf("2、批量导入\n");
printf("3、退出添加\n");
char ch;
do
{
scanf("%c", &ch);
if (CHOOSE_ONE != ch && CHOOSE_TWO != ch && CHOOSE_THREE != ch)
{
printf("输入错误请重新输入\n\n");
}
} while (CHOOSE_ONE != ch && CHOOSE_TWO != ch && CHOOSE_THREE != ch);
//单个添加
if (CHOOSE_ONE == ch)
{
int i = 0;
while (0 != stu[i].sex)i++;
Student s;
do
{
printf("请输入你要添加的学生的姓名\n\n");
scanf("%s", s.name);
printf("请输入你要添加的学生的性别\n\n");
scanf(" %c", &s.sex);
} while (!is_legalstu(s));
printf("--------------\n");
s.number=id_a[1]++;
printf("学生:%s,性别:%c,学号:%d\n",s.name,s.sex,s.number);
init_stu( &s);
stu[i] = s;
}
//通过文件批量添加
else if (CHOOSE_TWO == ch)
{
printf("请输入你要添加的文件的路径\n\n");
char path[T_FILE];
get_number(path,T_FILE);
int cnt = 0;
FILE* f = fopen(path, "a");
if (NULL == f)
{
printf("文件路径错误!!!\n");
return false;
}
int i = 0;
while (!feof(f))
{
fscanf(f, "%s %c%d", stu[i].name,&stu[i].sex,&stu[i].number);//学生的姓名 性别和学号的批量录入
if(!islegal_id(stu[i].number))
{
stu[i].number=id_a[1]++;
}
init_stu(&s);
i++;
if (i >= s_count)
{
s_count++;
//
}
if(s_count>=S_COUNT)
{
full_capcity();
}
}
}
//退出
else if (CHOOSE_THREE == ch)
{
printf("正在退出");
fflush(stdout);
usleep(1000);
return false;
}
printf("添加成功----(^-^)\n\n");
return true;
}
//查找学生
bool t_search_stu(void)
{
printf("请选择你要查找的方式\n");
printf("1、姓名查找\n");
printf("2、学号查找\n");
printf("3、退出查找\n");
char ch;
do
{
scanf(" %c",&ch);
if(CHOOSE_ONE!=ch&&CHOOSE_TWO!=ch&&CHOOSE_THREE!=ch)
{
printf("输入错误请重新输入\n\n");
}
}while(CHOOSE_ONE!=ch&&CHOOSE_TWO!=ch&&CHOOSE_THREE!=ch);
//按照姓名查找
if(CHOOSE_ONE==ch)
{
printf("请输入你要查找的学生的姓名\n\n");
char name[S_NAME];
scanf("%s",name);
for(int i=0;i<S_COUNT;i++)
{
if(0==strcmp(name,stu[i].name)&&stu[i].sex!=0)
{
index_stu=i;
printf("查找成功----(^-^)\n\n");
return true;
}
}
}
//按学号查找
else if (CHOOSE_TWO==ch)
{
int number;
do
{
printf("请输入你要查找的学生的学号\n\n");
scanf("%d",&number);
}while(!islegal_id(number));
for(int i=0;i<S_COUNT;i++)
{
if(number==stu[i].number&&stu[i].sex!=0)
{
index_stu=i;
printf("查找成功----(^-^)\n\n");
return true;
}
}
}
//退出
else if(CHOOSE_THREE==ch)
{
printf("正在退出");
fflush(stdout);
usleep(1000);
return false;
}
printf("查找失败---('-')!!!\n\n");
return false;
}
//显示查找到的学生
void t_psearch_stu(void)
{
if(!t_search_stu()) return ;
printf("姓名:%s ",stu[index_stu].name);
printf("性别:%c ",stu[index_stu].sex);
printf("学号:%d ",stu[index_stu].number);
printf("语文:%3d ",stu[index_stu].chinese);
printf("英语:%3d ",stu[index_stu].english);
printf("数学:%3d\n",stu[index_stu].math);
}
//删除学生
bool t_delete_stu(void)
{
printf("查找你要删除的学生的信息\n");
if (!t_search_stu())
{
printf("删除失败---('-')!!!\n\n");
return false;
}
printf("您所要删除的学生信息:姓名:%s 学号:%d\n\n",stu[index_stu].name,stu[index_stu].number);
int cnt = 1;
int err_cnt=0;
int numbers;
while (cnt <= 2)
{
printf("请输入学号加以确认,第%d次: \n", cnt);
scanf("%d",&numbers);
cnt++;
if (numbers!=stu[index_stu].number&&stu[index_stu].sex)
{
cnt--;
err_cnt++;
}
if(err_cnt==3)
{
printf("学号输入错误超过三次,退出删除操作\n\n");
return false;
}
}
FILE* ds = fopen("downstudent.txt", "a");
if (NULL == ds)
{
perror("fopen:");
return false;
}
//将失足学生打入到退学学生标表中
fprintf(ds, "%s %c %d\n", stu[index_stu].name,
stu[index_stu].sex, stu[index_stu].number);
fclose(ds);
stu[index_stu].sex =0;
//更新两张表
printf("删除成功----(^-^)\n\n");
return true;
}
//重置学生密码
bool t_reset_stu_pass(void)
{
printf("请选择你要重置密码的学生\n");
if (!t_search_stu())
{
printf("重置密码失败!!!\n\n");
return false;
}
strcpy(stu[index_stu].password, "123456");
printf("重置为:%s\n\n","123456");
printf("重置成功----(^-^)\n\n");
return true;
}
//显示所有在校学生
void t_show_stu(void)
{
int cnt=0;
for ( int i = 0; i < S_COUNT; i++)
{
if (0 != stu[i].sex)
{
printf("姓名:%s ",stu[i].name);
printf("性别:%s ",stu[i].sex == 'w' ? "女" : "男");
printf("学号:%d ",stu[i].number);
printf("语文:%d ",stu[i].chinese);
printf("数学:%d ",stu[i].math);
printf("英语:%d\n",stu[i].english);
cnt++;
}
}
if(!cnt)
{
printf("一大波学生正在赶来的路上,请老师准备接收----(^+^)\n\n");
}
}
//录入学生成绩
bool t_import_stu_score()
{
printf("请选择你要添加的方式\n");
printf("1、单个录入\n");
printf("2、退出录入\n");
char ch;
do
{
scanf("%c", &ch);
if (CHOOSE_ONE != ch && CHOOSE_TWO != ch)
{
printf("输入错误请重新输入\n");
}
} while (CHOOSE_ONE != ch && CHOOSE_TWO != ch);
//单个录入
if (CHOOSE_ONE == ch)
{
printf("请选择你要录入成绩的对象\n");
if (!t_search_stu())
{
printf("录入失败\n");
return false;
}
int flag = 1;
do
{
flag = 0;
printf("输入学生的语文成绩\n");
scanf("%d", &stu[index_stu].chinese);
if(!legal_chinese_score( stu[index_stu].chinese))
{
flag=1;
continue;
}
printf("输入学生的英语成绩\n");
scanf("%d", &stu[index_stu].english);
if(!legal_english_score(stu[index_stu].english ))
{
flag=1;
continue;
}
printf("输入学生的数学成绩\n");
scanf("%d", &stu[index_stu].math);
if(!legal_math_score( stu[index_stu].math))
{
flag=1;
continue;
}
} while (flag);
printf("录入成功----(^-^)\n\n");
return true;
}
//退出录入
else if (CHOOSE_TWO == ch)
{
printf("正在退出");
fflush(stdout);
usleep(1000);
return false;
}
return false;
}
//显示退出学生
void t_show_drop_stu()
{
Student s;
FILE* f = fopen("downstudent.txt", "r");
while (!feof(f))
{
fscanf(f, "%s %c %d\n", s.name,&s.sex, &s.number);
printf("姓名:%s ",s.name);
printf("性别:%s ",s.sex == 'w' ? "女" : "男");
printf("学号:%d\n",s.number);
}
fclose(f);
}
//修改学生信息
bool t_modify_stu()
{
printf("请输入你要修改的学生信息\n");
if (!t_search_stu())
{
printf("修改失败\n");
return false;
}
printf("请选择你要修改信息\n");
printf("1、学生基础信息修改\n");
printf("2、学生成绩修改\n");
printf("3、退出修改\n");
char ch;
do
{
scanf(" %c", &ch); //菜单界面选项的判断
if (CHOOSE_ONE != ch && CHOOSE_TWO != ch && CHOOSE_THREE != ch)
{
printf("输入错误请重新输入\n");
}
} while (CHOOSE_ONE != ch && CHOOSE_TWO != ch && CHOOSE_THREE != ch);
//学生基础信息修改
if (CHOOSE_ONE == ch)
{
do
{
printf("请输入你要修改的学生的姓名\n");
scanf("%s", stu[index_stu].name);
printf("请输入你要修改的学生的性别\n");
scanf(" %c", &stu[index_stu].sex);
printf("请输入你要修改的学生的密码\n");
get_passwd(stu[index_stu].password,S_PASS,true);
if (!islegal_pass(stu[index_stu].password))
{
printf("学生密码错误\n");
continue;
}
} while (!is_legalstu(stu[index_stu]));
printf("修改成功----(^-^)\n\n");
}
//学生成绩修改
else if (CHOOSE_TWO == ch)
{
int flag = 1;
do
{
flag = 0;
printf("输入学生的语文成绩\n");
scanf("%d", &stu[index_stu].chinese);
if(!legal_chinese_score( stu[index_stu].chinese))
{
flag=1;
continue;
}
printf("输入学生的英语成绩\n");
scanf("%d", &stu[index_stu].english);
if(!legal_english_score(stu[index_stu].english ))
{
flag=1;
continue;
}
printf("输入学生的数学成绩\n");
scanf("%d", &stu[index_stu].math);
if(!legal_math_score( stu[index_stu].math))
{
flag=1;
continue;
}
} while (flag);
printf("修改成功----(^-^)\n\n");
}
//退出
else if (CHOOSE_THREE == ch)
{
printf("正在退出");
fflush(stdout);
usleep(1000);
return false;
}
return false;
}
//给学生解锁
void t_unlock(void)
{
int number;
printf("请输入要解锁的学生学号:");
scanf("%d",&number);
while(true)
{
for(int i=0;i<S_COUNT;i++)
{
if(stu[i].number==number) //改过
{
if(stu[i].Account_status==0)
{
stu[i].Account_status=1;
printf("解锁成功----(^-^)");
anykey_continue();
return;
}
else
{
printf("你输入的学生状态为未锁定请重新确认!!");
anykey_continue();
return;
}
}
}
printf("你找到学号不存在----(*+*)");
anykey_continue();
return;
}
}
具体代码以及头文件请见
https://github.com/8mybug/kuku/tree/master/studentGitHub库文件