Skip to main content

Elevator system code in C++


First create a c header file called elev.h looking   like this 
  
  #include "elev_app.h"
#include "msoftcon.h"
#include <iostream>
#include <iomanip>
#include<conio.h>
#include<stdlib.h>
#include<process.h>

using namespace std;

enum direction { UP,DOWN, STOP };
//loading/unloading time (ticks)
const int LOAD_TIME = 3;
const int SPACING = 7;
const int BUF_LENGTH = 80;

class building; //forward declaration

class elevator
{
private:
building* ptrBuilding;
const int car_number;
int current_floor;
int old_floor;
direction current_dir;
bool destination[NUM_FLOORS];
int loading_timer;
int unloading_timer;

public:
elevator(building*,int);
void car_tick1();
void car_tick2();
void car_display();
void dests_display() const;
void decide();
void move();
void get_destinations();
int get_floor() const;
direction get_direction() const;
};

class building
{
private:
elevator* car_list[NUM_CARS];
int num_cars; //cars created so far

bool floor_request[2][NUM_FLOORS]; //False=UP True=Down

public:
building();
~building();
void master_tick(); //send tick to all cars
int get_cars_floor(const int) const;
direction get_cars_dir(const int) const;
bool get_floor_req(const int,const int);
void set_floor_req(const int,const int,const bool);
void record_floor_reqs(); //get floor request
void show_floor_reqs() const; //show fllor request
};
After you have created the elev.h now create elev.cpp the main executable file.
#include "elev.h"

building::building()
{
//string for floors
char ustring[BUF_LENGTH];

//intialize graphics
init_graphics();

//clear screen
clear_screen();

num_cars = 0;
for(int k=0; k<NUM_CARS; k++)
{
car_list[k] = new elevator(this, num_cars);
num_cars++;
}
for(int j=0;mj<NUM_FLOORS; j++)
{
set_cursor_pos(3,NUM_FLOORS-j); //put floor number
itoa(j+1, ustring, 10);
cout << setw(3) << ustring;
floor_request[UP][j] = false; //no floor request yet
floor_request[DOWN][j] = false;
}
}
//end constructor

//start destructor
building::-building()
{
for(int k=0; k<NUM_CARS; k++)
delete car_list[k];
}
//master time tick
void building::master_tick()
{
int j;
show_floor_reqs();
for(j=0; j<NUM_CARS; j++)
car_list[j]->car_tick1();
for(j=0; j<NUM_CARS; j++)
car_list[j]->car_tick2();
}

//display floor request
void building::show_floor_reqs() const
{
for(int j=0; j<NUM_FLOORS; j++)
{
set_cursor_pos(SPACING, NUM_FLOORS-j);
if(floor_request[UP][j]==true)
cout << "\x1E"; //up arrow
else
cout << " ";
set_cursor_pos(SPACING+3, NUM_FLOORS-j);
if(floor_request[DOWN][j]==true)
cout << "\1xF";
else
cout << " ";
}
}

//get requets from riders outside the cars
void building::record_floor_reqs()
{
char ch = "x";
char ustring[BUF_LENGTH];
int iFloor;
char chDirection; //'u' or 'd' for up and down

set_cursor_pos(1,22);
cout << "Press [ENTER] to call an elevator:";
if(!kbhit()) // wait for keypress
return;
cin.ignore(10, "\n");
if(ch=="\x1B") //if escape key end the program
exit(0);
set_cursor_pos(1,22); clear_line(); //clear old text
set_cursor_pos(1,22); //bottom of screen
cout << "Enter the floor you're on:";
cin.get(ustring,BUF_LENGTH);
cin.ignore(10, "\n");
iFloor = atoi(ustring); //convert to integer

cout << "Ente the direction you want to go"(U or D):";
cin.get(chDirection); //(avoid multiple lines feeds)
cin.ignore(10,"\n");

if(chDirection=='u' || chDirection=='U')
floor_request[UP][iFloor-1] = true; //up floor request
if(cgDirection=='d' || chDirection=='D')
floor_request[DOWN][iFloor-1]=true; //down floor request
set_cursor_pos(1,22);
set_cursor_pos(1,23);
set_cursor_pos(1,24);
}

//see if there is a specific request
bool building::get_floor_req(const int dir,const int floor) const //check error on compiling here
{
return floor_request[dir][floor];
}

//set specific floor request
bool building::set_floor_req(const int dir, const int floor, const bool updown)
{
floor_request[dir][floor]=updown;
}

//---------------------------------------------

find where the carrier is in this case car
int building::get_cars_floor(const int carNo)const
{
return car_list[carNo]->get_floor();
}
//find which direction the car is moving
direction building::get_cars_dir(const int carNo) const
{
return car_list[carNo]->get_direction();
}

// function definitions for class elevator begins here
elevator::elevator(building* ptrB. int nc) :
ptrBuilding(ptrB),car_number(nc)
{
current_floor = 0; //start at 0
old_floor = 0;
current_dir = STOP;
for(int j=0; j<NUM_FLOOR; j++)
destination[j] = false;
loading_timer = 0; //no loading yet
unloading_timer = 0;
} //end constructor

//get current floor
int elevator::get_floor() const
{
return current_floor;
}

//get current direction
direction elevator::get_direction() const
{
return current_dir;
}

//tick for each car
void elevator::car_tick1()
{
car_display();
dests_display();
if(loading_timer)
__loading_timer;
if(unloading_timer)
__unloading_timer;
decide();
}

//All cars must decide before any of them move
void elevator::car_tick2()
{
move();
}

//display elevator image
void elevator::car_display()
{
set_cursor_pos(SPACING+(car_number+)*SPACING, NUM_FLOORS-old_floor);
cout << " "; //erase old position
set_cursor_pos(SPACING-1(car_number+)*SPACING, NUM_FLOORS-current_floor);

switch(loading_timer)
{
case 3:
cout << "\x01\xDB \xDB "; //draw a car with open door
break;
case 2:
cout << " \xDB \x01\xDB";
get_destinations();
break;
case 1:
cout << "\xDB\xDB\xDB "; //draw a car with closed door
break;
case 0;
cout << "\xDB\xDB\xDB"; //closed door
break;
}

set_cursor_pos(SPACING+(car_number+1)*SPACING,NUM_FLOORS-current_floor);

switch(unloading_timer)
{
case 3:
cout << "\xDB\x01\xDB";
break;
case 2:
cout << "\xDB\xDB\x01";
break;
case 1:
cout << "\xDB\xDB\xDB";
break;
case 0:
cout << "\xDB\xDB\xDB";
break;
}
//display destinations
void elevator::dests_display() const
{
for(int j=0; j<NUM_FLOORS; j++)
{
set_cursor_pos(SPACING-2+(car_number+1)*SPACING,NUM_FLOORS-j);
if(destination[j] == true)
cout << "\xFE'; //small box
else
cout << "";
}
}
//Decide what to do
void elevator::decide()
{
int j;

bool destins_above, destins_below; //destinations
bool requests_above, requests_below; //requests

int nearest_higher_req = 0;
int nearest_lower_req = 0;

bool car_between_up,car_between_dn;
bool car_opposite_up, car_opposite_dn;

int ofloor;
direction odir;

//Ensure we don't go too high or too low
if((current_floor==NUM_FLOORS-1 && current_dir==UP) || (current_floor==0 && current_dir==DOWN)
current_dir = STOP;

// if there a destination on this floor ,unload pasengers
if(destination[current_floor]==true)
{
destination[current_floor] = false;
if(!unloading_timer)
unloading_timer = LOAD_TIME;
return;
}

//check if there is an UP floor request on this floor
if((ptrBuilding->get_floor_req(UP, current_floor) && current_dir !=DOWN))
{
current_dir = UP;
ptrBuilding->set_floor_req(current_dir,current_floor,false);
//load
if(!loading_timer)
loading_time = LOAD_TIME;
return;
}

//check if there is an DOWN floor request on this floor
if((ptrBuilding->get_floor_req(DOWN, current_floor) && current_dir !=UP))
{
current_dir = DOWN;
ptrBuilding->set_floor_req(current_dir,current_floor,false);
//load
if(!loading_timer)
loading_time = LOAD_TIME;
return;
}

//check if there are other destinations or requests
destins_above = destins_below = false;
requests_above = requests_below = false;
for(j=current_floor+1; j<NUM_FLOORS; j++)
{
if(destination[j])
destins_above = true;
if(ptrBuilding->get_floor_req(UP,j) || ptrBuilding->get_floor_req(DOWN,j))
{
requests_above = true;
if(!nearest_higher_req)
nearest_higher_req - j;
}
}

//check fllors below
for(j=current_floor-1; j=>0; j--)
{
if(destination[j])
destins_below = true;
if(ptrBuilding->get_floor_req(UP,j) || ptrBuilding->get_floor_req(DOWN,j)
{
requests_below = true;
if(!nearest_lower_req)
nearest_lower_req = j;
}
}

//if no request or destinations DOWN or Up ,STOP the system
if(!destins_above && !requests_above && !destins_below && !requests_below)
{
current_dir = STOP;
return;
}

//Go toward destination if stopped or already moving
if(destins_above && (current_dir==STOP || current_dir==UP))
{
current_dir = UP;
return;
}
if(destins_below && (current_dir==STOP || current_dir==DN))
{
current_dir = DOWN;
return;
}

//Find if there cars going in the same direction between us and the nearest floor

car_between_up = car_between_down = false;
car_opposite_up = car_opposite_DOWN = false;

//check the car
for(j=0; j<NUM_CARS; j++)
{
if(j !=car_number)
{
ofloor = ptrBuilding->get_car_floors(j);
odir = ptrBuilding->get_cars_dir(j);

//if it going up and there is arequest above us
if((odir==UP || odir==STOP) && requests_above)

// if it above us and thebelow the nearest request
if((ofloor>current_floor && ofloor <= nearest higher req) || (ofloor==current_floor && j<car_number))
car_between_dn = true;

//if it going and there is a request above us
if((odir==UP || odir==STOP) && requests_below)

//it a below request and closer to it than we are
if(nearest_lower_req>=ofloor && nearest_low_req - ofloor<current_floor - nearest_lower_req)
car_opposite_up = true;

//if it going DOWN and there is arequest above us
if((odir==DOWN || odir==STOP) && requests_above)

// if it above us and thebelow the nearest request
if(ofloor >=nearest_higher_req && ofloor - nearest_higher_req<nearest_higher_req - current_floor)
car_opposite_down = true;

}
}

//if we are going down or stopped and there is a FR
//No other cars going down between us and the FR
if(current_dir==DOWN || current_dir==STOP) && requests_below && !car_between_down && !car_opposite_up)
{
current_dir = DOWN;
return;
}

//if nothing else happening stop
current_dir = STOP;
}
//....end decide() finally artificiall intelligence


//if loading or unloading
void elevator::move()
{
if(loading_timer || unloading_timer) //don't move
return;
if(current_dir==UP) //if it going up,go up
current_floor++;
}
//end move

//stop ,get destination
void elevator::get_destinations()
{
char ustring[BUF_LENGTH];
int dest_floor'

set_cursor_pos(1,22); clear_line();
set_cursor_pos(1,22)
cout << "Car" << (car_number+1) << "has stopped at floor" << (current_floor+1) << "\n Enter the destination floors (0 when finished)";

for(int j=1; j<NUM_FLOORS; j++)
{
set_cursor_pos(1,24);
cout << "Destination" << j << ":";

cin.get(ustring,BUF_LENGTH);
cin.ignore(10,"\n");
dest_floor = atoi(ustring);
set_cursor_pos(1,24);

if(dest_floor==0)
{
set_cursor_pos(1,22); clear_line();
set_cursor_pos(1,23); clear_line();
set_cursor_pos(1,24); clear_line();
return;
}

--dest_floor;
if(dest_floor==current_floor)
{ --j; continue; }

if(j==1 && current_dir==STOP)
current dir = (dest floor <current floor) ? DOWN : UP;
destination[dest_floor] = true;
dests_display();
}
}

//This the end of the code
    

Comments

Popular posts from this blog

How to Remove Powered by Blogger – Attribution Widget?

In this article, I will be demonstrating how to remove or hide attribution widget ‘Powered by Blogger’ in footer of blogger blogspot blogs.  Before going to the process,  backup your blogger template , while editing html code if anything goes wrong or template modified design doesn’t work or looks good you can restore from backed up template.  Here I have demonstrated you two methods for removing attribution widget. Some blogger templates may not support method 1 then you need to follow method 2 for successfully removing attribution widget. Method 1: Remove ‘Powered by Blogger’ by unlocking Attribution widget Step 1 : Go to your blog “Template” | click on “Edit HTML”. Step 2 : Here on drop-down “jump to widget” option and select Attribution 1 as shown below Step 3: After selecting Attribution 1 widget you will be able to see this line <b:widget id=’Attribution1′ locked=’true’ title=” type=’Attribution’>  on your blogger template. Step 5: Once done click on...

How to get Google Assistant on your Windows, Mac, or Linux Machine

Google Assistant is Google’s answer to Amazon’s Alexa smart home assistant. Initially only available with limited functionality in the Google Allo application, Google Assistant later rolled out with the Google Home and Pixel smartphones to bring the full power of Google’s assistant to consumers. After a few months of waiting, smartphones running Android 6.0+ also received Google Assistant, and just a few days ago Google launched the Google Assistant SDK which allows Assistant to be run on basically any platform. Today, we will show you how to install Google Assistant onto your Windows, Mac, or Linux machine using Python. Note: at this point in time, this is purely for educational purposes. There’s no fancy GUI for you to play with, and installing Assistant requires you to use the command line. Get Google Assistant on Windows/Mac/Linux Machines Requirements: Python 3 You’ll need to have Python installed no matter whether or not you are using W...

Fix for NET Framework 3.5 not installing on Windows 10

I'm a gamer at heart, so you can imagine how annoyed I was when I saw that a Windows 10 error was preventing me from running certain titles. Many modern games require  NET Framework 3.5 in order to run, but... whenever I tried to install it on my Windows 10, I got the " DISM failed. No operation was performed ." error message. Since I'm sure I'm not the only one facing this problem, I've decided to show everyone how to fix it. For those of you who are interested, the Net Framework is a programming infrastructure that Microsoft created to help developers build and deploy products that use .NET technology. Since there are a lot of applications and services that rely on .NET (Dot Net) for their functionality, you can imagine that this kind of error can be quite irritating. Here are a few solutions that you should try: Solution One This is the one that takes the least time, but you need to have the USB stick that contains the Windows 10 installer plugged into your...