⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.~cpp

📁 单窗口售票系统仿真程序 运用秒推进法模拟了单窗口售票系统售票员忙、闲
💻 ~CPP
📖 第 1 页 / 共 2 页
字号:

  //*******************************************************//
 
//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 + -