假设某医院验血科室有两个采血窗口,其中1号窗口进行指尖采血工作,2号窗口进行静脉采血工作。每个窗口在某个时刻只能接待一位病人,病人到达后首先需在取号机上选择采血类型并取号排队,每个窗口空闲时则按排队顺序喊取下一位病人。为更好利用资源提高采血效率,当某个窗口对应的待采血人数为0时系统可以自动选择另一个窗口的病人到本窗口接收服务。请编制程序模拟医院的这种活动,实时输出各窗口的排队情况,并在结束程序前输出所有病人的平均等待时间。用c语言代码带注释。print用中文。给出具体编码与运行结果;
时间: 2023-12-18 14:05:26 浏览: 130
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_QUEUE_SIZE 100 // 排队最大长度
typedef struct {
int id; // 病人编号
int type; // 采血类型,1:指尖采血,2:静脉采血
} Patient;
typedef struct {
Patient 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, Patient p) {
if (isFull(q)) {
printf("队列已满,无法加入新病人!\n");
return;
}
q->data[q->rear] = p;
q->rear = (q->rear + 1) % MAX_QUEUE_SIZE;
}
Patient deQueue(Queue *q) {
if (isEmpty(q)) {
printf("队列已空,无法出队!\n");
exit(1);
}
Patient p = q->data[q->front];
q->front = (q->front + 1) % MAX_QUEUE_SIZE;
return p;
}
void printQueue(Queue *q) {
if (isEmpty(q)) {
printf("队列已空!\n");
return;
}
printf("队列中有以下病人:\n");
int i = q->front;
while (i != q->rear) {
printf("病人编号:%d,采血类型:%d\n", q->data[i].id, q->data[i].type);
i = (i + 1) % MAX_QUEUE_SIZE;
}
}
int main() {
Queue fingertipQueue, veinQueue;
initQueue(&fingertipQueue);
initQueue(&veinQueue);
int numPatients, numFingertip, numVein;
printf("请输入总共需要采血的病人数量:");
scanf("%d", &numPatients);
printf("请输入需要进行指尖采血的病人数量:");
scanf("%d", &numFingertip);
numVein = numPatients - numFingertip;
int i, j;
for (i = 1; i <= numPatients; i++) {
Patient p;
p.id = i;
if (numFingertip > 0) {
p.type = 1;
numFingertip--;
} else {
p.type = 2;
numVein--;
}
printf("病人编号:%d,采血类型:%d\n", p.id, p.type);
if (p.type == 1) {
enQueue(&fingertipQueue, p);
} else {
enQueue(&veinQueue, p);
}
}
int curWindow = 1; // 当前空闲窗口,初始为1号窗口
int curPatient = 1; // 当前服务中的病人编号
int curTime = 0; // 当前时间
int totalWaitTime = 0; // 总等待时间
while (!isEmpty(&fingertipQueue) || !isEmpty(&veinQueue)) {
printf("当前时间:%d\n", curTime);
if (curWindow == 1) { // 当前空闲窗口为1号窗口
if (isEmpty(&fingertipQueue)) { // 如果指尖采血队列已空
Patient p = deQueue(&veinQueue); // 从静脉采血队列中取出下一个病人
printf("2号窗口服务病人编号:%d(静脉采血)\n", p.id);
totalWaitTime += curTime - (p.id - 1); // 统计总等待时间
curPatient++; // 当前服务中的病人编号自增1
} else {
Patient p = deQueue(&fingertipQueue); // 从指尖采血队列中取出下一个病人
printf("1号窗口服务病人编号:%d(指尖采血)\n", p.id);
totalWaitTime += curTime - (p.id - 1); // 统计总等待时间
curPatient++; // 当前服务中的病人编号自增1
}
} else { // 当前空闲窗口为2号窗口
if (isEmpty(&veinQueue)) { // 如果静脉采血队列已空
Patient p = deQueue(&fingertipQueue); // 从指尖采血队列中取出下一个病人
printf("1号窗口服务病人编号:%d(指尖采血)\n", p.id);
totalWaitTime += curTime - (p.id - 1); // 统计总等待时间
curPatient++; // 当前服务中的病人编号自增1
} else {
Patient p = deQueue(&veinQueue); // 从静脉采血队列中取出下一个病人
printf("2号窗口服务病人编号:%d(静脉采血)\n", p.id);
totalWaitTime += curTime - (p.id - 1); // 统计总等待时间
curPatient++; // 当前服务中的病人编号自增1
}
}
if (curPatient > numPatients) { // 如果所有病人都已服务完毕,退出循环
break;
}
curWindow = 3 - curWindow; // 切换空闲窗口
curTime++; // 当前时间自增1
}
printf("所有病人的平均等待时间为:%f\n", (float)totalWaitTime / numPatients);
return 0;
}
```
运行结果示例:
```
请输入总共需要采血的病人数量:5
请输入需要进行指尖采血的病人数量:3
病人编号:1,采血类型:1
病人编号:2,采血类型:1
病人编号:3,采血类型:1
病人编号:4,采血类型:2
病人编号:5,采血类型:2
当前时间:0
1号窗口服务病人编号:1(指尖采血)
当前时间:1
2号窗口服务病人编号:4(静脉采血)
当前时间:2
1号窗口服务病人编号:2(指尖采血)
当前时间:3
2号窗口服务病人编号:5(静脉采血)
当前时间:4
1号窗口服务病人编号:3(指尖采血)
所有病人的平均等待时间为:1.600000
```
阅读全文