看病排队候诊(3个优先级)代码有少许不严谨。

本文介绍了一个基于优先级的医院看病候诊管理系统,系统通过链队列实现不同优先级病人的管理和调度,支持新病人加入候诊、医生诊治、诊室分配等功能,同时提供了病人信息统计和查询。

/*consts.h /
#include<string.h>
#include<malloc.h> /
malloc()等 /
#include<stdio.h> /
EOF(=^Z或F6),NULL /
#include<stdlib.h> /
atoi() //system/
#include<io.h> /
eof() /
#include<math.h> /
floor(),ceil(),abs() */
#include<Windows.h>
int count=0;//新病人候诊人数
int l=0;//判断患者是否分配完毕
int m=0;//已叫号人数
int s1=0;//第一队列人数
int s2=0;//第二队列人数
int s3=0;//第三队列人数
int sum=0;//记录看病人数
#define Max 1000 //定义医院病人最大容纳量
typedef int DataType;//对int重新命名
typedef struct qnode//链队列结点结构定义
{
DataType data;
struct qnode *next;//指针域
}LinkList;

typedef struct
{
LinkList *front;//队列头指针
LinkList *rear;//队列尾指针
}LinkQueue;
struct hospital//定义患者信息结构体
{
char name[10];//姓名
int age;//年龄
int room;//诊室
char sex[5];//性别
int priority;//队列优先级
}hos[Max];//结构体变量名

typedef struct The_users //typedef 可以定义结构体别名
{
char id[20]; //账号
char pwd[20]; //密码
char name[15];//姓名为字符串
char sex; //性别为单个字符
long phone; //电话号码为长整型
}users;
//置空队
LinkQueue * LQueueCreateEmpty()
{
LinkQueue *q;
q=(LinkQueue *)malloc(sizeof(LinkQueue));//对队列q分配空间
LinkList *p;
p=(LinkList *)malloc(sizeof(LinkList *));//对链队列p分配空间
p->next=NULL;//置队列为空
q->front=p;//将队列头节点指针指向新队列p
q->rear=q->front;//更新尾结点
return q;//返回头指针
}
//判断空队列
int EmptyQueue(LinkQueue *q)
{
int r=0;
if(q->front==q->rear)//如果头结点等于尾结点,则判断此为空队列
r=0;
else
r=1; //反之亦然
return r;

}//进队函数
void InQueue(LinkQueue q,DataType i)//将元素i插入到队列q中 作为q的新队尾
{
LinkList p;//声明新节点p
p=(LinkList )malloc(sizeof(LinkList));//为新节点分配空间
if(pNULL)//判断新节点是否为空
{
printf(" 内存分配失败!\n");//如果为空则上述分配空间失败
}
else
{
p->data=i;//将要插入队列的数据存储到data中
p->next=NULL;//置新节点的指针为空
q->rear->next=p;//将链队列的最后一个节点的指针指向新节点
q->rear=p;//将队尾指向新节点
}
}
//出队函数
DataType OutQueue(LinkQueue *q)//定义一个返回值为DataType的出队函数,并传参数队列q
{
LinkList *p;//声明一个链队列p
DataType x;//定义出队数值
if(q->front->next
q->rear)//跳过头结点,头结点是存储队列长度的,但next指向了最早进入队列的结点
{
q->front=q->rear;//如果上述成立,则将尾节点指针指向给头节点指针
x=q->rear->data;//并且将尾指针指向空间内的数据赋值给x
}
else
{
p=q->front->next;//取对头
q->front->next=p->next;//删除对头节点
x=p->data;//将结点的数据赋值给x
free§;//清空队列p
}
return x;//返回出队的值
}
void MyEnQueue(LinkQueue q1,LinkQueue q2,LinkQueue q3,DataType d,struct hospital hos[])
//重新定义带有优先权限的队列入队操作,也就是新病人加入候诊
{
if(hos[count].priority1)//判断优先级是否为1
{
InQueue(q1,d);//如果是则传优先级低的队列q1并插入元素d
s1+=1;//优先级低的病人加1
printf(" 此时优先级别低的病人有%d人\n",s1);
printf("\n");
printf("\n");
}
else if(hos[count].priority
2)//判断优先级是否为2
{
InQueue(q2,d);//如果是则传优先级中的队列q2并插入元素d
s2+=1;//优先级中的病人加1
printf(" 此时优先级别中的病人有%d人\n",s2);
printf("\n");
printf("\n");
}
else
{
InQueue(q3,d);//其他则传优先级高的队列q3并插入元素d
s3+=1;//优先级高的病人加1
printf(" 此时优先级别高的病人有%d人\n",s3);
printf("\n");
printf("\n");
}
}
DataType MyDeQueue(LinkQueue q1,LinkQueue q2,LinkQueue q3)
//重新定义带有优先权限的队列出队操作,也就是按病人优先级开始诊治
{
DataType e;////病人看病的优先级别
if(EmptyQueue(q3))//判断优先级别最高的队列是否为空,如果不为空,就出队诊治
{
e=OutQueue(q3);
s3-=1;//出队诊治后优先级高的队列中病人减一
printf(" 此时优先级别高的病人还剩%d人\n",s3);
printf("\n");
}
else if(EmptyQueue(q2))//在优先级别高队列为空的情况下
//判断优先级别最中的队列是否为空,如果不为空,就出队诊治
{
e=OutQueue(q2);//出队诊治后优先级中的队列中病人减一
s2-=1;
printf(" 此时优先级别中的病人还剩%d人\n",s2);
printf("\n");
}
else if(EmptyQueue(q1))//在优先级别高,中队列都为空的情况下
//判断优先级别最低的队列是否为空,如果不为空,就出队诊治
{
e=OutQueue(q1);
s1-=1;//出队诊治后优先级低的队列中病人减一
printf(" 此时优先级别低的病人还剩%d人\n",s1);
printf("\n");
}
else
e= -1;//如果队列优先级高中低都为空,则返回-1;
return e;
}
//看病候诊管理系统主界面
void introduce()
{
printf("\t\t|-------------------------------|\n");
printf("\t\t|
|\n");
printf("\t\t|
|\n");
printf("\t\t|
看病候诊管理系统 |\n");
printf("\t\t|
|\n");
printf("\t\t|
|\n");
printf("\t\t|
|\n");
printf("\t\t|
功能选择: |\n");
printf("\t\t|
1:进入挂号就诊系统 |\n");
printf("\t\t|
2:退出 |\n");
printf("\t\t|
|\n");
printf("\t\t|
|\n");
printf("\t\t|
|\n");
printf("\t\t|
请输入你的选择(1-2): |\n");
printf("\t\t|
|\n");
printf("\t\t|
*********|\n");
}

//按性别任意年龄段进行统计并打印//
void tongji(struct hospital hos[])
{
int up=0;//年龄段分界限标记人数
int down=0;//年龄段分界限标记人数
int man=0;//男性人数
int woman=0;//女性人数
int n, X;//看病人数和年龄分界线
for(n=0;n<sum;n++)//count定义的全局变量,表示医院看病的总人数
{
if(strcmp(hos[n].sex,“man”)==0)//for循环语句嵌套if-else语句来统计医院看病的男生女生人数
{
man++;//符合要求自加操作
}
else
{
woman++;//符合要求自加操作
}
}
printf(" 请输入年龄界限(X)😊;
scanf("%d",&X);
for(n=0;n<sum;n++)
{
if(hos[n].age>=X)//for循环语句嵌套if-else语句来统计医院看病的年龄大于等于X和小于X的人数
{
up++;//符合要求自加操作
}
else
{
down++;//符合要求自加操作
}
}
printf("\n");
printf("\n");
printf(" 今日共有%d位病人来就诊\n",sum);
printf(" 其中男性%d位,女性%d位\n",man,woman);
printf(" %d岁以上包含(%d)以上的病人有%d位\n",X,X,up);
printf(" %d岁以下的病人有%d位\n",X,down);

}

void Create_File()
{
FILE *fp;//创建文件指针
if ((fp = fopen(“users.txt”,“rb”))==NULL) //判断文件是否存在
{
if ((fp = fopen(“users.txt”,“wb+”))==NULL)
{
printf(“无法建立文件!\n”);
exit(0);
}
}
}

void registers() //注册
{
/* int i;*/
users a,b; //结构体 The_users 重命名定义
FILE *fp;
char temp[20];//定义输入密码的最大长度
printf(" 欢迎来到注册界面!\n");
Sleep(1000);
fp = fopen(“users.txt”,“r”);// 打开文件进行“只读”操作,即只能从文件读取内容。
//若欲操作的文件不存在,则打开失败。
//打开文件后,不会清空文件内原有内容。
fread(&b, sizeof(struct The_users), 1, fp); //读入一个结构体字符块并写入
printf(" 请输入账号:");
scanf("%s",&a.id);

     while (1)
     {    
         if (strcmp(a.id, b.id))      //如果不相等//
         {
             if (!feof(fp))           //如果未到文件尾//                               
                 
                 
             {
                 fread(&b, sizeof(struct The_users), 1, fp);
             }
             else
                 break;
         }
         else

         {   
             printf("            此用户名已存在!!!请重新注册!!!\n"); 
             Sleep(1000);
             fclose(fp);//关闭文件
             return;      
         }
     }
     printf("            请输入姓名:");
     scanf("%s",&a.name);
     printf("            请输入性别(f(女)/m(男)):");
     scanf(" %c",&a.sex);
     do{
     	if(a.sex != 'f' && a.sex != 'm'){
		 	printf("性别输入错误!!!请重新输入:");
	        scanf("%c",&a.sex);
		 }
	 }while(a.sex != 'f' && a.sex != 'm');
	 getchar();//清空回车符
     printf("            请输入电话号码:");
     scanf("%ld",&a.phone);
     printf("            请输入密码:");
     scanf(" %s",&a.pwd);
     printf("            请再次输入密码:");
     scanf(" %s",&temp);
	 do{
     	if(!strcmp(a.pwd,temp)){
     		fp = fopen("users.txt","a");//打开文件进行“追加”操作,即只能向文件写入内容。
	         fwrite(&a, sizeof(struct The_users), 1, fp);
	         printf("            账号注册成功!!!请登录!!!\n"); 
	         Sleep(500);
	         fclose(fp);
			 return;
		 }else{
		 	printf("            输入的两次密码不一致!!!请重新输入:");
	        scanf("%s",&a.pwd);
	         printf("            请确认密码:");
	         scanf("%s",&temp);
		 }
	 }while(1);
 }

void color(short x)
{
if(x>=0&&x<=15)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x); //只有一个参数,改变字体颜色
else//默认的颜色白色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
void yansehanshu()
{
color(4);printf(" * * * *\n");
color(4);printf(" * * *\n");
color(4);printf(" * * *\n");
color(4);printf(" * *********** *\n");
color(4);printf(" * * *\n");
color(4);printf(" * * *\n");
color(4);printf(" * * *\n");
color(4);printf(" * * *\n");
color(4);printf(" *\n");
puts(" “);
color(2);printf(” =====================================\n");
color(3);printf(" 星级服务 平价收费 为您的健康保驾护航\n");
color(2);printf(" =====================================\n");
color(7);printf("\n");
color(7);printf("\n");
getchar();
}
void Input_login() //登录
{
users a,b; //定义结构体The_users别名
FILE *fp;
int c; //定义看病候诊管理系统选择变量
int i=0;//记录密码错误次数
printf(" 欢迎来到登录界面!!!\n");
Sleep(1000);
fp = fopen(“users.txt”,“r”);
fread(&b, sizeof(struct The_users), 1, fp); //读入一个结构体字符块并写入
printf(" 请输入账号:");
scanf("%s",&a.id);
while (1)
{
if (strcmp(a.id, b.id)==0) //判断用户名是否存在
{
break;
}
else
{
if (!feof(fp)) //如果文件没有读完

               {
                   fread(&b, sizeof(struct The_users), 1, fp);
               }
               
               else
               {
                   printf("            此用户名不存在,请重新输入:");
				   Sleep(500); 
                   fclose(fp);  
				   return;              
               }
           }
   }
       printf("            请输入密码:");
   	  scanf("%s",&a.pwd); 

    do{   
       if (strcmp(a.pwd, b.pwd)==0)            //如果密码一致
           {  
          fclose(fp);
		  system("cls");
          printf("                   登录成功,欢迎使用医院候诊管理系统!!!\n");
		  printf("\n");
		  printf("\n");
          Sleep(500);
	   }
       else  
       {    printf("                 密码错误!!!请重新输入密码:");
       		scanf("%s",&a.pwd); 
			i++;
          }
	   if(i>=2)
	   {
            exit(0);
	   }
	   }
	while(strcmp(a.pwd, b.pwd)!=0);

	do{
		color(50);
	    yansehanshu();//调用颜色函数
		introduce();//调用主界面函数
		scanf("%d",&c);
		switch(c)
		{
		case 1:
			{
			   LinkQueue *q1;//优先级低的病人队列
               LinkQueue *q2;//优先级中的病人队列
               LinkQueue *q3;//优先级高的病人队列
               int menu;//存储用户选择的菜单编号
               int priority;//病人看病的优先级别
               DataType id;//按照病人到达医院的先后领取的号码牌
               DataType e;//病人看病的优先级别
               q1=LQueueCreateEmpty();//创建优先级低的空队列q1
               q2=LQueueCreateEmpty();//创建优先级中的空队列q2
               q3=LQueueCreateEmpty();//创建优先级高的空队列q3
               id=1;
			   
			   do{
			   printf("\t\t****   欢迎进入病人分级系统         ****\t\t\n");
			   printf("\t\t****   1:新病人加入候诊             ****\t\t\n");
			   printf("\t\t****   2:医生为病人诊治             ****\t\t\n");
			   printf("\t\t****   3:分诊室                     ****\t\t\n");
			   printf("\t\t****   4:查看诊室信息               ****\t\t\n");
			   printf("\t\t****   5:查询剩余病人               ****\t\t\n");
			   printf("\t\t****   6:统计病人就诊信息           ****\t\t\n");
			   printf("\t\t****   7:退出                       ****\t\t\n");
			   printf("\t\t请输入你的选择(1-7):");
			   scanf("%d",&menu);
			   printf("\n");
			   printf("\n");
			   switch(menu)
			   {
			   case 1:
				   int read;
				   do{
					   printf("            请输入病人姓名:");
                       scanf("%s",&hos[count].name);
                       printf("            请输入病人年龄:");
                       scanf("%d",&hos[count].age);
                       printf("            请输入病人性别(man or woman):");
                       scanf("%s",&hos[count].sex);
					   printf("            请输入病人的优先级别:(1或2或3):");
					   scanf("%d",&hos[count].priority);
					   if(1==hos[count].priority||2==hos[count].priority||3==hos[count].priority)
						   //if-else语句判断输入的病人优先级是否是1,2,3
					   {
						   printf("            该病人的id为:%d\n",id);
						   MyEnQueue(q1,q2,q3,id++,hos);
					   }
					   else
					   {
						   printf("            请输入病人的优先级别:(1或2或3):");
					   }
					   count++;//每执行一次新病人加入候诊操作,count(表示医院看病的总人数)就自加一次
					   sum=count;
					   printf("            是否还有新病人加入候诊(是:1 否:0):");
					   scanf("%d",&read);
					   printf("\n");
				   }while(read);
				   printf("\n");
				   printf("\n");
			   break;
			   case 2:
				   {
					  int i;
					  e=MyDeQueue(q1,q2,q3);
					  if(m!=l)
					  {
						  printf("            请分配诊室后再由医生诊治!\n");
					  }
					  else
					  {
						  if(-1!=e)
						  {
							  printf("            被医生诊治病人信息如下:\n");
							  printf("            姓名:%s\n            年龄:%d\n",hos[m].name,hos[m].age);
							  m++;
							  printf("            当前病人id为:%d\n",e);
						  }
						  else
						  {
							  printf("            无病人,队列为空\n");
							  break;
						  }
					  }
					  count--;//每被医生诊治一人,医院就还剩下count--人
					  printf("\n");
					  printf("\n");
					  break;
				   }						 
               case 3:
				   {
					  int k;
					  k=m-1;
					  if(m==0)
					  {
						  printf("            还未开始诊治!\n");
					  }
					  if(m>l)
					  {
						  l++;
						  if(hos[k].age>35)
						  {
							  hos[k].room=1;
							  s1++;
							  printf("            诊治中第%d名患者\n            姓名:%s\n            年龄:%d\n            在第%d诊室\n",m,hos[k].name,hos[k].age,hos[k].room);
						  }
						  else
						  {
							  if(strcmp(hos[k].sex,"man")==0)
							  {
								  hos[k].room=2;
								  s2++;
								  printf("            诊治队列中第%d名患者\n            姓名:%s\n            年龄:%d\n            在第%d诊室\n",m,hos[k].name,hos[k].age,hos[k].room);
							  }
							  else
							  {
								  hos[k].room=3;
								  s3++;
								  printf("            诊治队列中第%d名患者\n            姓名:%s\n            年龄:%d\n            在第%d诊室\n",m,hos[k].name,hos[k].age,hos[k].room);
							  }
						  }
					  }
					  else
					  {
						  printf("            患者已分配完毕!\n");
					  }
					  printf("\n");
					  printf("\n");
					  break;
				   }
               case 4:
				   {
					    int i,j=1;
                        printf("            第一诊室共%d人.\n",s1);
                        printf("            第二诊室共%d人.\n",s2);
                        printf("            第三诊室共%d人.\n",s3);
                        if(s1>0)
                       { 
                             j=1;
                             printf("            第一诊室患者如下:\n");
                         for(i=0;i<m;i++)
                         {
	                          if(hos[i].room==1)
	                      {
	                           printf("             %d.姓名:%s\n            年龄:%d\n            性别:%s\n",j,hos[i].name,hos[i].age,hos[i].sex);
							   printf("\n");
	                           j++;
	                               }
                               }
						       printf("\n");
                       }
                              if(s2>0)
                                {    
									 j=1;
                                     printf("            第二诊室患者如下:\n");
                                 for(i=0;i<m;i++)
                                          {
	                             if(hos[i].room==2)
	                                   {
	                               printf("             %d.姓名:%s\n            年龄:%d\n            性别:%s\n",j,hos[i].name,hos[i].age,hos[i].sex);
								   printf("\n");
	                                  j++;
	                        }
                         }
								 printf("\n");
                     }
                         if(s3>0)
						 {
						 j=1;
						 printf("            第三诊室患者如下:\n");
						 for(i=0;i<m;i++)
						 {
							 if(hos[i].room==3)
							 {
								 printf("             %d.姓名:%s\n            年龄:%d\n            性别:%s\n",j,hos[i].name,hos[i].age,hos[i].sex);
								 j++;
								 printf("\n");
							 }
						   }
						 printf("\n");
						 }
						 printf("\n");
						 printf("\n");
						 break;
				   }
               case 5:
			   {
				   printf("            当前还剩%d人未就诊\n",count);
				   break;
			   }
			   case 6:
				   tongji(hos);
				   printf("\n");
				   break;
               case 7:
			       break;
			  default:   
					   printf("            输入错误,请按菜单编号输入\n");
			      }
			   }while(menu!=7);
			    break;
			  }
        case 2:
			break;
		default:
			puts("            请重新输入代号");
		}
	}while(c!=2);

}

int main(void)
{
int xuanze;
FILE *fp;
users a,b;
int n=0;
do{
printf("\t\t * 欢迎登录医院管理系统 *\n");
printf("\t\t * 1登录 *\n");
printf("\t\t * 2注册 *\n");
printf("\t\t * 0退出该界面 *\n");
puts("\t\t ************************\n");
printf(" 请输入编号(0-2)😊;
scanf("%d",&xuanze);//输入你要执行操作的编号
switch(xuanze)//根据switch开关执行你输入编号的操作
{
case 1:
Input_login();//调用登录函数
break;
case 2:
registers();//调用注册函数
break;
case 0:
break;
default://表示输入的编号错误
puts(" 请重新输入代号");
}
}while(xuanze!=0);//do-while循环语句,当你输入为0时退出循环
system(“pause”);
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值