客户业务分为两种。第一种是申请从银行得到一笔资金,即取款或借款。
第二种是向银行投入一笔资金,即存款或还款。银行有两个服务窗口,相应地
有两个队列。客户到达银行后先排第一个队。处理每个客户业务时,如果属于
第一种,且申请额超出银行现存资金总额而得不到满足,则立刻排入第二个队
等候,直至满足时才离开银行;否则业务处理完后立刻离开银行。每接待完一
个第二种业务的客户,则顺序检查和处理(如果可能)第二个队列中的客户,
对能满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。注意,
在此检查过程中,一旦银行资金总额少于或等于刚才第一个队列中最后一个客
户(第二种业务)被接待之前的数额,或者本次已将第二个队列检查或处理了
一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个队
列的客户。任何时刻都只开一个窗口。假设检查不需要时间。营业时间结束时
所有客户立即离开银行。写一个上述银行业务的事件驱动模拟系统,通过模拟
方法求出客户在银行内逗留的平均时间。利用动态存储结构实现模拟。
http://blog.sina.com.cn/s/blog_a1f9a1f50101i2lm.html
你好,你有这个源代码吗?孩子写不出来
😫😫😫
一模一样的题
#include <iostream>
#include <queue>
#include <cstdlib>
#include <ctime>
using namespace std;
// 客户类型
enum CustomerType {
DEPOSIT, // 存款
WITHDRAW // 取款
};
// 客户结构体
struct Customer {
int id; // 客户编号
CustomerType type; // 客户类型
int amount; // 申请金额
int arrivalTime; // 到达时间
int startTime; // 开始处理时间
int endTime; // 结束处理时间
};
// 银行结构体
struct Bank {
int totalAmount; // 银行现存资金总额
int maxQueueLength; // 最大队列长度
int depositQueueLength; // 存款队列长度
int withdrawQueueLength; // 取款队列长度
queue<Customer> depositQueue; // 存款队列
queue<Customer> withdrawQueue; // 取款队列
};
// 生成客户
Customer generateCustomer(int id, int currentTime) {
Customer customer;
customer.id = id;
customer.arrivalTime = currentTime;
customer.type = (rand() % 2 == 0) ? DEPOSIT : WITHDRAW;
customer.amount = rand() % 1000 + 1; // 申请金额在1~1000之间
return customer;
}
// 处理客户
void processCustomer(Bank& bank, Customer& customer, int currentTime) {
if (customer.type == DEPOSIT) {
if (customer.amount <= bank.totalAmount) {
bank.totalAmount -= customer.amount;
customer.startTime = currentTime;
customer.endTime = currentTime;
} else {
bank.withdrawQueue.push(customer);
bank.withdrawQueueLength++;
customer.startTime = -1;
customer.endTime = -1;
}
} else {
if (customer.amount <= bank.totalAmount) {
bank.totalAmount += customer.amount;
customer.startTime = currentTime;
customer.endTime = currentTime;
} else {
bank.depositQueue.push(customer);
bank.depositQueueLength++;
customer.startTime = -1;
customer.endTime = -1;
}
}
}
// 模拟银行业务
void simulateBank(Bank& bank, int simulationTime) {
int currentTime = 0; // 当前时间
int customerCount = 0; // 客户计数器
int totalWaitingTime = 0; // 总等待时间
// 模拟银行业务
while (currentTime < simulationTime) {
// 生成客户
Customer customer = generateCustomer(customerCount++, currentTime);
// 处理第一个队列的客户
if (!bank.depositQueue.empty() && bank.totalAmount >= bank.depositQueue.front().amount) {
Customer depositCustomer = bank.depositQueue.front();
bank.depositQueue.pop();
bank.depositQueueLength--;
processCustomer(bank, depositCustomer, currentTime);
totalWaitingTime += (currentTime - depositCustomer.arrivalTime);
} else if (!bank.withdrawQueue.empty()) {
Customer withdrawCustomer = bank.withdrawQueue.front();
bank.withdrawQueue.pop();
bank.withdrawQueueLength--;
processCustomer(bank, withdrawCustomer, currentTime);
totalWaitingTime += (currentTime - withdrawCustomer.arrivalTime);
}
// 处理当前客户
if (customer.type == DEPOSIT) {
if (bank.totalAmount >= customer.amount) {
processCustomer(bank, customer, currentTime);
} else {
bank.depositQueue.push(customer);
bank.depositQueueLength++;
}
} else {
processCustomer(bank, customer, currentTime);
}
// 更新最大队列长度
bank.maxQueueLength = max(bank.maxQueueLength, bank.depositQueueLength + bank.withdrawQueueLength);
// 更新时间
currentTime++;
}
// 输出结果
cout << "Total waiting time: " << totalWaitingTime << endl;
cout << "Average waiting time: " << (double)totalWaitingTime / customerCount << endl;
cout << "Max queue length: " << bank.maxQueueLength << endl;
}
int main() {
srand(time(NULL)); // 初始化随机数生成器
Bank bank;
bank.totalAmount = 10000; // 银行现存资金总额
bank.maxQueueLength = 0; // 最大队列长度
bank.depositQueueLength = 0; // 存款队列长度
bank.withdrawQueueLength = 0; // 取款队列长度
simulateBank(bank, 1000); // 模拟1000个时间单位
return 0;
}