我们先来看一下这个系统的大体框架吧:
本系统分为两个端一个是用户端另一个是管理员端。
支持一下功能:
0.退出系统。
1.用户端登录。
2.管理员端登录。
3.注册。(注册时需录入个人信息)
4.找回密码。
5.保存操作。
普通用户的端口,可以支持以下功能:
0.退回主界面。
1.查询个人信息。
2.修改个人信息。
3.查询所有病人和疑似患者。
管理员使用的端口(拥有更高的权限但需输入特定密码才可使用),可以支持一下功能:
0.退回主界面。
1.查询用户信息。
2.录入用户状态。(在用户的个人信息中录入用户的状态:1.正常。2.疑似患者。3.患者)
3.删除用户信息。
4.统计人数。
5.数据排序。
void Home(void);//打印主界面
void Client(void);//打印用户端
void Admin(void);//打印管理员端
void Regedit(void);//打印注册表
void Initlist(Linklist *&L);//链表初始化
void ListInsert(Linklist *&L,Linklist *p);//插入新的节点
void Fun_Regedit(Linklist *&L);//注册功能的实现
void Findpwd(Linklist *L);//找回密码
void Findpep(Linklist *L,Linklist *q);//查询信息
void Changepep(Linklist *L,Linklist *q);//修改信息
void Penquiry(Linklist *L);//显示所有病人
void Addstatus(Linklist *L);//录入用户状态
void Searchpep(Linklist *L);//查询用户信息
void Changepep_A(Linklist *L);//修改用户信息(管理员端)
void Deletepep(Linklist *&L);//删除用户信息
void Stats(Linklist *L);//统计数据
void Sort(Linklist *&L);//给数据排序并输出
void Savepep(Linklist *L);//保存信息到文件
void ReadSD(Linklist *&L);//读取文件
void Fun_Regedit(Linklist *&L)
{
printf("请输入身份证:\n");
scanf("%s",id);
Linklist *q=L->next;
while(q!=NULL)
{
if(strcmp(q->date.idcard,id)==0)//判断身份证是否已存在
{
printf("该用户已存在\n");
break;
}
q=q->next;
}
if(q==NULL)//若不存在则继续让用户输入其它信息
{
Linklist *p;
Initlist(p);
strcpy(p->date.idcard,id);
printf("请输入姓名:\n");
scanf("%s",nam);
strcpy(p->date.name,nam);
printf("请输入联系方式:\n");
scanf("%s",te);
strcpy(p->date.tel,te);
printf("请输入登录密码:\n");
scanf("%s",pw);
strcpy(p->date.pwd,pw);
printf("请录入状态 0.正常 1.疑似患者 2.病人(注册时请输入0):\n");
scanf("%d",&st);
while(st!=0){
//防止用户暴力输入
printf("输入有误,请重新输入\n");
scanf("%d",&st);
}
p->date.status=st;
ListInsert(L,p);
}
}
用户注册完成后,将信息保存在文件中。当用户选择登陆时只需核查相关信息即可。
void Sort(Linklist *&L)
{
Linklist *q;
Linklist *l;
for(q=L->next;q;q=q->next){
//采用冒泡排序的方法给数据排序
for(l=q->next;l;l=l->next){
if(q->date.status>l->date.status){
int y;//交换节点信息
strcpy(id,q->date.idcard);
strcpy(nam,q->date.name);
strcpy(pw,q->date.pwd);
strcpy(te,q->date.tel);
y=q->date.status;
q->date.status=l->date.status;
strcpy(q->date.idcard,l->date.idcard);
strcpy(q->date.name,l->date.name);
strcpy(q->date.pwd,l->date.pwd);
strcpy(q->date.tel,l->date.tel);
l->date.status=y;
strcpy(l->date.idcard,id);
strcpy(l->date.name,nam);
strcpy(l->date.pwd,pw);
strcpy(l->date.tel,te);
}
}
}
for(q=L->next;q;q=q->next){
//将排序结果输出
printf("姓名:%s\n",q->date.name);
printf("身份证:%s\n",q->date.idcard);
printf("联系方式:%s\n",q->date.tel);
printf("状态:%d\n",q->date.status);
}
}
笔者这里采用的是冒泡排序算法,交换时选择的是交换节点信息,其实可以只交换节点。(由于笔者写的交换节点函数,老是玄学出错,所以最终采用交换节点信息的办法,关于交换节点笔者会再写一篇博客来说明)
#include
#include
#include
typedef struct node{
char idcard[20];//身份证
char name[20];//姓名
char tel[20];//联系方式
char pwd[20];//密码
int status;//状态
} Node;
typedef struct Link{
Node date;
struct Link *next;
} Linklist;
//界面相关函数
void Home(void);//打印主界面
void Client(void);//打印用户端
void Admin(void);//打印管理员端
void Regedit(void);//打印注册表
//创建链表相关函数
void Initlist(Linklist *&L);//链表初始化
void ListInsert(Linklist *&L,Linklist *p);//插入新的节点
//注册相关函数
void Fun_Regedit(Linklist *&L);//注册功能的实现
//用户端功能相关函数
void Findpep(Linklist *L,Linklist *q);//查询信息
void Changepep(Linklist *L,Linklist *q);//修改信息
void Penquiry(Linklist *L);//显示所有病人
//找回密码
void Findpwd(Linklist *L);//找回密码
//管理员相关函数
void Addstatus(Linklist *L);//录入用户状态
void Searchpep(Linklist *L);//查询用户信息
void Changepep_A(Linklist *L);//修改用户信息(管理员端)
void Deletepep(Linklist *&L);//删除用户信息
void Stats(Linklist *L);//统计数据
void Sort(Linklist *&L);//给数据排序并输出
//文件系统相关函数
void Savepep(Linklist *L);//保存信息到文件
void ReadSD(Linklist *&L);//读取文件
char id[20];
char nam[20];
char te[20];
char pw[20];
int st;
char pw_A[20]="123456";//默认管理员密码 (无权更改,若要更改返回厂家)
int main ()
{
Linklist *L;
Initlist(L);
ReadSD(L);
int f;
while(1){
Home();
printf("请输入您需要的功能:\n");
scanf("%d",&f);
if(f==0) break;
else
//用户端
if(f==1){
int j=0;
printf("请输入联系方式:\n");
scanf("%s",te);
printf("请输入密码:\n");
scanf("%s",pw);
Linklist *q=L->next;
for(;q;q=q->next){
if(strcmp(q->date.tel,te)==0){
j=1;
if(strcmp(q->date.pwd,pw)==0){
while(1){
int i;
Client();
scanf("%d",&i);
if(i==0) break;
else if(i==1) Findpep(L,q);
else if(i==2) Changepep(L,q);
else if(i==3) Penquiry(L);
else printf("请正确输入\n");
}
}else printf("密码错误\n");
}
}
if(j==0) printf("查无该用户\n");
}else
//管理员端
if(f==2){
printf("请输入管理员密码\n");
scanf("%s",pw);
if(strcmp(pw,pw_A)==0){
while(1){
int i;
Admin();
scanf("%d",&i);
if(i==0) break;
else if(i==1) Searchpep(L);
else if(i==2) Changepep_A(L);
else if(i==3) Deletepep(L);
else if(i==4) Stats(L);
else if(i==5) Sort(L);
else printf("请正确输入\n");
}
}else printf("密码错误\n");
}else
//注册
if(f==3){
Regedit();
Fun_Regedit(L);
}else
//找回密码
if(f==4){
Findpwd(L);
}else
//保存操作
if(f==5){
Savepep(L);
}else printf("请正确输入\n");
}
}
void Home(void)
{
printf("######################################################\n");
printf("## ##\n");
printf("## 0.退出系统 ##\n");
printf("## 1.用户端登录 ##\n");
printf("## 2.管理员端登录 ##\n");
printf("## 3.注册 ##\n");
printf("## 4.找回密码 ##\n");
printf("## 5.保存操作 ##\n");
printf("## ##\n");
printf("######################################################\n");
}
void Client(void)
{
printf("######################################################\n");
printf("## ##\n");
printf("## 0.退回主界面 ##\n");
printf("## 1.查询个人信息 ##\n");
printf("## 2.修改个人信息 ##\n");
printf("## 3.查询所有病人和疑似患者 ##\n");
printf("## ##\n");
printf("######################################################\n");
}
void Admin(void)
{
printf("######################################################\n");
printf("## ##\n");
printf("## 0.退回主界面 ##\n");
printf("## 1.查询用户信息 ##\n");
printf("## 2.修改用户信息(录入用户状态) ##\n");
printf("## 3.删除用户信息 ##\n");
printf("## 4.统计人数 ##\n");
printf("## 5.数据排序 ##\n");
printf("## ##\n");
printf("######################################################\n");
}
void Regedit(void)
{
printf("######################################################\n");
printf("## ##\n");
printf("## 请依次输入以下信息 ##\n");
printf("## 1.身份证 ##\n");
printf("## 2.姓名 ##\n");
printf("## 3.联系方式 ##\n");
printf("## 4.密码 ##\n");
printf("## ##\n");
printf("######################################################\n");
}
void Initlist(Linklist *&L)
{
L=(Linklist *)malloc(sizeof(Linklist));
L->next=NULL;
}
void ListInsert(Linklist *&L,Linklist *p)
{
Linklist *q=NULL;
q=L;
p->next=q->next;
q->next=p;
}
void Fun_Regedit(Linklist *&L)
{
printf("请输入身份证:\n");
scanf("%s",id);
Linklist *q=L->next;
while(q!=NULL)
{
if(strcmp(q->date.idcard,id)==0)//判断身份证是否已存在
{
printf("该用户已存在\n");
break;
}
q=q->next;
}
if(q==NULL)//若不存在则继续让用户输入其它信息
{
Linklist *p;
Initlist(p);
strcpy(p->date.idcard,id);
printf("请输入姓名:\n");
scanf("%s",nam);
strcpy(p->date.name,nam);
printf("请输入联系方式:\n");
scanf("%s",te);
strcpy(p->date.tel,te);
printf("请输入登录密码:\n");
scanf("%s",pw);
strcpy(p->date.pwd,pw);
printf("请录入状态 0.正常 1.疑似患者 2.病人(注册时请输入0):\n");
scanf("%d",&st);
while(st!=0){
//防止用户暴力输入
printf("输入有误,请重新输入\n");
scanf("%d",&st);
}
p->date.status=st;
ListInsert(L,p);
}
}
void Findpep(Linklist *L,Linklist *q)
{
printf("姓名:%s\n",q->date.name);
printf("身份证:%s\n",q->date.idcard);
printf("联系方式:%s\n",q->date.tel);
printf("状态:%d\n",q->date.status);
}
void Changepep(Linklist *L,Linklist *q)
{
int flage;
printf("请输入您要更改的内容:1.姓名,2.身份证,3.联系方式,4.密码\n");
scanf("%d",&flage);
if(flage==1)
{
printf("请输入您要改的姓名:\n");
scanf("%s",nam);
strcpy(q->date.name,nam);
printf("修改成功\n");
}else if(flage==2)
{
printf("请输入您要改的身份证:\n");
scanf("%s",id);
strcpy(q->date.idcard,id);
printf("修改成功\n");
}else if(flage==3)
{
printf("请输入您要改的联系方式:\n");
scanf("%s",te);
strcpy(q->date.tel,te);
printf("修改成功\n");
}else if(flage==4)
{
printf("请输入您要改的密码:\n");
scanf("%s",pw);
strcpy(q->date.pwd,pw);
printf("修改成功\n");
}else printf("请输入正确选项\n");
}
void Penquiry(Linklist *L)
{
Linklist *q=L->next;
while(q!=NULL)
{
if(q->date.status==1||q->date.status==2) printf("%s\n",q->date.name);
q=q->next;
}
}
void Findpwd(Linklist *L)
{
printf("请输入用户联系方式\n");
scanf("%s",te);
printf("请输入身份证\n");
scanf("%s",id);
Linklist *q=L->next;
while(q!=NULL)
{
if(strcmp(q->date.tel,te)==0)
{
if(strcmp(q->date.idcard,id)==0)
{
printf("该用户的密码是:%s\n",q->date.pwd);
break;
}else{
printf("您输入的身份证有误\n");
break;
}
}else q=q->next;
}
if(q==NULL)
{
printf("您输入的联系方式有误\n");
}
}
void Addstatus(Linklist *L)
{
int f=0;
printf("请输入您要录入状态的用户联系方式:\n");
scanf("%s",&te);
Linklist *q=L->next;
for(;q;q=q->next){
if(strcmp(q->date.tel,te)==0){
printf("请录入状态 0.正常 1.疑似患者 2.病人\n");
scanf("%d",&q->date.status);
f=1;
break;
}
}
if(f==0) printf("查无该用户\n");
}
void Searchpep(Linklist *L)
{
int f=0;
printf("请输入您要查询的用户联系方式:\n");
scanf("%s",te);
printf("请输入您要查询的用户姓名:\n");
scanf("%s",nam);
Linklist *q=L->next;
for(;q;q=q->next){
if(strcmp(q->date.tel,te)==0){
f=1;
if(strcmp(q->date.name,nam)==0){
printf("姓名:%s\n",q->date.name);
printf("身份证:%s\n",q->date.idcard);
printf("联系方式:%s\n",q->date.tel);
printf("状态:%d\n",q->date.status);
break;
}else printf("姓名输入错误\n");
}
}
if(f==0) printf("查无该用户\n");
}
void Changepep_A(Linklist *L)
{
int f=0;
printf("请输入您要修改的用户联系方式:\n");
scanf("%s",&te);
Linklist *q=L->next;
for(;q;q=q->next){
if(strcmp(q->date.tel,te)==0){
int flage;
printf("请输入您要更改的内容:1.姓名,2.身份证,3.联系方式,4.状态\n");
scanf("%d",&flage);
if(flage==1)
{
printf("请输入您要改的姓名:\n");
scanf("%s",nam);
strcpy(q->date.name,nam);
printf("修改成功\n");
}else if(flage==2)
{
printf("请输入您要改的身份证:\n");
scanf("%s",id);
strcpy(q->date.idcard,id);
printf("修改成功\n");
}else if(flage==3)
{
printf("请输入您要改的联系方式:\n");
scanf("%s",te);
strcpy(q->date.tel,te);
printf("修改成功\n");
}else if(flage==4)
{
printf("请输入您要改的状态:0.正常 1.疑似病人 2.患者\n");
scanf("%d",&st);
while(st!=0&&st!=1&&st!=2){
printf("输入有误,请重新输入\n");
scanf("%d",&st);
}
q->date.status=st;
printf("修改成功\n");
}else printf("请输入正确选项\n");
f=1;
break;
}
}
if(f==0) printf("查无该用户\n");
}
void Deletepep(Linklist *&L)
{
printf("请输入您要删除的用户的联系方式:\n");
scanf("%s",te);
Linklist *p,*q;
q=L;
p=q->next;
int j=0;
while(p)
{
if(strcmp(p->date.tel,te)==0)
{
j=1;
q->next =p->next;
break;
}
q=p;
p=p->next;
}
if(j==0) printf("该用户不存在\n");
}
void Stats(Linklist *L)
{
int i,a=0,b=0,c=0;
printf("请输入要统计的类别 0.正常 1.疑似患者 2.病人\n");
scanf("%d",&i);
while(i!=0&&i!=1&&i!=2){
printf("输入有误,请重新输入\n");
scanf("%d",&i);
}
Linklist *p=L->next;
for(;p;p=p->next){
if(p->date.status==0) a++;
else if(p->date.status==1) b++;
else if(p->date.status==2) c++;
}
if(i==0) printf("正常人:%d\n",a);
else if(i==1) printf("疑似患者:%d\n",b);
else if(i==2) printf("病人:%d\n",c);
}
void Sort(Linklist *&L)
{
Linklist *q;
Linklist *l;
for(q=L->next;q;q=q->next){
//采用冒泡排序的方法给数据排序
for(l=q->next;l;l=l->next){
if(q->date.status>l->date.status){
int y;//交换节点信息
strcpy(id,q->date.idcard);
strcpy(nam,q->date.name);
strcpy(pw,q->date.pwd);
strcpy(te,q->date.tel);
y=q->date.status;
q->date.status=l->date.status;
strcpy(q->date.idcard,l->date.idcard);
strcpy(q->date.name,l->date.name);
strcpy(q->date.pwd,l->date.pwd);
strcpy(q->date.tel,l->date.tel);
l->date.status=y;
strcpy(l->date.idcard,id);
strcpy(l->date.name,nam);
strcpy(l->date.pwd,pw);
strcpy(l->date.tel,te);
}
}
}
for(q=L->next;q;q=q->next){
//将排序结果输出
printf("姓名:%s\n",q->date.name);
printf("身份证:%s\n",q->date.idcard);
printf("联系方式:%s\n",q->date.tel);
printf("状态:%d\n",q->date.status);
}
}
void Savepep(Linklist *L)
{
FILE *fq;
Linklist *p=L->next;
fq=fopen("用户.txt","wt");
while(p){
fprintf(fq,"%s %s %s %s %d \n",p->date.idcard,p->date.name,p->date.tel,p->date.pwd,p->date.status);
p=p->next;
printf("保存成功!\n");
}
fclose(fq);
}
void ReadSD(Linklist *&L)
{
FILE *fp;
fp=fopen("用户.txt","rb");
int i=0;
while(!feof(fp))
{
char id[20];
char nam[20];
char te[20];
char pw[20];
int st;
fscanf(fp," %s %s %s %s %d",id,nam,te,pw,&st);
i++;
}
fclose(fp);
FILE *FP;
FP=fopen("用户.txt","rb");
int b=i-1;
int j=1;
while(!feof(FP))
{
fscanf(FP,"%s %s %s %s %d",id,nam,te,pw,&st);
Linklist *n=(Linklist *)malloc(sizeof(Linklist));
strcpy(n->date.idcard,id);
strcpy(n->date.name,nam);
strcpy(n->date.pwd,pw);
strcpy(n->date.tel,te);
n->date.status=st;
ListInsert(L,n);
n=n->next;
if(j==b)
break;
j++;
}
fclose(FP);
}