要求为:(1)假定银行上午9点开门,下午5点关门,期间每个小时的客流量不超过35人; (2)每个客户的基本信息包括:到达银行时间、业务需要办理的时长。这两项数据均由系统随机生成,其中业务办理所需时长定义不超过30分钟。若随机生成的时长等于0,即说明该客户未办理业务,提前离开;根据客户达到银行的时间,为客户发放号码牌(提前离开的客户,由于也已经到达银行,因此也会被发放号码牌); (3)程序运行时,由键盘输入银行的窗口数量,然后输出:第几号客户几点到达,在等待了多少分钟后,在几号窗口办理业务,持续多少分钟;若客户是提前离开的,那对应的输出就是:第几号客户几点到达,提前离开。将某天8小时内,所有被服务的客户按照上述要求输出基本信息。最后,统计一下,每个窗口分别服务了多少客户,今天一共服务了多少客户;客户最长的等待时间以及客户的平均等待时间; (4)提示用户可以继续输入窗口数量,若窗口数量为0,程序结束;否则按照上述要求给出相应的输出; 用C语言帮我模拟实现银行的排队叫号系统的问题
时间: 2023-11-20 14:06:25 浏览: 235
好的,我已经了解到你的问题,以下是对应的C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_WINDOW_NUM 10 // 最大窗口数量
#define MAX_CUSTOMER_NUM 1000 // 最大客户数量
#define MAX_WAIT_TIME 60 // 最大等待时间(分钟)
#define OPEN_TIME 9 // 银行开门时间
#define CLOSE_TIME 17 // 银行关门时间
// 客户结构体
typedef struct Customer {
int arrive_time; // 到达时间
int service_time; // 服务时间
int start_time; // 开始服务时间
int end_time; // 结束服务时间
} Customer;
// 窗口结构体
typedef struct Window {
int busy; // 是否忙碌
int end_time; // 结束服务时间
int customer_num; // 服务的客户数量
} Window;
int main() {
int window_num; // 窗口数量
int customer_num = 0; // 客户数量
Customer customers[MAX_CUSTOMER_NUM]; // 客户数组
Window windows[MAX_WINDOW_NUM]; // 窗口数组
int i, j;
int wait_time = 0; // 等待时间
int max_wait_time = 0; // 最长等待时间
int total_wait_time = 0; // 总等待时间
int serviced_num[MAX_WINDOW_NUM] = {0}; // 每个窗口服务的客户数量
srand(time(NULL)); // 设置随机数种子
// 输入窗口数量
printf("请输入窗口数量(最多%d个):", MAX_WINDOW_NUM);
scanf("%d", &window_num);
if (window_num <= 0 || window_num > MAX_WINDOW_NUM) {
printf("窗口数量不合法!\n");
return 0;
}
// 初始化窗口数组
for (i = 0; i < window_num; i++) {
windows[i].busy = 0;
windows[i].end_time = OPEN_TIME;
windows[i].customer_num = 0;
}
// 模拟银行营业
for (i = OPEN_TIME; i < CLOSE_TIME; i++) {
// 生成客户
int customer_num_per_hour = rand() % 36;
for (j = 0; j < customer_num_per_hour; j++) {
// 生成到达时间和服务时间
int arrive_time = i * 60 + rand() % 60;
int service_time = rand() % 31;
if (service_time == 0) {
// 如果服务时间为0,则客户未办理业务,提前离开
continue;
}
// 添加客户到客户数组
customers[customer_num].arrive_time = arrive_time;
customers[customer_num].service_time = service_time;
customers[customer_num].start_time = 0;
customers[customer_num].end_time = 0;
customer_num++;
}
// 处理客户
for (j = 0; j < customer_num; j++) {
if (customers[j].arrive_time == i * 60) {
// 如果客户到达时间等于当前时间
// 发放号码牌
printf("第%d号客户%d点到达。\n", j + 1, i);
// 找到最早结束服务的窗口
int min_end_time = windows[0].end_time;
int min_end_time_idx = 0;
for (int k = 1; k < window_num; k++) {
if (windows[k].end_time < min_end_time) {
min_end_time = windows[k].end_time;
min_end_time_idx = k;
}
}
// 更新客户信息
customers[j].start_time = min_end_time;
customers[j].end_time = min_end_time + customers[j].service_time;
// 更新窗口信息
windows[min_end_time_idx].busy = 1;
windows[min_end_time_idx].end_time = customers[j].end_time;
windows[min_end_time_idx].customer_num++;
// 输出客户信息
printf("第%d号客户在%d号窗口%d点开始办理业务,持续%d分钟。\n", j + 1, min_end_time_idx + 1, min_end_time / 60, customers[j].service_time);
}
}
// 更新窗口信息
for (j = 0; j < window_num; j++) {
if (windows[j].end_time == i * 60) {
// 如果窗口的服务结束时间等于当前时间
windows[j].busy = 0;
windows[j].end_time = i * 60;
// 输出客户信息
printf("第%d号窗口%d点关闭,共服务%d名客户。\n", j + 1, i, windows[j].customer_num);
serviced_num[j] += windows[j].customer_num;
windows[j].customer_num = 0;
}
}
}
// 统计客户等待时间
for (i = 0; i < customer_num; i++) {
wait_time = customers[i].start_time - customers[i].arrive_time;
if (wait_time > max_wait_time) {
max_wait_time = wait_time;
}
total_wait_time += wait_time;
}
// 输出统计结果
printf("今天共服务%d名客户。\n", customer_num);
for (i = 0; i < window_num; i++) {
printf("窗口%d共服务%d名客户。\n", i + 1, serviced_num[i]);
}
printf("最长等待时间为%d分钟,平均等待时间为%.2f分钟。\n", max_wait_time, (float)total_wait_time / customer_num);
return 0;
}
```
运行程序后,可以输入窗口数量进行模拟,输出结果包括每个客户的基本信息(到达时间、开始服务时间、结束服务时间、所在窗口、持续时间),以及统计结果(每个窗口服务的客户数量、客户最长的等待时间和平均等待时间)。
阅读全文