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

📄 elevator.cpp

📁 某国际贸易中心共有40层
💻 CPP
字号:
# include "elevator.h"
/# include <iostream.h>
# include <iomanip.h>
# include <conio.h>

elevator::elevator()
{
  elevNumber=-1;
  timeToAction=ELEVWAIT;
  floorNumber=0;
  stopped=true;
  dir=NODIRECTION;
  passengers=0;
  for (int i=0;i<MAXFLOORS;i++)
    buttons[i]=false;
}

bool elevator::buttonUp(void)
{
  for (int i=floorNumber+1;i<MAXFLOORS;i++)
    if (buttons[i])  return true;
  return false;
}

bool elevator::buttonDown(void)
{
  for (int i=0;i<floorNumber;i++)
    if (buttons[i]) return true;
  return false;
}

void elevator::showElevator(void)
{
  textcolor(BROWN);
  gotoxy(13+elevNumber*7,1);
  switch (floorNumber)
  {
    case 0:  cprintf("1 "); break;
    case 1:  cprintf("2 "); break;
    case 2:  cprintf("3 "); break;
    case 3:  cprintf("4 "); break;
    case 4:  cprintf("5 "); break;
    case 5:  cprintf("6 "); break;
    case 6:  cprintf("7 "); break;
    case 7:  cprintf("8 "); break;
    case 8:  cprintf("9 "); break;
    case 9:  cprintf("10"); break;
  }
  Draw_window ((10+elevNumber*7),(20-floorNumber*2),(16+elevNumber*7),(22-floorNumber*2));
  gotoxy((11+elevNumber*7),(21-floorNumber*2));
  cout<<setw(3)<<passengers<<" ";
  if (dir==UP)  {textcolor(RED); cprintf("U");}
  if (dir==DOWN) { textcolor(MAGENTA); cprintf("D");}
  if (dir==NODIRECTION)  { textcolor(GREEN); cprintf("-");}
  textcolor(WHITE);
}

void elevator::SetDirection(floorSet &floors)
{
  if (buttonUp())
    dir=UP;
  else
    if (buttonDown())
      dir=DOWN;
    else
      if (floors.signalUp(floorNumber))
	dir=UP;
      else
	if (floors.signalDown(floorNumber))
	  dir=DOWN;
	else
	  if (dir!=DOWN||floorNumber==0)
	  dir=NODIRECTION;

}

bool elevator::elevStopping(floorSet &floors)
{
  if (buttons[floorNumber])
    return true;
  else
    if (floors.signalSameDir(dir,floorNumber))
      return true;
    else
      if (floorNumber==0)
	return true;
      else
	if (floorNumber==MAXFLOORS-1)
	  return true;
	else
	  if (dir==NODIRECTION&&floors.getnp(floorNumber)!=0)
	  {
	    dir=DOWN;
	    return true;
	  }
	  else
	    return false;
}

void elevator::action(floorSet &floors,perSet &persons)
{
  int pdest;
  int newdir;
  if (stopped)
  {
    passengers-=persons.discharge(elevNumber,floorNumber);
    if (dir==0&&passengers<CAPACITY)
    {
      if (persons.loadAny(elevNumber,floorNumber,pdest))
      {
	passengers++;
	timeToAction++;
	buttons[pdest]=true;
	if (pdest>floorNumber)
	  dir=UP;
	else
	  dir=DOWN;
      }
    }
    if (dir!=0&&passengers<CAPACITY)
    {
      if (persons.loadOne(elevNumber,floorNumber,dir,pdest))
      {
	passengers++;
	timeToAction++;
	buttons[pdest]=true;
	if (passengers>=CAPACITY)  timeToAction=0;
      }
    }
    if (timeToAction--<=0)
    {
      if (dir==0)
	SetDirection(floors);
      if (dir==0&&floorNumber>0)
	dir=DOWN;
      if (dir==0)
	timeToAction=ELEVWAIT;
      else
      {
	floors.reSetButton(dir,floorNumber);
	stopped=false;
	timeToAction=TRAVELTIME;
      }
    }
  }
  else
    if (timeToAction--<=0)
    {
      if (dir==UP)
	  floorNumber++;
	else
	  floorNumber--;
      SetDirection(floors);
      if (elevStopping(floors))
      {
	floors.reSetButton(dir,floorNumber);
	stopped=true;
	timeToAction=ELEVWAIT;
	buttons[floorNumber]=false;
      }
      else
	timeToAction=TRAVELTIME;
   }

}

elevSet::elevSet()
{
  for (int i=0;i<MAXELEVS;i++)
    ea[i].SetelevNumber(i);
}

void elevSet::showElevators(void)
{
   for (int k=2;k<=22;k++)
   {
     gotoxy(10,k);
     clreol();
   }
   for (int i=0;i<MAXELEVS;i++)
     ea[i].showElevator();
}

void elevSet::action(floorSet &floors,perSet &persons)
{
  for (int i=0;i<MAXELEVS;i++)
    ea[i].action(floors,persons);
}

int elevSet::avgRiding(void)
{
  int total=0;
  for (int i=0;i<MAXELEVS;i++)
    total+=ea[i].getPassengers();
  return total/MAXELEVS;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -