- #include <iostream>
- #include <string>
- #include <iomanip>
- #include <vector>
- using namespace std;
- class Polazak
- {
- string odrediste;
- int broj_voza,broj_perona,sat_polaska,minute_polaska,trajanje_voznje,kasnjenje;
- bool brzi_voz;
- public:
- Polazak(string odrediste, int broj_voza, int broj_perona,
- bool brzi_voz, int sat_polaska, int minute_polaska,
- int trajanje_voznje);
- void PostaviKasnjenje(int kasnjenje) {
- if (!cin||kasnjenje<0) throw "Neispravan unos kasnjenja";
- Polazak::kasnjenje=kasnjenje; }
- bool DaLiKasni() const {
- if(kasnjenje!=0)
- return true; return false; }
- int DajTrajanjeVoznje() const { return trajanje_voznje; }
- void OcekivanoVrijemePolaska(int &sati, int &minute) const;
- void OcekivanoVrijemeDolaska(int &sati, int &minute) const;
- void Ispisi() const;
- };
- class RedVoznje
- {
- Polazak **polasci;
- int max_v;
- int broj_polazaka;
- static bool raniji (const Polazak *u1, const Polazak *u2)
- {
- int a,b,c,d;
- u1->OcekivanoVrijemePolaska(a,b);
- u2->OcekivanoVrijemeDolaska(c,d);
- b+=a*60; d+=c*60;
- return b<d; }
- public:
- explicit RedVoznje (int max_broj_polazaka):max_v(max_broj_polazaka),
- broj_polazaka(0), polasci(new Polazak*[max_broj_polazaka]) {}
- ~RedVoznje();
- RedVoznje (const RedVoznje &red_voznje);
- RedVoznje &operator =(const RedVoznje &red_voznje);
- void RegistrirajPolazak(string odrediste, int broj_voza,bool brzi_voz, int broj_perona,
- int sat_polaska, int minute_polaska, int trajanje_voznje);
- void RedVoznje::RegistrirajPolazak (Polazak *polazak)
- { polasci[broj_polazaka++]=polazak; }
- int DajBrojPolazaka() const { return broj_polazaka; }
- int DajBrojPolazakaKojiKasne() const;
- int DajProsjecnoTrajanjeVoznji() const;
- Polazak &DajPrviPolazak() const {return *polasci[0];}
- Polazak &DajPosljednjiPolazak() const {return *polasci[broj_polazaka-1];}
- void IsprazniKolekciju();
- void Ispisi(int sati, int minute) const;
- void SortirajPolaske() {sort(polasci,polasci+broj_polazaka, raniji);}
- };
- Polazak::Polazak(string odrediste, int broj_voza,int broj_perona, bool brzi_voz,
- int sat_polaska, int minute_polaska, int trajanje_voznje) :kasnjenje(0)
- {
- if (broj_perona>6||broj_perona<1||sat_polaska<0||sat_polaska>23||minute_polaska<0||minute_polaska>59||trajanje_voznje<1||kasnjenje<0 || broj_voza>99999)
- throw "Neispravno uneseni podaci!";
- Polazak::odrediste=odrediste;
- Polazak::broj_voza=broj_voza;
- Polazak::brzi_voz=brzi_voz;
- Polazak::broj_perona=broj_perona;
- Polazak::sat_polaska=sat_polaska;
- Polazak::minute_polaska=minute_polaska;
- Polazak::trajanje_voznje=trajanje_voznje;
- Polazak::kasnjenje=kasnjenje;
- }
- void Polazak::OcekivanoVrijemePolaska(int &sati, int &minute) const
- {
- minute=minute+sati*60+kasnjenje;
- if(minute>60)
- {
- sati=minute/60;
- minute-=sati*60;
- }
- }
- void Polazak::OcekivanoVrijemeDolaska(int &sati, int &minute) const
- {
- minute=minute+sati*60+kasnjenje+trajanje_voznje;
- if(minute>60)
- {
- sati=minute/60;
- minute-=sati*60;
- }
- }
- RedVoznje::~RedVoznje()
- {
- for (int i(0);i<broj_polazaka;i++)
- delete polasci [i];
- delete [] polasci;
- }
- RedVoznje::RedVoznje(const RedVoznje &red_voznje)
- {
- broj_polazaka=red_voznje.broj_polazaka;
- for (int i(0);i<broj_polazaka;i++)
- polasci[i]=new Polazak(*red_voznje.polasci[i]);
- }
- RedVoznje &RedVoznje::operator =(const RedVoznje &red_voznje)
- {
- for (int i(0);i<broj_polazaka;i++)
- delete polasci [i];
- broj_polazaka=red_voznje.broj_polazaka;
- for (int i(0);i<broj_polazaka;i++)
- polasci[i]=new Polazak(*red_voznje.polasci[i]);
- }
- void RedVoznje::RegistrirajPolazak(string odrediste,int broj_voza,bool brzi_voz,
- int broj_perona, int sat_polaska, int minute_polaska,int trajanje_voznje)
- {
- int kasnjenje;
- cout<<"\nUnesite kasnjenje: ";
- cin>>kasnjenje;
- while((!cin)||kasnjenje<0)
- {
- cout<<"Pogresan unos kasnjenja, unesite ponovo:";
- cin.clear();
- cin.ignore(10000,'\n');
- cin>>kasnjenje;
- }
- Polazak *x=new Polazak (odrediste,broj_voza,brzi_voz,broj_perona,sat_polaska,minute_polaska,trajanje_voznje);
- x->PostaviKasnjenje(kasnjenje);
- RegistrirajPolazak(x);
- }
- int RedVoznje::DajBrojPolazakaKojiKasne() const
- {
- int a(0);
- for (int i(0);i<broj_polazaka;i++)
- {
- if (polasci[i]->DaLiKasni()==true) a++;
- }
- return a;
- }
- int RedVoznje::DajProsjecnoTrajanjeVoznji() const
- {
- int x(0);
- for (int i(0);i<broj_polazaka;i++)
- {
- int a,b,c,d,e;
- polasci[i]->OcekivanoVrijemePolaska(a,b);
- polasci[i]->OcekivanoVrijemeDolaska(c,d);
- b=b+a*60; d=d+c*60;
- e=d-a;
- x+=e;
- }
- return x/broj_polazaka;
- }
- void RedVoznje::IsprazniKolekciju()
- {
- for (int i(0);i<broj_polazaka;i++)
- delete polasci [i];
- broj_polazaka=0;
- }
- void RedVoznje::Ispisi(int sati, int minute) const
- {
- int brojac(0);
- for (int i(0);i<broj_polazaka;i++)
- {
- int a(0),b(0);
- polasci[i]->OcekivanoVrijemePolaska(a,b);
- if(sati<a || (sati==a && minute<b))
- {
- polasci[i]->Ispisi();
- brojac++;
- }
- }
- if(brojac==0)
- cout<<"Nema planiranih voznji nakon vremena koje ste unijeli."<<endl;
- }
- void Polazak::Ispisi() const
- {
- if(!brzi_voz)
- cout<<" Lokalni voz broj ";
- else
- cout<<"Brzi voz broj ";
- cout<<broj_voza<<", odrediste "<<odrediste;
- if(kasnjenje!=0)
- {
- int a,b;
- this->OcekivanoVrijemeDolaska(a,b);
- cout<<" polazi sa perona "<<broj_perona<< " u "<<sat_polaska<<":"<<minute_polaska
- <<" a na odrediste stize u "<<a<<":"<<b<<". Putnicima i voznom osoblju želimo ugodno putovanje.\n";
- }
- else
- {
- int a,b,c,d;
- this->OcekivanoVrijemePolaska(a,b);
- this->OcekivanoVrijemeDolaska(c,d);
- cout<<" sa predvidjenim vremenom polaska u "<<sat_polaska<<":"<<minute_polaska
- <<", kasni oko "<<kasnjenje<<" minuta, te ce proci oko "<<a<<":"<<b
- <<"Ocekuje se da voz stigne na odrediste oko "<<c<<":"<<d
- <<"Izvinjavamo se putnicima zbog eventulanih neugodnosti.\n";
- }
- }
- int main()
- {
- int max,broj;
- cout<<"Unesite maximalan broj polazaka za jedan dan: ";
- cin>>max;
- while((!cin)||max<1)
- {
- cout<<"Maximalan broj polazaka nije unesen ispravno,unesite ponovo: ";
- cin.clear();
- cin.ignore(10000, '\n');
- cin>>broj;
- }
- cout<<"Unesite broj polazaka za danasnji dan: ";
- cin>>broj;
- while((!cin)||broj<1)
- {
- cout<<"Broj polazaka nije unesen ispravno,unesite ponovo: ";
- cin.clear();
- cin.ignore(10000, '\n');
- cin>>broj;
- }
- while (broj>max)
- {
- cout<<"Broj polazaka prelazi maximum,unesite ponovo: ";
- cin.clear();
- cin.ignore(10000, '\n');
- cin>>broj;
- }
- RedVoznje x(broj);
- string odrediste;
- bool voz;
- int broj_voza,brzi,broj_perona,sat_polaska,minute_polaska,trajanje_voznje;
- for (int i(1);i<=broj;i++)
- {
- bool moze(true);
- while (moze)
- {
- cout<<"\nUnesite podatke za "<<i<<". polazak: "<<endl<<endl;
- cout<<"\nUnesite broj voza: ";
- cin>>broj_voza;
- cout<<"\nUnesite odrediste: ";
- cin>>odrediste;
- cout<<"\nUnesite broj perona: ";
- cin>>broj_perona;
- cout<<"\nUnesite sat i minute polaska: ";
- cin>>sat_polaska>>minute_polaska;
- cout<<"\nUnesite trajanje voznje: ";
- cin>>trajanje_voznje;
- cout<<"Da li je voz brzi? ( 1-DA , 0-NE)";
- cin>>brzi;
- while(brzi!=1 && brzi!=0)
- {
- cout<<"Netacan unos tipa voza, ponovite.";
- cin>>brzi;
- if(brzi==1)
- voz=true;
- else if(brzi==0)
- voz=false;
- }
- try
- {
- x.RegistrirajPolazak(odrediste,broj_voza,voz,broj_perona,sat_polaska,minute_polaska,trajanje_voznje);
- moze=false;
- }
- catch(const char e[])
- {
- cout<<e<<", Unesite ponovo:"<<endl;
- cin.clear();
- cin.ignore(10000,'\n');
- }
- }
- }
- int sat(0),minut(0);
- cout<<"Unesi referentno vrijeme za sortiranje u satima i minutama:";
- cin>>sat>>minut;
- x.SortirajPolaske();
- cout<<"Pocev od unesenog vremena, planirane su sledece voznje:";
- x.Ispisi(sat,minut);
- cout<<"\n\n\tUkupan broj polazaka za danasnji dan je: "<<x.DajBrojPolazaka()<<endl;
- cout<<"\n\tProsjecno trajanje svih voznji je: "<<x.DajProsjecnoTrajanjeVoznji ()<<" minuta"<<endl;
- cout<<"\n\tUkupan broj polazaka koji kasne je: "<<x.DajBrojPolazakaKojiKasne()<<endl;
- cout<<"\n\tPrvi polazak:"<<endl; x.DajPrviPolazak().Ispisi();
- cout<<"\n\tZadnji polazak:"<<endl; x.DajPosljednjiPolazak().Ispisi();
- RedVoznje a(broj),b(broj);
- a=x;
- b=a;
- x.IsprazniKolekciju();
- return 0;
- }