问题描述:设计一个医院排队系统,模拟医院的日常对外营业服务,包括顾客到达挂号(区分专家号(专家加号)、普通号、急诊号)、等待、查询、看诊、就医完毕、下班(急诊无下班)等事件。
#include<stdio.h>
#include<stdlib.h>
#define MAX_QUEUE_SIZE 5
// 定义顾客结构体
typedef struct {
int number;//顾客号码
int type;//挂号类型:1-专家号(专家加号)、2 - 普通号、3 - 急诊号
} Customer;
// 定义队列结构体
typedef struct {
Customer data[MAX_QUEUE_SIZE];
int front, rear;
} Queue;
// 初始化队列
void initQueue(Queue *q) {
q->front = q->rear = 0;
}
// 判断队列是否为空
int isEmpty(Queue *q) {
return q->front == q->rear;
}
// 判断队列是否已满
int isFull(Queue *q) {
return (q->rear + 1) % MAX_QUEUE_SIZE == q->front;
}
//挂号
void enqueue(Queue *q, Customer cust){
if(!isFull(q)){
q->rear=(q->rear + 1) % MAX_QUEUE_SIZE;
q->data[q->rear]=cust;
printf("顾客 %d 已成功挂号,挂的号为(%d)号。\n\n",cust.number,q->rear);
}
else{
printf("队列已满,无法挂号\n");
}
}
// 出队操作
Customer dequeue(Queue *q)
{
if (!isEmpty(q))
{
q->front = (q->front + 1) % MAX_QUEUE_SIZE;
return q->data[q->front];
}
else
{
printf("队列为空,无法看诊\n");
Customer empty_cust={-1,-1};
return empty_cust;
}
}
// 查询队列中的顾客数量
int queueSize(Queue *q)
{
return(q->rear-q->front+MAX_QUEUE_SIZE)%MAX_QUEUE_SIZE;
}
// 统计不同类型顾客的数量
void countCustomers(Queue *q,int *specialist,int *normal,int *emergency)
{
*specialist=*normal=*emergency=0;
int i=q->front;
while(i != q->rear)
{
i=(i + 1)%MAX_QUEUE_SIZE;
switch(q->data[i].type)
{
case 1:
(*specialist)++;
break;
case 2:
(*normal)++;
break;
case 3:
(*emergency)++;
break;
default:
break;
}
}
}
// 菜单函数
void menu()
{
printf("**************************\n");
printf("*欢迎使用医院排队系统菜单*\n");
printf("**************************\n");
printf(" 请选择如下操作,输入序号 \n");
printf(" 1. 挂号\n");
printf(" 2. 查询当前队列长度\n");
printf(" 3. 查询同类型顾客数量\n");
printf(" 4. 看诊(顾客出队)\n");
printf(" 5. 下班\n");
printf(" 6. 退出\n");
printf("*************************\n");
printf("您想进行什么操作,请选择\n");
printf("*************************\n");
}
// 等待函数,模拟顾客等待过程
void waitProcess()
{
printf("顾客正在等待中...\n");
_sleep(2); // 模拟等待过程,暂定2秒
printf("顾客等待完毕,开始就医。\n");
}
int main()
{
Queue hospitalQueue;
initQueue(&hospitalQueue);
int choice;
int customerNumber=0; // 顾客号码计数器
int isHospitalOpen=1; // 医院开放标志,1表示开放,0表示关闭
do {
menu();
printf("\n请输入选项:");
scanf("%d", &choice);
switch(choice)
{
case 1:
{
if (isHospitalOpen)
{
customerNumber++;
Customer newCustomer;
newCustomer.number = customerNumber;
printf("\n请选择挂号类型:\n");
printf("1. 专家号\n");
printf("2. 普通号\n");
printf("3. 急诊号\n");
printf("输入挂号类型编号:");
scanf("%d", &newCustomer.type);
enqueue(&hospitalQueue,newCustomer);
}
else
{
printf("\n医院已经下班,暂停挂号。\n");
}
break;
}
case 2:
{
printf("\n当前队列长度为:%d\n", queueSize(&hospitalQueue));
break;
}
case 3:
{
int specialist,normal,emergency;
countCustomers(&hospitalQueue,&specialist,&normal,&emergency);
printf("\n专家号数量:%d\n",specialist);
printf("普通号数量:%d\n",normal);
printf("急诊号数量:%d\n",emergency);
break;
}
case 4:
{
if(isHospitalOpen||!isEmpty(&hospitalQueue))
{
Customer currentCustomer=dequeue(&hospitalQueue);
if (currentCustomer.number!=-1)
{
printf("\n顾客 %d 开始看诊...\n",currentCustomer.number);
waitProcess(); // 模拟顾客等待和就医过程
printf("顾客 %d 就医完毕。\n",currentCustomer.number);
}
}
else
{
if(isEmpty(&hospitalQueue))
{
printf("\n医院下班,结束营业。\n");
isHospitalOpen = 0;
} // 设置医院下班状态
}
}
case 5:
{
printf("\n医院已经下班,暂停看诊");
isHospitalOpen = 0; // 设置医院下班状态
break;
}
case 6:
{
printf("\n退出程序。\n");
break;
}
default:
{
printf("\n请输入有效的选项号码。\n");
}
}
}while(choice!=6);
return 0;
}