假设某银行有4个窗口对外接待客户,从早晨银行开门(开门9:00am,关门5:00pm)起不断有客户进入银行。由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需要在每个窗口前顺次排队,对于刚进入银行的客户(建议:客户进入时间使用随机函数产生),如果某个窗口的业务员正空闲,则可上前办理业务;反之,若4个窗口均有窗户所占,他便会排在人数最少的队伍后面。 任务要求: 1)编制一个程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间。 2)建议有如下设置: a)客户到达时间随机产生,一天客户的人数设定为100人。b)银行业务员处理时间随机产生,平均处理时间10分钟。3)将一天的数据(包括业务员和客户)以文件方式输出。用c++ ,要有注释
时间: 2023-06-25 21:02:18 浏览: 56
首先,我们需要定义客户和窗口的类。客户类包含客户到达时间和离开时间,窗口类包含当前服务的客户以及窗口的状态(是否空闲)。
```c++
#include <iostream>
#include <queue>
#include <fstream>
#include <ctime>
#include <cstdlib>
using namespace std;
class Customer {
public:
int arrive_time; // 到达时间
int leave_time; // 离开时间
};
class Window {
public:
Customer customer; // 当前服务的客户
bool is_idle; // 是否空闲
};
```
接下来,我们需要定义模拟银行的主函数。在主函数中,我们首先需要初始化窗口、客户队列和随机数种子。然后,我们进入一个循环,直到一天的工作结束。在每一轮循环中,我们生成一个新的客户,并将其加入客户队列。然后,我们遍历所有的窗口,如果该窗口空闲,则将队列头的客户分配给该窗口。如果所有窗口都在忙碌,我们需要找到最短队列,将新客户加入该队列。同时,我们需要记录客户的离开时间和逗留时间,以便后续统计平均逗留时间。
```c++
int main() {
const int WINDOW_NUM = 4; // 窗口数量
const int CUSTOMER_NUM = 100; // 客户数量
const int WORK_HOUR = 8; // 工作时间(小时)
const int MINUTE_PER_HOUR = 60; // 每小时的分钟数
const int SERVICE_TIME = 10; // 平均服务时间(分钟)
srand(time(NULL)); // 初始化随机数种子
Window windows[WINDOW_NUM];
queue<Customer> customers;
for (int i = 0; i < WINDOW_NUM; i++) {
windows[i].is_idle = true;
}
for (int i = 0; i < CUSTOMER_NUM; i++) {
Customer customer;
customer.arrive_time = rand() % (WORK_HOUR * MINUTE_PER_HOUR);
customers.push(customer);
}
ofstream outfile("bank.txt"); // 打开输出文件
int total_wait_time = 0;
int total_customer_num = 0;
for (int t = 0; t < WORK_HOUR * MINUTE_PER_HOUR; t++) {
if (!customers.empty()) {
Customer customer = customers.front();
if (windows[0].is_idle) {
windows[0].customer = customer;
windows[0].is_idle = false;
customer.leave_time = t + rand() % (2 * SERVICE_TIME) - SERVICE_TIME;
customers.pop();
} else if (windows[1].is_idle) {
windows[1].customer = customer;
windows[1].is_idle = false;
customer.leave_time = t + rand() % (2 * SERVICE_TIME) - SERVICE_TIME;
customers.pop();
} else if (windows[2].is_idle) {
windows[2].customer = customer;
windows[2].is_idle = false;
customer.leave_time = t + rand() % (2 * SERVICE_TIME) - SERVICE_TIME;
customers.pop();
} else if (windows[3].is_idle) {
windows[3].customer = customer;
windows[3].is_idle = false;
customer.leave_time = t + rand() % (2 * SERVICE_TIME) - SERVICE_TIME;
customers.pop();
} else {
int shortest_queue = 0;
for (int i = 1; i < WINDOW_NUM; i++) {
if (customers.size() < customers.size()) {
shortest_queue = i;
}
}
windows[shortest_queue].customer = customer;
windows[shortest_queue].is_idle = false;
customer.leave_time = t + rand() % (2 * SERVICE_TIME) - SERVICE_TIME;
customers.pop();
}
outfile << "Customer " << total_customer_num << " arrives at " << customer.arrive_time << " and leaves at " << customer.leave_time << endl;
total_wait_time += customer.leave_time - customer.arrive_time;
total_customer_num++;
}
for (int i = 0; i < WINDOW_NUM; i++) {
if (!windows[i].is_idle && windows[i].customer.leave_time == t) {
windows[i].is_idle = true;
}
}
}
outfile.close(); // 关闭输出文件
double avg_wait_time = (double)total_wait_time / total_customer_num;
cout << "Average waiting time: " << avg_wait_time << endl;
return 0;
}
```
最后,我们可以运行程序并查看输出文件和平均逗留时间。