期末实验报告:医院排队模拟系统

 问题描述:设计一个医院排队系统,模拟医院的日常对外营业服务,包括顾客到达挂号(区分专家号(专家加号)、普通号、急诊号)、等待、查询、看诊、就医完毕、下班(急诊无下班)等事件。

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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值