📄 asdf.cpp
字号:
#include <queue>
#include <list>
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
//事件类
class event
{
public:
event() { }
event(int a,bool b,int c,int d,int e,event *p=NULL)
:time(a),lable(b),durtime(c),intertime(d),money(e),next(p)
{ }
event(const event& e)
{
time=e.rtime();
lable=e.rlable();
durtime=e.rdurtime();
intertime=e.rintertime();
money=e.rmoney();
next=e.rnext();
}
~event()
{
delete next;
}
event& operator=(const event &e)//重载赋值操作符
{
time=e.rtime();
lable=e.rlable();
durtime=e.rdurtime();
intertime=e.rintertime();
money=e.rmoney();
next=e.rnext();
return *this;
}
void do_lable(bool x)
{
lable=x;
}
void do_time(int x)
{
time=x;
}
int rtime()const
{
return time;
}
bool rlable()const
{
return lable;
}
int rdurtime()const
{
return durtime;
}
int rintertime()const
{
return intertime;
}
int rmoney()const
{
return money;
}
event* rnext() const
{
return next;
}
bool operator==(const event &e)
{
return( (durtime==e.rdurtime())&&(intertime==e.rintertime())&&(money==e.rmoney()));
}
bool operator<=(const event &e)
{
return( (durtime<=e.rdurtime())&&(intertime<=e.rintertime())&&(money<=e.rmoney()));
}
private:
int time; //如果为到达事件则表示到达时间,如果为离开事件则表示离开时间
bool lable; //true表示客户到达事件,false表示客户离开事件
int durtime; //办理事务所需时间
int intertime; //下一客户即将到达的时间间隔
int money; //钱数:正数则为存钱,负数则为取钱
event *next;
};
void bank_simulation();
list<event> event_list;//事件表
list<event> q1,q2;//客户队列
int time1,durtime,intertime,money;
double bank_time=0, close_time=600, bank_money=10000, total_time=0;//银行的工作时间
double number=0;//所有进入银行的客户数量
event temp,data;//上一个产生的结点
list<event>::iterator p = event_list.begin();
int up_durtime,down_durtime,up_intertime,down_intertime,up_money,down_money;
event create_node()
{
time1 = temp.rtime() + temp.rintertime();
durtime=rand()%(up_durtime-down_durtime+1)+down_durtime;
intertime=rand()%(up_intertime-down_intertime+1)+down_intertime;
money=rand()%(up_money-down_money+1)+down_money;
event e(time1,1,durtime,intertime,money);
return e;
}
void customer_arrived()//处理客户到达事件
{
q1.push_back(event_list.front());//将新到达的客户插入到第一个队列里
cout << " 客户到达: 时间: " <<event_list.front().rtime()
<< " 办理所需时间: " <<event_list.front().rdurtime()
<< " 与下一个客户的时间间隔: " <<event_list.front().rintertime()
<< " 钱数"<<event_list.front().rmoney()
<< endl;
temp = create_node();
event_list.push_back(temp);
number += 1;//客户数量加1
int i = 0;//标记是否有客户正在处理
p = event_list.begin();
while (p != event_list.end())
{
if (p -> rlable()) {
p++;
} else {
i=1;
break;
}
}
bank_time = event_list.front().rtime();
if (!q1.empty() && (0 == i))//如果第一个队列不为空而且在时间表中没有找到离开事件说明队头客户是刚进入银行的则处理之
{
data = q1.front();
if (bank_money + data.rmoney() >= 0)//银行余额足够则处理
{
data.do_time(bank_time+data.rdurtime());
data.do_lable(false);
p = event_list.begin();
while (p != event_list.end())
{
if (p->rtime() < data.rtime()) {
p++;
} else {
break;
}
}
event_list.insert(p, data);//生成离开事件并插入事件表
}
else
{
q2.push_back(q1.front());
q1.pop_front();
}
}
}
void customer_departure()//处理客户离开事件
{
if (!q1.empty() && q1.front() == event_list.front())//删除即将离开的客户,并计算其停留时间
{
cout << " 客户离开 时间:" << event_list.front().rtime()
<< " 办理所需时间:" << event_list.front().rdurtime()
<< " 与下一个客户的时间间隔:" << event_list.front().rintertime()
<< " 钱数" << event_list.front().rmoney()
<< endl;
bank_money+=event_list.front().rmoney();
total_time += event_list.front().rtime()-q1.front().rtime();
bank_time = event_list.front().rtime();
q1.pop_front();
}
else
{
cout << " 客户离开 时间:" << event_list.front().rtime()
<< " 办理所需时间:" << event_list.front().rdurtime()
<< " 与下一个客户的时间间隔:" << event_list.front().rintertime()
<< " 钱数" << event_list.front().rmoney()
<< endl;
bank_money+=event_list.front().rmoney();
total_time += event_list.front().rtime()- q2.front().rtime();
bank_time = event_list.front().rtime();
q2.pop_front();
}
if ((event_list.front().rmoney() > 0 )&& !q2.empty()) //每处理完一个存钱客户就要遍历第二个队列,处理所有满足办理条件的客户
{
p = q2.begin();
while (p != q2.end())//遍历第二个队列
{
if ((p->rmoney() + bank_money) > 0)
{
data = *p;
data.do_time(bank_time+data.rdurtime());
data.do_lable(false);
list<event>::iterator q = event_list.begin();
while (q != event_list.end())
{
if (q->rtime() < data.rtime())
q++;
else
break;
}
event_list.insert(q, data);//生成离开事件,并插入事件表
}
p++;
}
}
}
void bank_simulation()//银行业务模拟函数
{
srand(time(0));//随机数发生器(用系统时间作为种子)
durtime=rand()%(up_durtime-down_durtime+1)+down_durtime;
intertime=rand()%(up_intertime-down_intertime+1)+down_intertime;
money=rand()%(up_money-down_money+1)+down_money;
event e(0,1,durtime,intertime,money,0);//生成第一个到达事件
event_list.push_back(e);//插入事件表
temp=e;
while((bank_time < close_time)&&(event_list.front().rtime()<close_time))
{
if(event_list.front().rlable())
customer_arrived();//处理到达事件
else
customer_departure();//处理离开事件
event_list.pop_front();
}
cout<<"银行关闭时间到了,所有客户马上离开,下面是客户相关的数据"<<endl;
p=q1.begin();
while (p != q1.end())//处理到达银行关闭时间,在银行里没有被接待的客户所停留的时间
{
total_time += close_time - p->rtime();
cout << " 客户的到达银行的时间为:" <<p->rtime()<< " 办理所需时间:" << p->rdurtime()
<< " 与下一个客户的时间间隔:" << p->rintertime()
<< " 钱数" << p->rmoney()<< endl;
p++;
}
p=q2.begin();
while (p != q2.end())
{
cout << " 客户的到达银行的时间为:" <<p->rtime()<< " 办理所需时间:" << p->rdurtime()
<< " 与下一个客户的时间间隔:" << p->rintertime()
<< " 钱数" << p->rmoney()<< endl;
total_time += close_time - p->rtime();
p++;
}
}
int main(int argc, char **argv)
{
cout<<"请输入初始时银行现存资金总额"<<endl;
cin>>bank_money;
cout<<"请输入银行总的工作时间"<<endl;
cin>>close_time;
cout<<"请分别输入客户交易时间,与下一个到达客户的时间间隔,钱数(正数代表存钱,负数代表取钱)的上下界"<<endl;
cin>>up_durtime>>down_durtime>>up_intertime>>down_intertime>>up_money>>down_money;
if((up_durtime<down_durtime)||(up_intertime<down_intertime)||(up_money<down_money))
cerr<<"输入错误: 上界一定要大于或等于下界"<<endl;
bank_simulation();
cout << "客户平局停留时间: " << total_time / number << endl;
system("PAUSE");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -