Advertisement
adnanj

PR2 - W2 - Zadatak

Oct 25th, 2014
516
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.98 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. char crtice[] = "\n===============================================\n";
  5.  
  6. class Vrijeme{
  7.     int _sati;
  8.     int _minute;
  9.     int _sekunde;
  10. public:
  11.     //Konstruktor bez parametara
  12.     Vrijeme() {
  13.         _sati = _minute = _sekunde = 0;
  14.     }
  15.     //Konstruktor sa 3 parametra (sati, minute i sekunde)
  16.     Vrijeme(int sati, int minute, int sekunde) {
  17.         _sati = sati;
  18.         _minute = minute;
  19.         _sekunde = sekunde;
  20.     }
  21.     //Konstruktor sa 2 parametra (sati i minute)
  22.     Vrijeme(int sati, int minute) {
  23.         _sati = sati;
  24.         _minute = minute;
  25.         _sekunde = 0;
  26.     }
  27.  
  28.     //Funkcija Info sa neobaveznim parametrom tipa bool koji određuje da li će vrijeme biti
  29.     //ispisano u punom formatu
  30.     //(hh:mm:ss) ili u skraćenom formatu (hh:mm). Default-no funkcija vrši ispis u punom formatu.
  31.     void Info(bool fullFormat = true)const {
  32.         if(fullFormat)
  33.             cout << _sati << ":" << _minute << ":" << _sekunde;
  34.         else
  35.             cout << _sati << ":" << _minute;
  36.     }
  37.  
  38.     //Funkcije seteri za sate, minute i sekunde
  39.     void setVrijeme(int sati, int minute, int sekunde) { _sati = sati; _minute = minute; _sekunde = sekunde; }
  40.     void setSati(int sati) { _sati = sati; }
  41.     void setMinute(int minute) { _minute = minute; }
  42.     void setSekunde(int sekunde) { _sekunde = sekunde; }
  43.     //Funkcije geteri za sate, minute i sekunde
  44.     int getSati()const { return _sati; }
  45.     int getMinute()const { return _minute; }
  46.     int getSekunde()const { return _sekunde; }
  47.  
  48.     //Funkcija Add kao rezultat vraća novi objekat tipa vrijeme koji predstavlja
  49.     //sumu vremena poslijeđenog kao parametar i instance this.
  50.     Vrijeme Add(Vrijeme v) {
  51.         int sekundeUkupno = (_sati * 3600 + _minute * 60 + _sekunde) + (v._sati * 3600 + v._minute * 60 + v._sekunde);
  52.         return Vrijeme(sekundeUkupno/3600, sekundeUkupno%3600/60, sekundeUkupno%60);
  53.     }
  54.  
  55.     //Funkcija Add kao rezultat vraća novi objekat tipa vrijeme koji predstavlja
  56.     //sumu parametra izraženog u minutama i vremena instance this.
  57.     Vrijeme Add(int minute)const {
  58.         int sekundeUkupno = (_sati * 3600 + _minute * 60 + _sekunde) + (minute * 60);
  59.         return Vrijeme(sekundeUkupno/3600, sekundeUkupno%3600/60, sekundeUkupno%60);
  60.     }
  61.  
  62.     //Funkcija CompareTo vraća vrijednost tipa int u zavisnosti od toga da li je vrijeme
  63.     //instance this prije, jednako ili poslije vremena proslijeđenog kao parametar.
  64.     //Moguće povratne vrijednosti:
  65.     //-1 - vrijeme instance this nastupa prije vremena v2
  66.     // 0 - vrijeme instance this je jednako vremenu v2
  67.     // 1 - vrijeme instance this nastupa nakon vremena v2
  68.     int CompareTo(Vrijeme v) {
  69.         int sekundeInstance = _sati * 3600 + _minute * 60 + _sekunde;
  70.         int sekundeParametra = v._sati * 3600 + v._minute * 60 + v._sekunde;
  71.         if(sekundeInstance < sekundeParametra)
  72.             return -1;
  73.         else if(sekundeInstance == sekundeParametra)
  74.             return 0;
  75.         else return 1;
  76.     }
  77. };
  78.  
  79. class Polazak{
  80.     char _odrediste[50];
  81.     int _brojVoza;
  82.     int _brojPerona;
  83.     //Informacija da li se radi o lokalnom ili brzom vozu (false = lokalni, true = brzi)
  84.     bool _vrstaVoza;
  85.     Vrijeme _polazak;
  86.     //Kasnjenje u minutama
  87.     int _kasnjenje;
  88. public:
  89.     //Potrebni konstruktori
  90.     Polazak() {
  91.         strcpy_s(_odrediste, 50, "<Nije uneseno>");
  92.         _brojVoza = 0;
  93.         _brojPerona = 0;
  94.         _vrstaVoza = 0;
  95.         _kasnjenje = 0;
  96.     }
  97.     Polazak(char* o, int brVoza, int brPerona, bool vrsta, int satiPolaska, int minPolaska) {
  98.         strcpy_s(_odrediste, 50, o);
  99.         _brojVoza = brVoza;
  100.         _brojPerona = brPerona;
  101.         _vrstaVoza = vrsta;
  102.         _polazak.setVrijeme(satiPolaska, minPolaska, 0);
  103.         _kasnjenje = 0;
  104.     }
  105.  
  106.     //Ukoliko voz kasni metoda vraća true, u suprotnom vraća false
  107.     bool Kasni()const { return _kasnjenje > 0; }
  108.  
  109.     //Potrebni geteri za funkcije koje slijede
  110.     int getBrojVoza() { return _brojVoza; }
  111.     char * getOdrediste() { return _odrediste; }
  112.     int getKasnjenje() { return _kasnjenje; }
  113.     Vrijeme getPolazak() { return _polazak; }
  114.  
  115.     //Očekivano vrijeme polaska se formira na osnovu predviđenog vremena i
  116.     //kašnjenja izraženog u minutama
  117.     Vrijeme getOcekivanoVrijemePolaska()const {
  118.         Vrijeme temp = _polazak.Add(_kasnjenje);
  119.         return temp;
  120.     }
  121.  
  122.     //U slučaju polaska bez kašnjenja ispis je sljedeći:
  123.     //Lokalni voz broj 3256, odrediste Tuzla, polazi sa perona 5 u 14:30 Putnicima i voznom
  124.     //osoblju zelimo ugodno putovanje.
  125.  
  126.     //U slučaju da se radi o polasku koji kasni primjer ispisa je:
  127.     //Brzi voz broj 256, odrediste Dubrovnik, sa predvidjenim vremenom polaska u 6:20, kasni oko
  128.     //35 minuta. Voz ce krenuti sa perona 2 u 6:55. Izvinjavamo se putnicima zbog eventualnih neugodnosti.
  129.     void Info()const{
  130.         if(_vrstaVoza) cout << "Brzi ";
  131.         else cout << "Lokalni ";
  132.         if(Kasni()) {
  133.             cout << " voz broj " << _brojVoza << ", odrediste " << _odrediste
  134.                 << ", sa predvidjenim vremenom polaska u "; _polazak.Info(false);
  135.             cout << ", kasni oko " << _kasnjenje << " minuta. Voz ce krenuti sa perona "
  136.                 << _brojPerona << " u "; getOcekivanoVrijemePolaska().Info(false);
  137.             cout << ".\nIzvinjavamo se putnicima zbog eventualnih neugodnosti." << endl;
  138.         }
  139.         else {
  140.             cout << " voz broj " << _brojVoza << ", odrediste " << _odrediste <<
  141.                 ", polazi sa perona " << _brojPerona << " u "; _polazak.Info(false);
  142.             cout << ".\nPutnicima i voznom osoblju zelimo ugodno putovanje." << endl;
  143.         }
  144.     }
  145.  
  146.     //Funkcija Uporedi vraća logičku vrijednost “true” ukoliko polazak zadan objektom koji poziva funkciju nastupa prije
  147.     //polaska zadanog drugim argumentom, u suprotnom vraća “false”.
  148.     //Prilikom upoređvanja uzima se u obzir i očekivano vrijeme kašnjenja, a ne samo planirano
  149.     //vrijeme polaska.
  150.     bool Uporedi(const Polazak& p2) {
  151.         if(getOcekivanoVrijemePolaska().CompareTo(p2.getOcekivanoVrijemePolaska()) == -1)
  152.             return true;
  153.         return false;
  154.     }
  155.     //Povećava kašnjenje za vrijednost zadanu parametrom min.
  156.     void UvecajKasnjenje(int min) {
  157.         _kasnjenje += min;
  158.     }
  159. };
  160.  
  161. class RedVoznje{
  162.     int brojPolazaka;
  163.     Polazak polasci[100];
  164. public:
  165.     //Potrebne konstruktor funkcije
  166.     RedVoznje() {
  167.         brojPolazaka = 0;
  168.     }
  169.  
  170.     //Funkcija geter za broj polazaka
  171.     int getBrojPolazaka()const { return brojPolazaka; }
  172.  
  173.     //Funkcija za dodavanje novog polaska u red vožnje.
  174.     //Prilikom dodavanja provjerava se da voz već nije zauzet u tom vremenu.
  175.     void AddPolazak(Polazak p) {
  176.         if(brojPolazaka > 100)
  177.             return;
  178.         for(int i = 0; i < brojPolazaka; i++)
  179.             if(p.getBrojVoza() == polasci[i].getBrojVoza() && p.getPolazak().CompareTo(polasci[i].getPolazak()) == 0)
  180.                 return;
  181.         polasci[brojPolazaka] = p;
  182.         brojPolazaka++;
  183.     }
  184.  
  185.     //Funkcija uklanja sve polaske određenog voza.
  186.     void RemovePolaske(int brojVoza) {
  187.         for(int i = 0; i < brojPolazaka; i++)
  188.             if(polasci[i].getBrojVoza() == brojVoza) {
  189.                 polasci[i] = polasci[brojPolazaka - 1];
  190.                 brojPolazaka--;
  191.                 i--;
  192.             }
  193.     }
  194.  
  195.     //Funkcija dodaje kasnjenje odredjenom polasku
  196.     void AddKasnjenje(int polazak, int minute) {
  197.         polasci[polazak].UvecajKasnjenje(minute);
  198.     }
  199.     //Funkcija ispisuje samo polaske zadanog odredišta.
  200.     void Info(char * odrediste) {
  201.         for(int i = 0; i < brojPolazaka; i++)
  202.             if(strcmp(polasci[i].getOdrediste(), odrediste) == 0)
  203.                 polasci[i].Info();
  204.     }
  205.     //Funkcija pronalazi i ispisuje samo polaske koji kasne više od 30 minuta.
  206.     void IspisPolazakaKojiKasne() {
  207.         for(int i = 0; i < brojPolazaka; i++)
  208.             if(polasci[i].getKasnjenje() > 30)
  209.                 polasci[i].Info();
  210.     }
  211.     //Funkcija za ispis reda vožnje.
  212.     void IspisRedaVoznje() {
  213.         for(int i = 0; i < brojPolazaka; i++)
  214.                 polasci[i].Info();
  215.     }
  216. };
  217.  
  218. void main()
  219. {
  220.     // Testiranje svih dostupnih funkcionalnosti
  221.     RedVoznje redVoznje;
  222.     char odrediste[50];
  223.     int izbor, brojVoza, brojPerona, kasnjenje, sati, minute;
  224.     bool vrstaVoza;
  225.  
  226.     do {
  227.         cout << crtice << "\t::IZBORNIK::" << crtice;
  228.         cout << "1. Dodaj polazak" << endl;
  229.         cout << "2. Izbrisi polaske odredjenog voza" << endl;
  230.         cout << "3. Uvecaj kasnjenje" << endl;
  231.         cout << "4. Ispis reda voznje" << endl;
  232.         cout << "5. Ispis polazaka koji kasne vise od 30 min." << endl;
  233.         cout << "6. Ispis polazaka odredjenog odredista" << endl;
  234.         cout << "7. IZLAZ" <<endl;
  235.         cout << crtice << "Vas izbor: ";
  236.         cin >> izbor;
  237.         cin.ignore();
  238.  
  239.         switch(izbor) {
  240.         case 1:
  241.             system("cls");
  242.             {
  243.                 cout << crtice << "\t::UNOS NOVOG POLASKA::" << crtice;
  244.                 cout << "Unesite odrediste: ";
  245.                 cin.getline(odrediste, 50);
  246.                 cout << "Unesite broj voza: ";
  247.                 cin >> brojVoza;
  248.                 cout << "Unesite broj perona: ";
  249.                 cin >> brojPerona;
  250.                 cout << "Unesite vrstu voza (0 - lokalni, 1 - brzi): ";
  251.                 cin >> vrstaVoza;
  252.                 cout << "Vrijeme polaska (hh:mm): ";
  253.                 cin >> sati >> minute;
  254.                 Polazak unosPolaska(odrediste, brojVoza, brojPerona, vrstaVoza, sati, minute);
  255.                 redVoznje.AddPolazak(unosPolaska);
  256.             }
  257.             break;
  258.         case 2:
  259.             system("cls");
  260.             {
  261.                 cout << crtice << "\t::UKLANJANJE POLASKA::" << crtice;
  262.                 cout << "Unesite broj voza kojeg zelite ukloniti: ";
  263.                 cin >> brojVoza;
  264.                 redVoznje.RemovePolaske(brojVoza);
  265.             }
  266.             break;
  267.         case 3:
  268.             system("cls");
  269.             {
  270.                 cout << crtice << "\t::UVECAVANJE KASNJENJA::" << crtice;
  271.                 do {
  272.                 cout << "Unesite broj polaska kojem zelite povecati kasnjenje: ";
  273.                 cin >> izbor;
  274.                 izbor--;
  275.                 } while(izbor < 0 || izbor > redVoznje.getBrojPolazaka() - 1);
  276.                 cout << "Unesite kasnjenje (izrazeno u minutama): ";
  277.                 cin >> kasnjenje;
  278.                 redVoznje.AddKasnjenje(izbor, kasnjenje);
  279.             }
  280.             break;
  281.         case 4:
  282.             system("cls");
  283.             {
  284.             cout << crtice << "\t::ISPIS REDA VOZNJE::" << crtice;
  285.             redVoznje.IspisRedaVoznje();
  286.             }
  287.             break;
  288.         case 5:
  289.             system("cls");
  290.             {
  291.             cout << crtice << "\t::ISPIS POLAZAKA KOJI KASNE VISE OD 30 MIN.::" << crtice;
  292.             redVoznje.IspisPolazakaKojiKasne();
  293.             }
  294.             break;
  295.         case 6:
  296.             system("cls");
  297.             {
  298.             cout << crtice << "::ISPIS POLAZAKA ODREDJENOG ODREDISTA::" << crtice;
  299.             cout << "Unesite odrediste: ";
  300.             cin.getline(odrediste, 50);
  301.             cout << "\tISPISUJEM POLASKE ZA ODREDISTE '" << odrediste << "':" << endl;
  302.             redVoznje.Info(odrediste);
  303.             }
  304.             break;
  305.         case 7:
  306.             return;
  307.         default:
  308.             system("cls");
  309.             cout << "Takva opcija ne postoji!" << endl;
  310.         }
  311.     } while(1);
  312.     system("pause>0");
  313. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement