这个系统主要考察的是文件的读写应用,我写的比较简单,只有最基本的功能
其中包括:
1、第一次登录强制修改密码。
2、添加学生(学生的学号自动生成)
单个添加
从文件批量导入
3、删除学生
输入两次学号确定
删除的学生要记录保存在已退学的文件中
4、查找学生
按姓名查找
按学号查找
5、修改学生信息
修改学生基础信息
修改学生成绩
6、录入学生成绩
单个录入
批量导入
7、重置学生密码
8、解锁学生
9、显示所有在校学生信息
10、显示所有退出学生信息
11、三次密码错误锁定帐号,由校长解锁
利用比较多的几个功能把他封装成函数可以减少代码量
读取学生文件信息:
void read_stu(void)//读取学生信息
{
FILE* frp=fopen("student.txt","r");
int i = 0;
for(i=0;i<100;i++)
{
fscanf(frp,"%s %s %d %s %d %d %f %f %f\n",stu[i].name,stu[i].sex,&stu[i].id,stu[i].passwd,&stu[i].school,&stu[i].unlock,&stu[i].chinese,&stu[i].math,&stu[i].english);
}//从左到右依次为姓名,性别,学号,密码,是否在校,账号是否锁定,语文成绩,数学成绩,英语成绩
}
void read_tch(void)//读取教师信息
{
FILE* frp=fopen("teacher.txt","r");
int i=0;
for(i=0;i<100;i++)
{
fscanf(frp,"%d %s %s %s %d %d\n",&ls[i].id,ls[i].name,ls[i].sex,ls[i].passwd,&ls[i].job,&ls[i].lock);从左到右依次为教师工号,教师姓名,教师性别,教师密码,教师在职标志位,教师账号是否锁定,
}
}
然后是写入文件,有重写和末尾写入两种方式:
void rewrite_tch(void)//重写教师信息
{
FILE* fwp=fopen("teacher.txt","w");//w权限,清空重写文件
int i=0;
for(i=0;i<100;i++)
{
if(ls[i].id)
fprintf(fwp,"%d %s %s %s %d %d\n",ls[i].id,ls[i].name,ls[i].sex,ls[i].passwd,ls[i].job,ls[i].lock);
}
}
//学生重写和教师重写就差变量就不放出来占地方了,放一个从末尾写入学生信息的函数
void write_stu(int i)//末尾写入文件
{
FILE* fap=fopen("student.txt","a");
fprintf(fap,"%s %s %d %s %d %d %4.1f %4.1f %4.1f\n",stu[i].name,stu[i].sex,stu[i].id,stu[i].passwd,stu[i].school,stu[i].unlock,stu[i].chinese,stu[i].math,stu[i].english);
}
//在linux系统中若要替换全文的变量名可以用:%s/修改内容/新内容/
//但是这个东西不智能,比如%s/in/un/他会把include改成unclude,
然后是教师登录函数:
void land(void)//登录功能
{
read_tch();
printf("请输入教师账号:\n");
int id,i,j=1;
char x[20];
scanf("%d",&id);
for(i=0;i<100;i++)
{
if(id==ls[i].id&&!ls[i].lock)
{
printf("请输入密码:\n");
scanf("%s",x);
for(j=0;j<4;j++)
{
if(!strcmp(x,ls[i].passwd)&&!strcmp(ls[i].passwd,"123456"))
{
printf("首次登录请修改密码\n");
scanf("%s",ls[i].passwd);
while(!strcmp(ls[i].passwd,"123456"))
{
printf("密码不能与初始密码相同修改失败,请重新输入\n");
scanf("%s",ls[i].passwd);
}
meun();
rewrite_tch();
}
else if(!strcmp(x,ls[i].passwd))
{
meun();//菜单函数
}
else if(j<3&&strcmp(x,ls[i].passwd))
{
printf("密码输入错误请重试,还有%d次机会:\n",(3-j));
scanf("%s",x);
}
else
{
ls[i].lock=1;
printf("输入3次错误,账号锁定,请联系校长解锁。\n");
rewrite_tch();
}
}
}
if(id==ls[i].id&&ls[i].lock)
{
printf("该账号已锁定,无法登录\n");
}
}
if(j)
printf("账号输入有误\n");
}
大致上教师登录系统就是这样,而修改密码功能函数在这其中也有,就不单独发出来了
就按上面的功能首先是添加功能:
void add_stu(void)//单个添加学生
{
read_stu();
printf("%s",stu[0].name);
int i=0;
for(i=0;i<100;i++)
{
if(0==stu[i].id)
{
printf("%d\n",i);
printf("请输入学生姓名:\n");
scanf("%s",stu[i].name);
getchar();
printf("请输入学生性别:\n");
scanf("%s",stu[i].sex);
getchar();
stu[i].id=i+1000000;//学号从小到大自动生成
strcat(stu[i].passwd,"123456");//初始密码默认123456
stu[i].school=1;//在校标志位非0为在校
stu[i].unlock=1;//锁定标志位非0为正常未锁
stu[i].chinese=0;//初始成绩均为0
stu[i].math=0;
stu[i].english=0;
printf("添加学生成功:%s %s %d %s \n",stu[i].name,stu[i].sex,stu[i].id,stu[i].passwd);
write_stu(i);
break;
}
if(i==101)
printf("系统已满\n");
}
}
void add_fstu(char* file,int s)//按文件批量添加
{
read_stu();
FILE* path;
FILE* fap=fopen("student.txt","a");
int i,j;
path = fopen(file,"r");
for(i=0;i<100;i++)
{
fscanf(path,"%s %s",stuf[i].name,stuf[i].sex);
}
for(i=0;i<100;i++)
{
if(0==stu[i].id)
{
for(j=0;j<s;j++)
{
stuf[j].id=i+1000000;
i++;
strcat(stuf[j].passwd,"123456");
stuf[j].school=1;
stuf[j].unlock=1;
stuf[j].unlock=1;
stuf[j].chinese=0;
stuf[j].math=0;
stuf[j].english=0;
printf("添加学生成功:%s %s %d %s \n",stuf[j].name,stuf[j].sex,stuf[j].id,stuf[j].passwd);
fprintf(fap,"%s %s %d %s %d %d %4.1f %4.1f %4.1f\n",stuf[j].name,stuf[j].sex,stuf[j].id,stuf[j].passwd,stuf[j].school,stuf[j].unlock,stuf[j].chinese,stuf[j].math,stuf[j].english);
}
break;
}
}
if(i==101)
printf("系统已满\n");
}
void add(void)
{
char s[20];
int x,j;
printf("请输入命令:\n 1:单个导入\n 2:批量导入\n");
scanf("%d",&x);
if(1==x)
add_stu();
else if(2==x)
{
printf("请输入要导入的文件名:\n");
scanf("%s",s);
printf("请输入要导入个数:\n");
scanf("%d",&j);
add_fstu(s,j);
}
else
{
printf("命令错误\n");
}
}
删除命令:
void del_stu(void)//删除学生,school标志位置0表示离校
{
read_stu();
FILE* ufap = fopen("ustudent.txt","a");
printf("请输入要删除学生学号:");
int id1,id2;
scanf("%d",&id1);
int i,j=1;
for(i=0;i<100;i++)
{
if(id1==stu[i].id)
{
printf("请再次输入学号以确定");
scanf("%d",&id2);
if(id1==id2)
{
stu[i].school=false;
j=0;
printf("成功删除:%s\n",stu[i].name);
fprintf(ufap,"%s %s %d %s %d\n",stu[i].name,stu[i].sex,stu[i].id,stu[i].passwd,stu[i].school,stu[i]);
break;
}
else
printf("输入错误\n");
}
}
rewrite_stu();
if(j)
printf("查无此人\n");
}
查找功能:
void seek_stu (void)//按姓名查找,模糊查询
{
read_stu();
printf("请输入要查询学生姓名\n");
char x[12]={};
scanf("%s",x);
getchar();
int i,j=1;
for(i=0;i<100;i++)
{
if(strstr(stu[i].name,x)&&stu[i].school)
{
printf("已找到学生:");
printf("%s %s %d\n",stu[i].name,stu[i].sex,stu[i].id);
j=0;
}
}
if(j)
printf("找不到此人\n");
}
void seek_fstu (void)//按学号查找精确查询
{
read_stu();
printf("请输入要查询学生的学号\n");
int id;
scanf("%d",&id);
int i,j=1;
for(i=0;i<100;i++)
{
if(x==stu[i].id&&stu[i].school)
{
printf("已找到学生:");
printf("%s %s %d\n",stu[i].name,stu[i].sex,stu[i].id);
j=0;
}
}
if(j)
printf("找不到此人\n");
}
void seek(void)
{
char s[20];
int x,j;
printf("请输入命令:\n 1:按姓名查找\n 2:按学号查找\n");
scanf("%d",&x);
if(1==x)
seek_stu();
else if(2==x)
seek_fstu();
else
{
printf("命令错误\n");
}
}
修改功能分别修改学生基本信息和成绩两项功能差不多就写一起了。
void mod_stu(void)//修改
{
read_stu();
int i=0,j=1;
printf("请输入要修改信息的学生学号");
int x;
scanf("%d",&x);
for(i=0;i<100;i++)
{
if(x==stu[i].id&&stu[i].school)
{
printf("已找到请输入修改内容\n");
printf("请输入姓名:");
scanf("%s",stu[i].name);
printf("请输入性别:");
scanf("%s",stu[i].sex);
getchar();
printf("修改成功:%s %s\n",stu[i].name,stu[i].sex);
j=0;
break;
}
}
rewrite_stu();
if(j)
printf("查无此人\n");
}
void mods_stu(void)//修改成绩
{
read_stu();
int i=0,j=1;
printf("请输入要修改学生的学号");
int x;
scanf("%d",&x);
getchar();
for(i=0;i<100;i++)
{
if(x==stu[i].id&&stu[i].school)
{
printf("已找到请输入修改内容\n");
printf("请输入语文成绩:");
scanf("%f",&stu[i].chinese);
printf("请输入数学成绩:");
scanf("%f",&stu[i].math);
printf("请输入英语成绩:");
scanf("%f",&stu[i].english);
getchar();
printf("修改学生成功:%4.1f %4.1f %4.1f\n",stu[i].chinese,stu[i].math,stu[i].english);
j=0;
break;
}
}
rewrite_stu();
if(j)
printf("查无此人\n");
}
录入成绩:
void ent_stu(void)//录入成绩
{
int i=0,j=1;
printf("请输入要登录成绩的学生学号");
int x;
scanf("%d",&x);
getchar();
for(i=0;i<100;i++)
{
if(x==stu[i].id&&stu[i].school)
{
printf("已找到请输入学生成绩\n");
printf("请输入语文成绩:");
scanf("%f",&stu[i].chinese);
printf("请输入数学成绩:");
scanf("%f",&stu[i].math);
printf("请输入英语成绩:");
scanf("%f",&stu[i].english);
getchar();
printf("修改学生成功:%4.1f %4.1f %4.1f\n",stu[i].chinese,stu[i].math,stu[i].english);
j=0;
break;
}
}
rewrite_stu();
if(j)
printf("查无此人\n");
}
void ent_fstu(char* file)
{
read_stu();
FILE* path;
int i,j;
path = fopen(file,"r");
for(i=0;i<100;i++)
fscanf(path,"%d %f %f %f",&stuf[i].id,&stuf[i].chinese,&stuf[i].math,&stuf[i].english);
for(i=0;i<100;i++)
{
if(stu[i].id)//判断此人是否存在
{
for(j=0;j<100;j++)
{
if(stuf[j].id==stu[i].id)
{
stu[i].chinese=stuf[j].chinese;
stu[i].math=stuf[j].math;
stu[i].english=stuf[j].english;
break;
}
}
}
}
rewrite_stu();
}
void entall(void)
{
printf("请输入功能\n 1:单个录入成绩\n 2:按文件批量录入\n");
char x[20];
int a,i,j;
scanf("%d",&a);
if(a==1)
ent_stu();
else if(a==2)
{
printf("请输入文件名:\n");
scanf("%s",x);
ent_fstu(x);
}
else
printf("命令错误\n");
}
学生密码重置功能:
void reset_stu(void)
{
int i;
read_stu();
printf("请输入要重置学生的学号:\n");
int x;
scanf("%d",&x);
for(i=0;i<100;i++)
{
if(x==stu[i].id&&stu[i].school)//判断id以及是否在校
{
strcpy(stu[i].passwd,"123456");
}
}
rewrite_stu();
}
学生账号解锁函数:
void ulock_stu(void)
{
int i;
read_stu();
printf("请输入要解锁学生的学号:\n");
int x;
scanf("%d",&x);
for(i=0;i<100;i++)
{
if(x==stu[i].id&&stu[i].school)
{
stu[i].unlock=1;
}
}
rewrite_stu();
}
显示在校学生:
void list_stu(void)
{
read_stu();
int i;
for(i=0;i<100;i++)
{
if(stu[i].school)
{
printf("%s %s %d\n",stu[i].name,stu[i].sex,stu[i].id);
}
}
if(i==100)
printf("显示完毕\n");
}
显示离校学生:
void list_unstu(void)
{
read_stu();
int i;
for(i=0;i<100;i++)
{
if(!stu[i].school&&stu[i].id)
{
printf("%s %s %d\n",stu[i].name,stu[i].sex,stu[i].id);
}
}
if(i==100)
printf("显示完毕\n");
}
meun函数:
void meun(void)
{
char x;
for(;;)
{
printf("a:添加学生\n");
printf("b:删除学生\n");
printf("c:查询在校学生\n");
printf("d:修改在校学生\n");
printf("e:修改在校学生成绩\n");
printf("f:录入学生成绩\n");
printf("g:重置学生密码\n");
printf("h:解锁学生账号\n");
printf("i:显示在校学生\n");
printf("j:显示离校学生\n");
printf("k:退出\n");
scanf("%c",&x);
switch(x)
{
case 'a':add();
break;
case 'b':del_stu();
break;
case 'c':seek();
break;
case 'd':mod_stu();
break;
case 'e':mods_stu();
break;
case 'f':entall();
break;
case 'g':reset_stu();
break;
case 'h':ulock_stu();
break;
case 'i':list_stu();
break;
case 'j':list_unstu();
break;
default:return ;
}
}
}
以上就是这些,基本上meun函数就能查证所以函数,头文件那些就不放出来了。