学生需求分析
学生:
姓名 性别 学号 密码 语文 数学 英语
1、第一次登录强制修改密码。
2、查询成绩
排名 不显示姓名和学号。
平均分
最高分
最低分
3、修改密码
4、查看个人信息
5、三次密码错误锁定帐号,由教师解锁
#include <stdio.h>
#include <stdlib.h>
#include <getch.h>
#include <string.h>
#include "student.h"
#include "tools.h"
//控制面板
int stu_face(void)
{
printf("-----------------------\n");
printf("| 1.查询成绩 |\n");
printf("| 2.修改密码 |\n");
printf("| 3.查看个人信息 |\n");
printf("| q.退出 |\n");
printf("-----------------------\n");
int cmd = getch()-'0';
return cmd;
}
//分数排序,按高到低
int compare(const void* a,const void* b)
{
return *(int*)b - *(int*)a;
}
void write_stu(Student stu[],int stui)
{
FILE * fwp = fopen("./stuatschool.txt","w");
if(fwp == NULL)
{
perror("fopen");
}
for(int i = 0; i<stui; i++)
{
fprintf(fwp,"%s %s %s %s %f %f %f %d %d\n",stu[i].name,stu[i].sex,stu[i].sid,stu[i].pwd,stu[i].chn,stu[i].math,stu[i].eng,stu[i].ver,stu[i].times);
}
fclose(fwp);
fwp = NULL;
}
//读在校学生个数,并将其写到结构体中
int read_stu(Student stu[])
{
FILE * frp = fopen("./stuatschool.txt","r");
if(frp == NULL)
{
perror("fopen");
return 0;
}
int ret,i=0,jud=1;
while((ret = fgetc(frp) != EOF))
{
if(jud == 1)
{
fseek(frp,-1,SEEK_CUR);
jud = 0;
}
fscanf(frp,"%s %s %s %s %f %f %f %d %d",stu[i].name,stu[i].sex,stu[i].sid,stu[i].pwd,&stu[i].chn,&stu[i].math,&stu[i].eng,&stu[i].ver,&stu[i].times);
i++;
}
fclose(frp);
frp = NULL;
return i-1;
}
// 移到被锁定的学生文件
void add_stu_lock(Student stu[],int lock)
{
FILE * fap = fopen("./stulock.txt","a");
if(fap == NULL)
{
perror("fopen");
}
fprintf(fap,"%s %s %s %s %f %f %f %d %d\n",stu[lock].name,stu[lock].sex,stu[lock].sid,stu[lock].pwd,stu[lock].chn,stu[lock].math,stu[lock].eng,stu[lock].ver,stu[lock].times);
fclose(fap);
fap = NULL;
return;
}
//强制改密码,
int forceModify_stu(void)
{
Student stu[256] = {};
int stui = read_stu(stu);
printf("请输入你的id号:\n");
char k_id[20] = {};
scanf("%s",k_id);
int i=0;
for(i = 0; i<stui; i++)
{
if(!strcmp(stu[i].sid,k_id))
break;
}
if(i != stui)
{
if(stu[i].ver == 0)
{
FILE * fwp = fopen("./stuatschool.txt","w");
if(fwp == NULL)
{
perror("fopen");
return 0;
}
printf("第一次登陆强制修改密码!\n");
printf("请输入新密码:\n");
scanf("%s",stu[i].pwd);
stu[i].ver = 1;
rewind(fwp);
for(int i = 0; i<stui; i++)
{
fprintf(fwp,"%s %s %s %s %f %f %f %d %d\n",stu[i].name,stu[i].sex,stu[i].sid,stu[i].pwd,stu[i].chn,stu[i].math,stu[i].eng,stu[i].ver,stu[i].times);
}
fclose(fwp);
fwp = NULL;
}
}
if(i == stui)
{
printf("没有这个ID,请重试!\n");
scanf("%*c");
scanf("%*c");
return -10;
}
int id = atoi(k_id);
return id;
}
//登录验证
int check_stu(int id)
{
char k_pwd[15];
system("clear");
printf("------学生登录------\n");
printf("请输入密码:\n");
scanf("%*c");
coverKey(k_pwd);
Student stu[256] = {};
int stui=read_stu(stu);
char k_id[20] = {};
sprintf(k_id,"%d",id);
int j=0;
for(j=0;j<stui;j++)
{
if(!strcmp(stu[j].sid,k_id))
{
if(!strcmp(stu[j].pwd,k_pwd))
{
break;
}
else
{
printf("\n密码不正确!\n");
scanf("%*c");
return j;
}
}
}
return j-256;
}
//分数查询
void score(int ssi)
{
system("clear");
Student stu[256] = {};
int stui=read_stu(stu);
//分数集
float cavg=0,mavg=0,eavg=0;
int cmax=0,cmin=100;
int mmax=0,mmin=100;
int emax=0,emin=100;
int chn = 1, math = 1,eng = 1;
for(int j=0;j<stui;j++)
{
//平均分
cavg+=stu[j].chn;
mavg+=stu[j].math;
eavg+=stu[j].eng;
//最高分
if(cmax<stu[j].chn)
cmax = stu[j].chn;
if(mmax<stu[j].math)
mmax = stu[j].math;
if(emax<stu[j].eng)
emax = stu[j].eng;
//最低分
if(cmin>stu[j].chn)
cmin = stu[j].chn;
if(mmin>stu[j].math)
mmin = stu[j].math;
if(emin>stu[j].eng)
emin = stu[j].eng;
//排名
if(stu[ssi].chn < stu[j].chn) chn++;
if(stu[ssi].math < stu[j].math) math++;
if(stu[ssi].eng < stu[j].eng) eng++;
}
printf("语文成绩:%f 语文排名:%d\n",stu[ssi].chn,chn);
printf("数学成绩:%f 数学排名:%d\n",stu[ssi].math,math);
printf("英语成绩:%f 英语排名:%d\n\n",stu[ssi].eng,eng);
printf("语文->最高分:%d 最低分:%d 平均分:%.1f \n",cmax,cmin,cavg/(stui));
printf("数学->最高分:%d 最低分:%d 平均分:%.1f\n",mmax,mmin,mavg/(stui));
printf("英语->最高分:%d 最低分:%d 平均分:%.1f \n\n",emax,emin,eavg/(stui));
anykey_continue();
}
//学生重置密码
void stuModify(int ssi)
{
Student stu[256] = {};
int stui = read_stu(stu);
printf("请输入新密码:\n");
scanf("%s",stu[ssi].pwd);
scanf("%*c");
printf("密码修改成功!\n");
anykey_continue();
write_stu(stu,stui);
return;
}
// 4、查看个人信息
void show_self(int ssi)
{
Student stu[256] = {};
read_stu(stu);
printf("姓名:%s\n性别:%s\nID:%s\n密码:%s\n",stu[ssi].name,stu[ssi].sex,stu[ssi].sid,stu[ssi].pwd);
//scanf("%*c");
anykey_continue();
return;
}
void run_stu(void)
{
int stucnt = 0,lock = 0,ssi = 0;
while(stucnt < 3)
{
int fm = forceModify_stu();
if(fm == -10)
{
return;
}
lock = check_stu(fm);
ssi = lock + 256;
if(lock<0)
{
//进入页面
for(;;)
{
system("clear");
switch(stu_face())
{
case 1:
//分数查询
score(ssi);
break;
case 2:
//修改密码
stuModify(ssi);
break;
case 3:
//查询个人信息,显示
show_self(ssi);
break;
case 65:
//退出
exit(0);
}
}
}
else
{
stucnt++;
}
}
Student stu[256] = {};
int stui = read_stu(stu);
stu[lock].ver = 2;
write_stu(stu,stui);
add_stu_lock(stu,lock);
printf("三次密码错误锁定帐号,由教师解锁!\n");
exit(0);
}
校长需求分析
校长:
admin
1、第一次登录强制修改密码。
2、能重置自己的密码
3、能重置教师密码
4、添加教师
5、删除教师
6、显示所有在职教师
7、显示所有离职教师
#include "admin.h"
#include "tools.h"
#include <stdio.h>
#include "teacher.h"
#include <getch.h>
#include <string.h>
#include <stdlib.h>
//主页面
int admin_face(void)
{
printf("-----------------------\n");
printf("| 1.设置自己的密码 |\n");
printf("| 2.修改教师密码 |\n");
printf("| 3.添加老师 |\n");
printf("| 4.删除教师 |\n");
printf("| 5.显示在职教师 |\n");
printf("| 6.显示离职教师 |\n");
printf("| 7.解锁老师 |\n");
printf("| 8.退出 |\n");
printf(" -----------------------\n");
int cmd = getch()-'0';
return cmd;
}
// 读入在职教师文件
int readtch(Teacher tch[])
{
FILE * frp = fopen("./tch.txt","r");
if(frp == NULL)
{
perror("fopen");
return 0;
}
int ret,i=0,jud=1;
while((ret = fgetc(frp) != EOF))
{
if(jud == 1)
{
fseek(frp,-1,SEEK_CUR);
jud = 0;
}
fscanf(frp,"%s %s %d %s %hhd",tch[i].name,tch[i].sex,&tch[i].id,tch[i].pwd,&tch[i].ver);
i++;
}
int tchi = i-1;
fclose(frp);
frp = NULL;
return tchi;
}
// 重写在职老师文件
void write_tch(Teacher tch[],int tchi)
{
FILE * fwp = fopen("./tch.txt","w");
if(fwp == NULL)
{
perror("fopen");
}
for(int i = 0; i<tchi; i++)
{
if(tch[i].ver == 0 || tch[i].ver == 1)
fprintf(fwp,"%s %s %d %s %hhd\n",tch[i].name,tch[i].sex,tch[i].id,tch[i].pwd,tch[i].ver);
}
fclose(fwp);
fwp = NULL;
}
// 读取离职教师文件
int readtch_leave(Teacher tch[])
{
FILE * frp = fopen("./tchleave.txt","r");
if(frp == NULL)
{
perror("fopen");
return 0;
}
int ret,i=0,jud=1;
while((ret = fgetc(frp) != EOF))
{
if(jud == 1)
{
fseek(frp,-1,SEEK_CUR);
jud = 0;
}
fscanf(frp,"%s %s %d %s %hhd",tch[i].name,tch[i].sex,&tch[i].id,tch[i].pwd,&tch[i].ver);
i++;
}
int tchi = i-1;
fclose(frp);
frp = NULL;
return tchi;
}
//读取被锁定的教师文件
int readtch_lock(Teacher tch[])
{
FILE * frp = fopen("./tchlock.txt","r");
if(frp == NULL)
{
perror("fopen");
}
int ret,i=0,jud=1;
while((ret = fgetc(frp) != EOF))
{
if(jud == 1)
{
fseek(frp,-1,SEEK_CUR);
jud = 0;
}
fscanf(frp,"%s %s %d %s %hhd",tch[i].name,tch[i].sex,&tch[i].id,tch[i].pwd,&tch[i].ver);
i++;
}
int tchi = i-1;
fclose(frp);
frp = NULL;
return tchi;
}
//重写被锁定的教师文件
void write_unLock_tch(Teacher tch[], int tchi)
{
int i = 0;
FILE * fwp = fopen("./tchlock.txt","w");
if(fwp == NULL)
{
perror("fopen");
}
for(i = 0; i<tchi; i++)
{
if(tch[i].ver != 0)
{
scanf("%*c");
fprintf(fwp,"%s %s %d %s %hhd\n",tch[i].name,tch[i].sex,tch[i].id,tch[i].pwd,tch[i].ver);
}
}
fclose(fwp);
fwp = NULL;
}
//移到离职教师文件
void add_tch_leave(Teacher tch[],int tchi)
{
FILE * fap = fopen("./tchleave.txt","a");
if(fap == NULL)
{
perror("fopen");
}
for(int i = 0; i<tchi; i++)
{
if(tch[i].ver == -1)
{
fprintf(fap,"%s %s %d %s %hhd\n",tch[i].name,tch[i].sex,tch[i].id,tch[i].pwd,tch[i].ver);
}
}
fclose(fap);
fap = NULL;
return;
}
//移除被锁定教师
void add_tch_lock(Teacher tch[],int i)
{
FILE * fap = fopen("./tch.txt","a");
if(NULL == fap)
{
perror("fopen");
return;
}
fprintf(fap,"%s %s %d %s %hhd\n",tch[i].name,tch[i].sex,tch[i].id,tch[i].pwd,tch[i].ver);
fclose(fap);
fap = NULL;
return;
}
//读取校长文件
void read_ad(struct Admin *ad)
{
FILE * fp = fopen("./ad.txt","r");
if(fp == NULL)
{
perror("fopen");
return;
}
fscanf(fp,"%d %s %hhd",&ad->id,ad->pwd,&ad->ver);
fclose(fp);
fp = NULL;
return;
}
//重写校长文件
void write_ad(struct Admin *ad)
{
FILE * fwp = fopen("./ad.txt","w");
if(fwp == NULL)
{
perror("fopen");
return;
}
fprintf(fwp,"%d %s %hhd\n",ad->id,ad->pwd,ad->ver);
fclose(fwp);
fwp = NULL;
return;
}
//强制改密码,
void forceModify_ad(void)
{
Admin ad = {};
read_ad(&ad); // 读入校长
if(ad.ver == 0)
{
printf("第一次登陆强制修改密码!\n");
printf("请输入新密码: ");
coverKey(ad.pwd); // 隐藏密码
ad.ver = 1;
write_ad(&ad); // 重写校长
printf("修改成功!\n");
anykey_continue();
}
return;
}
//登录验证
int check_ad(void)
{
int k_id; // 定义验证密码
char k_pwd[15];
Admin ad = {};
read_ad(&ad); // 读入校长文件
printf("------校长登录------\n");
printf("请输入id号:");
scanf("%d",&k_id);
scanf("%*c");
printf("请输入密码:");
coverKey(k_pwd); // 隐藏密码
if(ad.id == k_id)
{
if(strcmp(ad.pwd,k_pwd))
{
printf("\n密码不正确!\n");
return 0;
}
}
else
{
printf("没有这个ID,请重试!\n");
return 0;
}
return 1;
}
//修改自己的密码
void adModify(void)
{
Admin ad = {};
read_ad(&ad); // 读入校长文件
char oldpwd[15] = {};
strcpy(oldpwd,ad.pwd);
FILE * fwp = fopen("./ad.txt","w");
if(fwp == NULL)
{
perror("fopen");
return;
}
printf("请输入新密码:");
coverKey(ad.pwd); // 隐藏密码
char repwd[15] = {};
printf("\n");
fflush(stdout);
printf("请再输一遍:\n");
coverKey(repwd); // 隐藏密码
if(!strcmp(repwd,ad.pwd))
{
fprintf(fwp,"%d %s %hhd\n",ad.id,ad.pwd,ad.ver);
printf("修改成功!\n");
fclose(fwp);
fwp = NULL;
anykey_continue();
}
else
{
fprintf(fwp,"%d %s %hhd\n",ad.id,oldpwd,ad.ver);
printf("两次密码不相同,请重试!\n");
scanf("%*c");
fclose(fwp);
fwp = NULL;
return;
}
}
//重置教师密码
void tchModify(void)
{
int i = 0,tchi = 0;
Teacher tch[256] = {};
tchi = readtch(tch); // 读取在职教师文件,返回教师数量
long tchid = 0;
printf("请输入要修改密码的老师ID:");
scanf("%ld",&tchid);
for(i = 0; i<tchi; i++)
{
if(tchid == tch[i].id)
{
printf("请输入新密码:");
scanf("%s",tch[i].pwd);
break;
}
}
if(i == tchi)
{
printf("输入的ID错误,请重试!\n");
anykey_continue();
return;
}
write_tch(tch,tchi); // 重写在职老师文件
printf("修改成功!\n");
anykey_continue();
}
//添加教师
void addtch(void)
{
FILE * fap = fopen("./tch.txt","a");
if(NULL == fap)
{
perror("fopen kk");
return;
}
Teacher tch = {.pwd = "123456",.ver = 0};
printf("输入要添加的教师姓名:");
scanf("%s",tch.name);
printf("输入要添加的教师性别:");
scanf("%s",tch.sex);
printf("输入要添加的教师ID:");
scanf("%d",&tch.id);
fprintf(fap,"%s %s %d %s %hhd\n",tch.name,tch.sex,tch.id,tch.pwd,tch.ver);
fclose(fap);
fap = NULL;
printf("添加成功!\n");
anykey_continue();
return;
}
//删除教师
void deltch(void)
{
int tchi = 0, i = 0;
Teacher tch[256] = {};
tchi = readtch(tch); // 读入在职教师文件
int tchid = 0;
printf("请输入要删除的老师ID:");
scanf("%d",&tchid);
for(i = 0; i<tchi; i++)
{
if(tchid == tch[i].id)
{
tch[i].ver = -1;
break;
}
}
if(i == tchi)
{
printf("输入的ID错误,请重试!\n");
anykey_continue();
return;
}
write_tch(tch,tchi); // 重写在职教师文件
add_tch_leave(tch,tchi); // 移到离职教师文件
printf("删除成功!");
anykey_continue();
}
//显示在职教师的txt文件
void show_tch_stay(void)
{
int tchi = 0;
Teacher tch[256] = {};
tchi = readtch(tch);
for(int i = 0; i<tchi; i++)
{
printf("姓名:%s 性别:%s ID:%d\n",tch[i].name,tch[i].sex,tch[i].id);
}
anykey_continue();
}
//显示离职教师文件
void show_tch_del(void)
{
int tchi = 0;
Teacher tch[256] = {};
tchi = readtch_leave(tch);
for(int i = 0; i<tchi; i++)
{
printf("姓名:%s 性别:%s ID:%d\n",tch[i].name,tch[i].sex,tch[i].id);
}
anykey_continue();
}
//解锁老师
void unLock_tch(void)
{
int i = 0,tchi = 0;
Teacher tch[256] = {};
tchi = readtch_lock(tch); //读取被锁定的教师文件
int tchid = 0;
printf("请输入要解锁的教师ID:");
scanf("%d",&tchid);
for(i = 0; i<tchi; i++)
{
if(tch[i].id == tchid)
{
tch[i].ver = 0;
break;
}
}
if(i == tchi)
{
printf("ID有误!\n");
anykey_continue();
return;
}
add_tch_lock(tch,i);
write_unLock_tch(tch,tchi); //重写被锁定的教师文件
printf("解锁成功!\n");
anykey_continue();
}
void run_admin(void)
{
forceModify_ad(); // 强制修改密码
if(check_ad()) // 如果登入成功
{
for(;;)
{
system("clear");
switch(admin_face())
{
case 1:
adModify();
break;
case 2:
tchModify();
break;
case 3:
addtch();
break;
case 4:
deltch();
break;
case 5:
show_tch_stay();
break;
case 6:
show_tch_del();
break;
case 7:
unLock_tch();
break;
case 8:
exit(0);
}
}
}
}