📄 main.~cpp
字号:
//*******************************************************//
//if(SysTime>=14400 && SysTime<21600)//属于中午休息时间
if(SysTime>=morning && SysTime<noon)//属于中午休息时间
{
//不再产生新的问询者,不再产生新的购票者,原先已进入的购票者继续排队接受服务
if (FirstComeInLunchTime==false) //如果刚进入午休时间
{
FirstComeInLunchTime=true;
Memo1->Lines->Add("=================");
Memo1->Lines->Add("中午休息时间到"+IntToStr(SysTime));
if(Ticket==2 && ServiceTimer->Enabled==true) //正在服务问询者
{
ServiceTimer->Enabled=false;
ConductorState=false;
Ticket=0;
}
Tele_TimeOut=Tele_TimeOut+TelephoneListBox->Items->Count;
//改变超时电话数
if(TelephoneListBox->Items->Count>0)
{
for(int i=0;i<TelephoneListBox->Items->Count;i++)
ListBox2->Items->Insert(ListBox2->Items->Count,TelephoneListBox->Items->Strings[i]+"--午休时间到");
//往超时挂断电话的列表框中输入
TelephoneListBox->Items->Clear(); //挂断所有电话
}
}
if(TicketListBox->Items->Count<=0) //已经没有购票者了
{
if(ConductorState==false) //且售票员闲,则直接进入下午营业时间
SysTime=noon;
else
return;
}
else//还有购票者在排队
{
if( ConductorState==false)//售票员闲
{
if(StrToInt(TicketListBox->Items->Strings[0])<=SysTime)//若购票者到达时间在仿真时钟之前,则为可用购票顾客
{
ConductorState=true;//将售票员状态置为忙 //处理该购票者
ListBox1->Items->Insert(ListBox1->Items->Count,TicketListBox->Items->Strings[0]);
Memo1->Lines->Add("正常服务购票者:"+TicketListBox->Items->Strings[0]);
Ticket_Count(); //得到购票者购票的可能性
TicketListBox->Items->Delete(0);//将该购票者从购票队列中清除
while(Service_Time<=0)
Service_Time=Gaussian(4,2)*60; //产生一个服务时间,并启动服务时间定时器
Memo1->Lines->Add("开始售票服务,服务时间:"+IntToStr(Service_Time));
Ticket=1;
BusyTime=BusyTime+Service_Time;
Ticket_Time=Ticket_Time+Service_Time;
if(Service_Time==0)
Memo1->Lines->Add("服务结束,当前时间:"+IntToStr(SysTime));
else
{
TimeBeforeService=SysTime;
ServiceTimer->Enabled=true;
}
return;
}
else
return;//没有可用的购票用户
}
else
return;//售票员忙
}//还有购票者在排队
}
//*******************************************************
//if(SysTime>=21600 && SysTime<36000)//属于下午营业时间
if(SysTime>=noon && SysTime<afternoon)//属于下午营业时间
{
if(FirstComeInAfternoon==false)
{
FirstComeInAfternoon=true;
Memo1->Lines->Add("=================");
Memo1->Lines->Add("下午营业时间到"+IntToStr(SysTime));
//重新开启服务
int timeafternoon;
timeafternoon=Poisson(5)*60+noon;
TicketListBox->Items->Insert(TicketListBox->Items->Count,IntToStr(timeafternoon));
Ticket_In++;
Memo1->Lines->Add("正常产生新购票者:"+IntToStr(timeafternoon));
timeafternoon=Poisson(8)*60+noon;
TelephoneListBox->Items->Insert(TelephoneListBox->Items->Count,timeafternoon);
Tele_In++;
Memo1->Lines->Add("正常产生新问询者:"+IntToStr(timeafternoon));
}
//判断是否应该产生新到顾客
Arrive_LastTicket();
Arrive_LastTelephone();
//判断是否有电话问询者超时
Telephone_TimeOut();
if(ConductorState==false && ServiceTimer->Enabled==false) //售票员闲
{ //确定服务对象,并进行服务
//*************服务对象为购票者***************
if(TicketListBox->Items->Count>0&&StrToInt(TicketListBox->Items->Strings[0])<=SysTime)
//若购票者到达时间在仿真时钟之前,则为可用购票顾客
{
ConductorState=true;//将售票员状态置为忙 //处理该购票者
ListBox1->Items->Insert(ListBox1->Items->Count,TicketListBox->Items->Strings[0]);
Memo1->Lines->Add("正常服务购票者:"+TicketListBox->Items->Strings[0]);
//得到购票者购票的可能性
Ticket_Count();
TicketListBox->Items->Delete(0);
//将该购票者从购票队列中清除
while(Service_Time<=0)
Service_Time=Gaussian(4,2)*60; //产生一个服务时间,并启动服务时间定时器
Memo1->Lines->Add("开始售票服务,服务时间:"+IntToStr(Service_Time));
Ticket=1;
BusyTime=BusyTime+Service_Time;
Ticket_Time=Ticket_Time+Service_Time;
if(Service_Time==0)
Memo1->Lines->Add("服务结束,当前时间:"+IntToStr(SysTime));
else
{
TimeBeforeService=SysTime;
ServiceTimer->Enabled=true;
}
return;
}
//*************服务对象为购票者***************
//*************服务对象为问讯者或无服务对象***************
else //没有购票者在排队
{
if(TelephoneListBox->Items->Count>0 && StrToInt(TelephoneListBox->Items->Strings[0])<=SysTime) //若问讯者到达时间在仿真时钟之前,则为可用问讯顾客
{
ConductorState=true;//将售票员状态置为忙 //处理该问询者
ListBox2->Items->Insert(ListBox2->Items->Count,TelephoneListBox->Items->Strings[0]);
Memo1->Lines->Add("正常服务问讯者:"+TelephoneListBox->Items->Strings[0]);
TelephoneListBox->Items->Delete(0); //将该问讯者从问讯队列中清除
while(Service_Time<=0)
Service_Time=Gaussian(3,3)*60; // 产生一个服务时间,并启动服务时间定时器
Memo1->Lines->Add("开始问讯服务,服务时间:"+IntToStr(Service_Time));
Ticket=2;
BusyTime=BusyTime+Service_Time;
Tele_Time=Tele_Time+Service_Time;
if(Service_Time==0)
Memo1->Lines->Add("服务结束,当前时间:"+IntToStr(SysTime));
else
{
TimeBeforeService=SysTime;
ServiceTimer->Enabled=true;
}
return;
}
else//既没有问询者,也没有购票者
return;
}//else
//*************服务对象为问讯者或无服务对象***************
}//if(ConductorState==false)//售票员闲着
else//售票员忙着
return;
}
//*******************************************************
//if(SysTime>=36000)//属于下班时间
if(SysTime>=afternoon)//属于下班时间
{
//不再产生新的问询者,不再产生新的购票者,原先已进入的购票者继续排队接受服务
if (FirstComeInOverTime==false) //如果刚进入午休时间
{
FirstComeInOverTime=true;
Memo1->Lines->Add("=================");
Memo1->Lines->Add("下班时间到"+IntToStr(SysTime));
if(Ticket==2 && ServiceTimer->Enabled==true) //正在服务问询者
{
ServiceTimer->Enabled=false;
ConductorState=false;
Ticket=0;
}
Tele_TimeOut=Tele_TimeOut+TelephoneListBox->Items->Count;
//改变超时电话数
if(TelephoneListBox->Items->Count>0)
{
for(int i=0;i<TelephoneListBox->Items->Count;i++)
ListBox2->Items->Insert(ListBox2->Items->Count,TelephoneListBox->Items->Strings[i]+"--下班时间到");
//往超时挂断电话的列表框中输入
TelephoneListBox->Items->Clear(); //挂断所有电话,
}
}
if(TicketListBox->Items->Count==0) //已经没有购票者了,
{
if(ConductorState==false) //且售票员闲,则直接下班
{
SecondsTimer->Enabled=false;
//TimeOutTimer->Enabled=false;
Memo1->Lines->Add("仿真结束!当前时间:"+IntToStr(SysTime));
Memo1->Lines->Add("给出仿真结果报告...");
report();
Button1->Caption="仿真结束";
return;
}
}
else//还有购票者在排队
{
if( ConductorState==false && ServiceTimer->Enabled==false)//售票员闲
{
if(StrToInt(TicketListBox->Items->Strings[0])<=SysTime)//若购票者到达时间在仿真时钟之前,则为可用购票顾客
{
ConductorState=true;//将售票员状态置为忙 //处理该购票者
ListBox1->Items->Insert(ListBox1->Items->Count,TicketListBox->Items->Strings[0]);
Memo1->Lines->Add("正常服务购票者:"+TicketListBox->Items->Strings[0]);
Ticket_Count(); //得到购票者购票的可能性
TicketListBox->Items->Delete(0);//将该购票者从购票队列中清除
while(Service_Time<=0)
Service_Time=Gaussian(4,2)*60; //产生一个服务时间,并启动服务时间定时器
Memo1->Lines->Add("开始售票服务,服务时间:"+IntToStr(Service_Time));
Ticket=1;
BusyTime=BusyTime+Service_Time;
Ticket_Time=Ticket_Time+Service_Time;
if(Service_Time==0)
Memo1->Lines->Add("服务结束,当前时间:"+IntToStr(SysTime));
else
{
TimeBeforeService=SysTime;
ServiceTimer->Enabled=true;
}
return;
}
else
return;//没有可用的购票用户
}
else
return;//售票员忙
}//还有购票者在排队
}
//*******************************************************
//SecondsTimer->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TimeOutTimerTimer(TObject *Sender)
{
Tele_TimeOut=Tele_TimeOut+1;
TelephoneListBox->Items->Delete(0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServiceTimerTimer(TObject *Sender)
{
if(SysTime>=TimeBeforeService+Service_Time)
{
Memo1->Lines->Add("服务结束,当前时间:"+IntToStr(SysTime));
ConductorState=false;
//服务时间到,将售票员状态置为闲
Service_Time=0;
Ticket=0;
ServiceTimer->Enabled=false;
//关闭服务实践计时器
}
else
return;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Button1->Caption="仿真中...";
Button1->Enabled=false;
start();
}
//---------------------------------------------------------------------------
void TForm1::report()
{
Memo2->Lines->Add("售票员的忙率(不含午休时间):"+IntToStr((int)((float)BusyTime/288))+"%");
Memo2->Lines->Add("售票服务时间:"+IntToStr(Ticket_Time/60)+"分钟");
Memo2->Lines->Add("卖出的总票数:"+IntToStr(Ticket_Sold));
Memo2->Lines->Add("总购票者数:"+IntToStr(Ticket_In));
Memo2->Lines->Add("问讯服务时间:"+IntToStr(Tele_Time)/60+"分钟");
Memo2->Lines->Add("接受问讯的顾客数:"+IntToStr(Tele_In-Tele_TimeOut));
Memo2->Lines->Add("未能接受问讯的顾客数:"+IntToStr(Tele_UnIn+Tele_TimeOut));
Memo2->Lines->Add("超时挂断的电话数:"+IntToStr(Tele_TimeOut));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -