Advertisement
Guest User

Untitled

a guest
Jan 21st, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.36 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstdio>
  4. #include <ctime>
  5. #include <vector>
  6. #include <windows.h>
  7. #include <queue>
  8. #include <string>
  9. #include <conio.h>
  10.  
  11.  
  12. using namespace std;
  13.  
  14.  
  15.  
  16. //DO DODANIA:
  17. // modyfikacja, zeby wartosci windy mogly byc w generowaniu ludzi (wysokosc budynku itd)
  18. // prywatnosc
  19. ////// zatrzymanie i wznowienie windy przyciskiem
  20. // zjazd na srodkowe pietro, gdy nie ma chetnych
  21. // podzielenie przyciskow na dziedziczace w gore i w dol
  22. // inzynier ktory zmienia wlasciwosci windy
  23.  
  24.  
  25. void ShowConsoleCursor(bool showFlag)
  26. {
  27.     HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
  28.  
  29.     CONSOLE_CURSOR_INFO     cursorInfo;
  30.  
  31.     GetConsoleCursorInfo(out, &cursorInfo);
  32.     cursorInfo.bVisible = showFlag; // set the cursor visibility
  33.     SetConsoleCursorInfo(out, &cursorInfo);
  34. }
  35.  
  36.  
  37. class Elevator
  38. {
  39. public:
  40.     int max_weight;
  41.     int min_floor;
  42.     int max_floor;
  43.     int max_ppl;
  44.  
  45.     int curr_weight;
  46.     int curr_floor;
  47.     int curr_ppl;
  48.     int direction;
  49.     Elevator();
  50.  
  51.     void check_floor();
  52.     void load(int);                // zaladowanie ludzi ktorzy chca jechac w tym samym kierunku co winda
  53.     void unload(int);              // wyladowanie ludzi ktorzy znajduja sie na docelowym pietrze
  54.     void switch_floor();           // wznoszenie lub opuszczanie windy
  55.     void check_for_ppl();          // sprawdza, czy na aktualnym pietrze sa ppl_waiting ktorzy chca jechac w tym samym kierunku co winda
  56.     void go_to_load();             // po wyladowaniu wszystkich ludzi szuka kolejnych (z kolejki do windy)
  57.  
  58.     friend ostream& operator<< (ostream&, Elevator const&);
  59.     friend istream& operator>> (istream&, Elevator&);
  60. };
  61.  
  62.  
  63. class People
  64. {
  65. public:
  66.     int starting_floor;
  67.     int curr_floor;
  68.     int desired_floor;
  69.     int weight;
  70.     int direction;
  71.     bool is_waiting;
  72.  
  73.     void generate_ppl(int);
  74.     friend ostream& operator<< (ostream&, People const&);
  75.     friend istream& operator>> (istream&, People&);
  76. };
  77.  
  78.  
  79. vector <People> ppl_waiting;
  80. vector <People> ppl_moving;
  81.  
  82. Elevator winda;
  83. People p;
  84.  
  85. int main(){
  86.     srand(time(0));
  87.     ShowConsoleCursor(false);
  88.  
  89.     clock_t TimeZero = clock();
  90.  
  91.  
  92.     int ppl_generated = 0;
  93.     double deltaTime = 0;
  94.     double secondsToDelay = 0;
  95.     bool exit = false;
  96.     bool if_generate = false;
  97.     int randomized;
  98.  
  99.     cin >> winda;
  100.     cout << "###########################################################################################################################" << endl;
  101.     cout << "#          INFORMACJE WSTEPNE O DZIALANIU WINDY:                                                                          #" << endl;
  102.     cout << "#          1. Winda zaczyna z pietra 0 i porusza sie 1 pietro na sekunde.                                                 #" << endl;
  103.     cout << "#          2. Winda nie jest sprawiedliwa! (lub moze i jest?) Gdy pojawi sie czlowiek numer 1, winda jedzie do niego.     #" << endl;
  104.     cout << "#             natomiast gdy na jej drodze pojawi sie czlowiek numer 2, najpierw spelnia jego zadanie!                     #" << endl;
  105.     cout << "#          3. Zasady mozliwosci wejscia do windy:                                                                         #" << endl;
  106.     cout << "#              3.1 Winda musi miec wolne miejsce na czlowieka;                                                            #" << endl;
  107.     cout << "#              3.2 Ciezar pasazera nie moze byc wiekszy niz wolny dopuszczalny ciezar w windzie;                          #" << endl;
  108.     cout << "#              3.3 Czlowiek moze wsiasc do windy tylko, gdy chce jechac w tym samym kierunku co winda.                    #" << endl;
  109.     cout << "#          4. Gdy nie ma ani ludzi w windzie, ani ludzi czekajacych na nia, winda zawsze zjedzie na pietro srodkowe.      #" << endl;
  110.     cout << "#          5. Zatrzymaj winde LPM, a wznow ja PPM!                                                                        #" << endl;
  111.     cout << "#          6. Wartosci windy mozna podac na poczatku programu, odkomentowujac linie 111                                   #" << endl;
  112.     cout << "#          7. Czestotliwosc generowania ludzi mozna zmienic modyfikujac randomizer w linii 135                            #" << endl;
  113.     cout << "#          8. Winda moze wygenerowac kilku ludzi z tej samej rodziny (beda startowac i jechac na to samo pietro)          #" << endl;
  114.     cout << "#          9. Aby rozpoczac symulacje windy, nacisnij S!                                                                  #" << endl;
  115.     cout << "###########################################################################################################################" << endl;
  116.  
  117.  
  118.     while( getch() == 's' )
  119.     {
  120.         while(!exit) {
  121.             deltaTime = (clock() - TimeZero) / CLOCKS_PER_SEC;
  122.  
  123.             if(deltaTime > secondsToDelay)
  124.             {
  125.  
  126.                 cout << "######################################################### NOWY SCREEN! #########################################################" << endl;
  127.                 randomized = rand()%101;
  128.                 if(randomized > 80)
  129.                 {
  130.                     if(randomized >= 92)
  131.                     {
  132.                         p.generate_ppl(1);
  133.                         ppl_generated = 1;
  134.                     }
  135.                     else if(randomized >= 85 && randomized <= 91)
  136.                     {
  137.                         p.generate_ppl(2);
  138.                         ppl_generated = 2;
  139.                     }
  140.                     else if(randomized >= 82 && randomized <= 84)
  141.                     {
  142.                         p.generate_ppl(3);
  143.                         ppl_generated = 3;
  144.                     }
  145.                     else if(randomized >= 80 && randomized <= 81)
  146.                     {
  147.                         p.generate_ppl(4);
  148.                         ppl_generated = 4;
  149.                     }
  150.  
  151.                     switch(ppl_generated)
  152.                     {
  153.                     case 1: cout << "1 nowy czlowiek wygenerowany!" << endl; break;
  154.                     case 2: cout << "2 nowych ludzi wygenerowanych!" << endl; break;
  155.                     case 3: cout << "3 nowych ludzi wygenerowanych!" << endl; break;
  156.                     case 4: cout << "4 nowych ludzi wygenerowanych!" << endl; break;
  157.  
  158.                     }
  159.                 }
  160.  
  161.                 cout << "~~~~~~~~~~~~~~~~~~~~~~~"  << endl;
  162.                 cout << "INFORMACJE O WINDZIE:" << endl;
  163.                 cout << "~~~~~~~~~~~~~~~~~~~~~~~"  << endl;
  164.                 cout << winda << endl;
  165.  
  166.                 cout << "~~~~~~~~~~~~~~~~~~~~~~~"  << endl;
  167.                 cout << "CZEKAJACY LUDZIE:" << endl;
  168.                 cout << "~~~~~~~~~~~~~~~~~~~~~~~"  << endl;
  169.                 if(ppl_waiting.size() == 0)
  170.                 {
  171.                     cout << "BRAK" << endl << endl;
  172.                 }
  173.                 for(int i = 0; i < ppl_waiting.size(); i++)
  174.                 {
  175.                     cout << ppl_waiting[i] << endl;
  176.                 }
  177.                 cout << endl;
  178.                 cout << "~~~~~~~~~~~~~~~~~~~~~~~"  << endl;
  179.                 cout << "PORUSZAJACY SIE LUDZIE:" << endl;
  180.                 cout << "~~~~~~~~~~~~~~~~~~~~~~~"  << endl;
  181.                 if(ppl_moving.size() == 0)
  182.                 {
  183.                     cout << "BRAK" << endl << endl;
  184.                 }
  185.  
  186.                 for(int i = 0; i < ppl_moving.size(); i++)
  187.                 {
  188.                     cout << ppl_moving[i] << endl;
  189.                 }
  190.                 cout << endl;
  191.  
  192.                 cout <<  "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"  << endl;
  193.                 winda.check_for_ppl();
  194.                 winda.switch_floor();
  195.                 winda.check_floor();
  196.                 cout <<  "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"  << endl;
  197.                 for(int i = 0; i < 5; i++)
  198.                     cout << endl;
  199.  
  200.                 deltaTime = clock();
  201.                 TimeZero = clock();
  202.             }
  203.         }
  204.     }
  205.  
  206.     return 0;
  207. }
  208.  
  209.  
  210.  
  211.  
  212.  
  213. Elevator::Elevator()
  214. {
  215.     max_weight = 1000;
  216.     min_floor = 0;
  217.     max_floor = 10;
  218.     max_ppl = 8;
  219.  
  220.     curr_weight = 0;
  221.     curr_floor = 0;
  222.     curr_ppl = 0;
  223.     direction = 0;
  224. }
  225.  
  226. void Elevator::check_floor()
  227. {
  228.     for(int i = 0; i < ppl_moving.size(); i ++)
  229.     {
  230.         if(ppl_moving[i].desired_floor == winda.curr_floor)
  231.             unload(i);
  232.     }
  233.    
  234.     for(int i = 0; i < ppl_waiting.size(); i ++)
  235.     {
  236.         if( i == 0 && ppl_waiting[i].curr_floor == winda.curr_floor && winda.curr_weight + ppl_waiting[i].weight <= winda.max_weight
  237.                 && winda.curr_ppl < winda.max_ppl && ppl_moving.size() == 0)
  238.                 {
  239.                     load(i);
  240.                     cout << "Wsiadl czlowiek w kolejce jako: " << i << endl;
  241.                 }
  242.         else if(ppl_waiting[i].curr_floor == winda.curr_floor && winda.curr_weight + ppl_waiting[i].weight <= winda.max_weight
  243.                 && winda.curr_ppl < winda.max_ppl && winda.direction == ppl_waiting[i].direction)
  244.                 {
  245.                     load(i);
  246.                     cout << "Wsiadl czlowiek w kolejce jako: " << i << endl;
  247.                 }
  248.         else
  249.         {
  250.             if(ppl_waiting[i].curr_floor == winda.curr_floor)
  251.             {
  252.                 cout << "Czlowiek " << i+1 << " nie moze wsiasc do windy!";
  253.                 if(winda.direction != ppl_waiting[i].direction)
  254.                     cout << " Jedzie nie w tym kierunku." << endl;
  255.                 else if(winda.curr_weight + ppl_waiting[i].weight <= winda.max_weight)
  256.                     cout << " Jest za ciezki." << endl;
  257.                 else if(winda.curr_ppl < winda.max_ppl)
  258.                     cout << " W windzie jest za duzo ludzi." << endl;
  259.             }
  260.         }
  261.     }
  262. }
  263.  
  264. void Elevator::load(int i)
  265. {
  266.     winda.curr_ppl ++;
  267.     winda.curr_weight += ppl_waiting[i].weight;
  268.     ppl_moving.push_back(ppl_waiting[i]);
  269.     ppl_waiting.erase(ppl_waiting.begin() + i);
  270.  
  271.     cout << "Winda zabrala kolejnego pasazera. Teraz jest " << winda.curr_ppl << " ludzi i wazy " << winda.curr_weight << "kg" << endl;
  272. }
  273.  
  274. void Elevator::unload(int i)
  275. {
  276.     winda.curr_ppl --;
  277.     winda.curr_weight -= ppl_moving[i].weight;
  278.     cout << "Hurra! Winda wyladowala pasazera. Teraz jest " << winda.curr_ppl << " ludzi i wazy " << winda.curr_weight << "kg" << endl;
  279.     ppl_moving.erase(ppl_moving.begin() + i);
  280.     if(ppl_waiting.size() == 0)
  281.         winda.direction = 0;
  282. }
  283.  
  284. void Elevator::switch_floor()
  285. {
  286.     if(winda.direction == 1 && winda.curr_floor != winda.max_floor)
  287.     {
  288.         winda.curr_floor ++;
  289.     }
  290.     else if(winda.direction == -1 && winda.curr_floor != winda.min_floor)
  291.     {
  292.         winda.curr_floor --;
  293.     }
  294.     cout << "Winda jest na " << winda.curr_floor << " pietrze i ";
  295.     switch(winda.direction)
  296.     {
  297.         case 1: cout << "jedzie w gore." << endl; break;
  298.         case 0: cout << "stoi w miejscu." << endl; break;
  299.         case -1: cout << "jedzie w dol." << endl; break;
  300.     }
  301. }
  302.  
  303. void Elevator::check_for_ppl()
  304. {
  305.     if(ppl_moving.size() != 0)
  306.     {
  307.         if(winda.curr_floor > ppl_moving[0].desired_floor)
  308.             winda.direction = -1;
  309.         else
  310.             winda.direction = 1;
  311.     }
  312.     else if(ppl_waiting.size() != 0)
  313.     {
  314.         if(winda.curr_floor > ppl_waiting[0].curr_floor)
  315.             winda.direction = -1;
  316.         else
  317.             winda.direction = 1;
  318.     }
  319.     else if(winda.curr_floor != winda.max_floor/2)
  320.     {
  321.         if(winda.curr_floor > 5)
  322.             winda.direction = -1;
  323.         else
  324.             winda.direction = 1;
  325.     }
  326.     else
  327.         winda.direction = 0;
  328. }
  329.  
  330.  
  331. istream& operator>> (istream &wejscie, Elevator& e)
  332. {
  333.     cout << "Podaj ilosc pieter w windzie: ";
  334.     wejscie >> e.max_floor;
  335.     cout << "Podaj maksymalna ilosc ludzi w windzie: ";
  336.     wejscie >> e.max_ppl;
  337.     cout << "Podaj maksymalna ladownosc windy: ";
  338.     wejscie >> e.max_weight;
  339.     return wejscie;
  340. }
  341.  
  342. ostream& operator<< (ostream &wyjscie, Elevator const& e)
  343. {
  344.     wyjscie << "Ladownosc: " << e.curr_weight << "/" << e.max_weight << endl;
  345.     wyjscie << "Pojemnosc: " << e.curr_ppl << "/" << e.max_ppl << endl;
  346.     wyjscie << "Pietro: " << e.curr_floor << endl;
  347.     return wyjscie;
  348. }
  349.  
  350. void People::generate_ppl(int x)
  351. {
  352.     People p;
  353.     p.starting_floor = rand()%(winda.max_floor)+1;
  354.     do
  355.     {
  356.         p.desired_floor = rand()%(winda.max_floor)+1;
  357.     }
  358.     while(p.desired_floor == p.starting_floor);
  359.  
  360.     p.curr_floor = p.starting_floor;
  361.     if(p.starting_floor < p.desired_floor)
  362.         p.direction = 1;
  363.     else
  364.         p.direction = -1;
  365.     for(int i = 0; i < x; i++)
  366.     {
  367.         p.weight = rand()%80+40;
  368.         ppl_waiting.push_back(p);
  369.     }
  370. }
  371.  
  372. istream& operator>> (istream &wejscie, People& p)
  373. {
  374.     cout << "Podaj wage: ";
  375.     wejscie >> p.weight;
  376.     cout << "Podaj startowe pietro: ";
  377.     wejscie >> p.starting_floor;
  378.     p.curr_floor = p.starting_floor;
  379.     cout << "Podaj docelowe pietro: ";
  380.     wejscie >> p.desired_floor;
  381.     return wejscie;
  382. }
  383.  
  384. ostream& operator<< (ostream &wyjscie, People const& p)
  385. {
  386.     wyjscie << "Waga: " << p.weight << endl;
  387.     wyjscie << "Startowe pietro: " << p.starting_floor<< endl;
  388.     //wyjscie << "Aktualne pietro: " << p.curr_floor<< endl;
  389.     wyjscie << "Docelowe pietro: " << p.desired_floor << endl;
  390.     return wyjscie;
  391. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement