管理系统的实现


管理系统应该是每个计算机学习者的第一个项目吧。(笔者也不例外)
由于时下疫情横行,所以笔者所选的主题是新冠病毒的管理系统。

我们先来看一下这个系统的大体框架吧:

1.框架

本系统分为两个端一个是用户端另一个是管理员端。

主界面:

支持一下功能:
0.退出系统。
1.用户端登录。
2.管理员端登录。
3.注册。(注册时需录入个人信息)
4.找回密码。
5.保存操作。

用户端:

普通用户的端口,可以支持以下功能:
0.退回主界面。
1.查询个人信息。
2.修改个人信息。
3.查询所有病人和疑似患者。

管理员端:

管理员使用的端口(拥有更高的权限但需输入特定密码才可使用),可以支持一下功能:
0.退回主界面。
1.查询用户信息。
2.录入用户状态。(在用户的个人信息中录入用户的状态:1.正常。2.疑似患者。3.患者)
3.删除用户信息。
4.统计人数。
5.数据排序。

2.函数展示

界面相关函数:

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);//读取文件

3.部分函数代码展示:

1.注册函数的实现:

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);
	} 
}

用户注册完成后,将信息保存在文件中。当用户选择登陆时只需核查相关信息即可。

2.数据排序函数实现:

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);
	}
}

笔者这里采用的是冒泡排序算法,交换时选择的是交换节点信息,其实可以只交换节点。(由于笔者写的交换节点函数,老是玄学出错,所以最终采用交换节点信息的办法,关于交换节点笔者会再写一篇博客来说明)

4.完整代码展示:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

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); 
} 
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值