问题提出
用C语言实现门禁系统功能。
功能简析
1,系统登录分为管理员登录和学生登录,输入相应字符即可选择登录;
2,学生登录,学生使用自己的账号密码登录系统,选择开启的门,即可开启门禁;此外系统还会记录下学生登录的信息,如登录账号、登录时间、开启哪间门;
3,管理员登录,管理员登录也是要输入特定的账号密码才能登录;登录之后才能进入管理员操作界面进行相应操作,如添加学生账号、删除学生账号、查看学生基本信息、查看学生登录情况……输入相应字符即可选择执行相应的功能。
4,管理员权限一:添加学生账号。输入学生姓名(即为账号)、密码、专业班级等基本信息,可用于后续查询,回车完成添加。查看系统中学生信息,该账号已存在
5,管理员权限二:删除学生账号。输入需要删除的账号,回车完成删除操作,查看系统数据库中已无该学生信息。
6,管理员权限三:查看所以学生基本信息。输入相应字符,即可查询所以信息
7,管理员权限四:查看学生登录门禁系统情况。输入相应相应字符,可按学生使用门禁系统时间先后顺序一次显示学生账号、登录时间,选择开启的门。
8,管理员权限五:修改存在于系统的学生信息。输入需要修改的学生账号,并输入修改后的账号、密码、专业班级等基本信息。
实现关键
首先考虑到要对学生账号等基本数据要重复使用,且易更改,下次使用时上次修改的信息还会存在而不是对代码进行修改,所以考虑使用对文本进行操作。将学生账号密码等数据信息全部储存在一个txt或dat文本中,调用函数对文本进行相应操作,对数据的操作即是对文件的操作。
代码实现
#include
#include
#include
#include
struct information
{
char name[10];
char password[10];
char profession[20];
};
struct Thelog
{
char name[10];
char times[24];
char num[1];
};
FILE *fp; //文件指针
information *head;//链表头指针
void add_student(information a); //函数[1]管理员添加学生账号,使用门禁系统
void delete_student(char names[10]);//函数[2]管理员员删除学生账号,解除使用门禁系统权限
void administrator_login(); //函数[3]管理员登陆
void administrator_management(); //函数[4]管理员操作界面,添加学生账号,删除学生账号,查看学生使用门禁情况
void student_login(); //函数[5]学生登陆,用于打开门禁
void time (); //函数[6]时间函数,用于显示登陆时间
void All_output(); //函数[7]全部学生信息
void the_log(information a,char num[1]); //函数[8]录入学生使用门禁情况
void log_output(); //函数[9]输出学生使用门禁情况
void replace_massage(char names[10]); //函数[10]更改学生信息,只有管理员有权限
int main()
{
int n;
printf(" *********************************************\n");
printf(" * 欢迎使用四海门禁系统!!! *\n");
printf(" *********************************************\n");
printf("\n");
printf(" */*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*\n");
printf(" *输入0:退出系统; 输入1:管理员登陆; 输入2:学生登陆*\n");
printf(" */*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*\n");
printf(" ");
scanf("%d",&n);
while(n!=0)
{
if(n==1)
administrator_login();
else if(n==2)
student_login();
else if(n>10||n<0)
{
printf(" *********************************************\n");
printf(" * 欢迎使用四海门禁系统!!! *\n");
printf(" *********************************************\n");break;
}
printf(" */*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*\n");
printf(" *输入0:退出系统; 输入1:管理员登陆; 输入2:学生登陆*\n");
printf(" */*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*\n");
printf(" ");
scanf("%d",&n);
}
printf(" *********************************************\n");
printf(" * 欢迎使用四海门禁系统!!! *\n");
printf(" *********************************************\n");
return 0;
}
void administrator_login() //管理员登录
{
information a;
printf(" 请输入管理员账号:");
scanf("%s",a.name);
printf(" 请输入管理员密码:");
scanf("%s",a.password);
if(strcmp(a.name,"管理员")==0&&strcmp(a.password,"123456789")==0)
{
printf("\n");
printf(" *********管理员登陆成功!!!*********\n\n");
administrator_management();
}
else
{
printf( " 管理员登陆失败!!!请检查仔细核对账号、密码\n");
}
}
void administrator_management() //管理员操作台
{
int num;
printf(" */*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/**/*/*/*\n");
printf(" *输入1:注册学生账号 输入2:删除账号 输入3:显示所有学生信息*\n");
printf(" *输入4;查看学生使用门禁情况 输入5:修改学生信息 输入6:刷新屏幕 *\n");
printf(" */*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/**/*/*/*\n");
printf(" ");
scanf("%d",&num);
while(num!=-1)
{
if(num==0||num>10||num<0)
{
printf(" 管理员身份已注销\n");
break;
}
if(num==1)
{
fp=fopen("student_Account.txt","a");
information a;
printf(" 请输入账号:");
scanf("%s",a.name);
printf(" 请输入密码:");
scanf("%s",a.password);
printf(" 请输入专业班级:");
scanf("%s",a.profession);
add_student(a);
fclose(fp);
}
if(num==2)
{
char names[10];
printf(" 请输入要删除的账号:");
scanf("%s",names);
delete_student(names);
}
if(num==3)
{
fp=fopen("student_Account.txt","r");
All_output();
fclose(fp);
}
if(num==4)
{
fp=fopen("Thelog.txt","r");
log_output();
fclose(fp);
}
if(num==5)
{
char names[10];
fp=fopen("student_Account.txt","r+");
printf(" 请输入需要修改的账号:");
scanf("%s",names);
replace_massage(names);
fclose(fp);
}
if(num==6)
{
system("cls");
}
printf(" */*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/**/*/*/*\n");
printf(" *输入1:注册学生账号 输入2:删除账号 输入3:显示所有学生信息*\n");
printf(" *输入4;查看学生使用门禁情况 输入5:修改学生信息 输入6:刷新屏幕 *\n");
printf(" */*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/**/*/*/*\n");
printf(" ");
scanf("%d",&num);
}
}
void student_login() //学生登录
{
information a;
information b;
fp=fopen("student_Account.txt","r");
printf(" 请输入账号:");
scanf("%s",a.name);
printf(" 请输入密码:");
scanf("%s",a.password);
fread(&b,sizeof(struct information),1,fp);
int i=0;
while(feof(fp)==0)
{
if(strcmp(a.name,b.name)==0&&strcmp(a.password,b.password)==0)
{
char num[1];
printf(" 请选择要打开几号门\n");
printf(" ");
scanf("%s",num);
time();
printf(" 亲爱的%s童鞋,你成功登陆本系统,已开启%s号门\n",a.name,num);
i++;
the_log(a,num);
}
fread(&b,sizeof(struct information),1,fp);
}
if(i==0)
printf(" 登陆账号不存在或密码错误!!!若无账号请联系管理员分配账号\n");
fclose(fp);
}
void delete_student(char names[10]) //管理员删除学生账号,解除使用门禁权限
{
FILE *p;
information a;
int i=0;
fp=fopen("student_Account.txt","r");
p=fopen("student.txt","w");
fread(&a,sizeof(struct information),1,fp);
while(feof(fp)==0)
{
if(strcmp(a.name,names)==0)
{fread(&a,sizeof(struct information),1,fp);i=1;}
else
{
fwrite(&a,sizeof(struct information),1,p);
}
fread(&a,sizeof(struct information),1,fp);
}
if(strcmp(a.name,names)!=0)
fwrite(&a,sizeof(struct information),1,p);
else
i=1;
if(i==0)
printf(" 账号%s不在系统中\n",names);
else
printf(" 账号%s已成删除\n",names);
fclose(fp);
fclose(p);
remove("student_Account.txt");
rename("student.txt","student_Account.txt");
}
void add_student(information a) //管理员添加学生信息,分配账号,授权使用门禁系统
{
fseek(fp,-sizeof(struct information),1);
fwrite(&a,sizeof(struct information),1,fp);
printf(" 添加学生%s成功!!!\n\n",a.name);
}
void time() //显示本地时间
{
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime (&rawtime );
printf(" %s",asctime (timeinfo));
}
void All_output() //输出所有学生信息
{
int i=0;
information a;
fread(&a,sizeof(struct information),1,fp);
while(feof(fp)==0)
{
printf(" * * * * * * * * * * * * * * * * * * * * * * *\n");
printf(" * 学生账号:%-20s*\n",a.name);
printf(" * 学生密码:%-20s*\n",a.password);
printf(" * 专业班级:%-20s*\n",a.profession);
printf(" * * * * * * * * * * * * * * * * * * * * * * *\n");
printf("\n");
i++;
fread(&a,sizeof(struct information),1,fp);
}
if(i==0)
printf(" 系统中无学生账号!!!\n\n");
}
void the_log(information a,char num[1]) //实时保存学生使用门禁系统情况
{
FILE *p;
Thelog c;
strcpy(c.name,a.name);
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo =localtime ( &rawtime );
strcpy(c.times,asctime (timeinfo));
strcpy(c.num,num);
p=fopen("Thelog.txt","a");
fwrite(&c,sizeof(struct Thelog),1,p);
fclose(p);
}
void log_output() //输出学生使用门禁系统情况
{
Thelog a;
fread(&a,sizeof(struct Thelog),1,fp);
while(feof(fp)==0)
{
printf("%s",a.times);
printf("学生%s登录了门禁系统,并开启了%s号门\n",a.name,a.num);
fread(&a,sizeof(struct Thelog),1,fp);
}
}
void replace_massage(char names[10]) //更改学生信息
{
information a;
information b;
fread(&a,sizeof(struct information),1,fp);
if(strcmp(names,a.name)==0)
{
printf(" 请输入更改后的账号:");
scanf("%s",b.name);
printf(" 请输入修改后的密码:");
scanf("%s",b.password);
printf(" 请输入修改后的专业班级:");
scanf("%s",b.profession);
fseek(fp,-sizeof(struct information),1);//文件指针退回原结构体头
fwrite(&b,sizeof(struct information),1,fp);//更新联系人信息
printf(" 信息更改成功!!!\n\n");
}
else if(feof(fp)==0)
replace_massage(names);//递归调用直到找到需要更改的姓名,并完成更改
else
printf("%s不在系统中!!!\n\n",names);
}