问题描述 假设某银行有4个窗口对外接待客户,从早晨银行开门(开门9:00am,关门5:00pm)起不断有客户进入银行。由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需要在每个窗口前顺次排队,对于刚进入银行的客户(建议:客户进入时间使用随机函数产生),如果某个窗口的业务员正空闲,则可上前办理业务;反之,若4个窗口均有窗户所占,他便会排在人数最少的队伍后面。 任务要求: 1)编制一个程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间。 2)建议有如下设置: a)客户到达时间随机产生,一天客户的人数设定为100人。b)银行业务员处理时间随机产生,平均处理时间10分钟。3)将一天的数据(包括业务员和客户)以文件方式输出。用c++编写
时间: 2023-06-19 22:04:11 浏览: 302
以下是一个简单的C++代码实现,用于模拟银行排队等待和业务处理的过程,并输出客户在银行逗留的平均时间:
```c++
#include <iostream>
#include <fstream>
#include <queue>
#include <cstdlib>
#include <ctime>
using namespace std;
const int MAX_TIME = 480; // 银行开门时间为 9:00am,关闭时间为 5:00pm,即 480 分钟
const int MAX_WINDOW = 4; // 银行有 4 个窗口
// 客户信息
struct Customer {
int id; // 客户 ID
int arrive_time; // 客户到达时间
int start_time; // 客户开始办理业务的时间
int end_time; // 客户结束办理业务的时间
int window_id; // 客户所在窗口的 ID
bool operator < (const Customer& rhs) const {
return arrive_time > rhs.arrive_time; // 优先按照到达时间从小到大排序
}
};
// 窗口信息
struct Window {
int id; // 窗口 ID
int end_time; // 窗口结束办理业务的时间
int customer_id; // 窗口正在为哪个客户办理业务
bool operator < (const Window& rhs) const {
return end_time > rhs.end_time; // 优先按照结束时间从小到大排序
}
};
// 随机生成一个客户到达时间
int rand_arrive_time() {
return rand() % (MAX_TIME + 1);
}
// 随机生成一个业务处理时间
int rand_process_time() {
return rand() % 6 + 5; // 平均处理时间为 10 分钟,加上随机误差
}
int main() {
priority_queue<Customer> q_customer; // 存放客户队列
priority_queue<Window> q_window; // 存放窗口队列
queue<Customer> q_wait[MAX_WINDOW]; // 存放每个窗口前的等待队列
srand(time(NULL)); // 初始化随机数种子
// 生成客户队列
for (int i = 1; i <= 100; i++) {
Customer c;
c.id = i;
c.arrive_time = rand_arrive_time();
c.start_time = -1;
c.end_time = -1;
c.window_id = -1;
q_customer.push(c);
}
// 模拟每分钟的业务处理过程
for (int t = 0; t <= MAX_TIME; t++) {
// 检查是否有客户到达
while (!q_customer.empty() && q_customer.top().arrive_time == t) {
Customer c = q_customer.top();
q_customer.pop();
bool served = false;
// 遍历窗口队列,找到第一个空闲的窗口
while (!q_window.empty()) {
Window w = q_window.top();
q_window.pop();
if (w.end_time <= t) {
// 窗口空闲,直接为客户办理业务
served = true;
w.end_time = t + rand_process_time();
w.customer_id = c.id;
c.start_time = t;
c.end_time = w.end_time;
c.window_id = w.id;
q_window.push(w);
break;
} else {
// 窗口忙碌,将其加入等待队列
q_wait[w.id].push(c);
}
}
if (!served) {
// 所有窗口都忙碌,将客户加入等待队列
int min_size = q_wait[0].size();
int min_id = 0;
for (int i = 1; i < MAX_WINDOW; i++) {
if (q_wait[i].size() < min_size) {
min_size = q_wait[i].size();
min_id = i;
}
}
q_wait[min_id].push(c);
}
}
// 检查窗口是否空闲
while (!q_window.empty() && q_window.top().end_time == t) {
Window w = q_window.top();
q_window.pop();
if (!q_wait[w.id].empty()) {
// 窗口前有等待客户,将其取出办理业务
Customer c = q_wait[w.id].front();
q_wait[w.id].pop();
c.start_time = t;
c.end_time = t + rand_process_time();
c.window_id = w.id;
w.end_time = c.end_time;
w.customer_id = c.id;
q_window.push(w);
}
}
}
// 计算客户在银行逗留的平均时间
int total_time = 0;
while (!q_customer.empty()) {
Customer c = q_customer.top();
q_customer.pop();
total_time += c.end_time - c.arrive_time;
}
double avg_time = (double)total_time / 100;
// 将一天的数据(包括业务员和客户)以文件方式输出
ofstream fout("bank.txt");
fout << "客户 ID\t到达时间\t开始时间\t结束时间\t窗口 ID" << endl;
while (!q_customer.empty()) {
Customer c = q_customer.top();
q_customer.pop();
fout << c.id << "\t\t" << c.arrive_time << "\t\t" << c.start_time << "\t\t" << c.end_time << "\t\t" << c.window_id << endl;
}
fout << "窗口 ID\t结束时间\t客户 ID" << endl;
while (!q_window.empty()) {
Window w = q_window.top();
q_window.pop();
fout << w.id << "\t\t" << w.end_time << "\t\t" << w.customer_id << endl;
}
fout << "客户在银行逗留的平均时间:" << avg_time << endl;
fout.close();
return 0;
}
```
该程序使用了 STL 中的优先队列和队列来模拟客户和窗口的排队等待和业务处理过程,使用了随机函数来生成客户到达时间和业务处理时间,并将一天的数据(包括客户和窗口)以文件方式输出。