Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 24th, 2012  |  syntax: None  |  size: 9.36 KB  |  hits: 12  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #include <iostream>
  2. #include <string>
  3. #include <iomanip>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. class Polazak
  9. {
  10.     string odrediste;
  11.     int broj_voza,broj_perona,sat_polaska,minute_polaska,trajanje_voznje,kasnjenje;
  12.     bool brzi_voz;
  13.     public:
  14.     Polazak(string odrediste, int broj_voza, int broj_perona,
  15.     bool brzi_voz, int sat_polaska, int minute_polaska,
  16.     int trajanje_voznje);
  17.     void PostaviKasnjenje(int kasnjenje) {
  18.     if (!cin||kasnjenje<0) throw "Neispravan unos kasnjenja";
  19.     Polazak::kasnjenje=kasnjenje; }
  20.     bool DaLiKasni() const {
  21.         if(kasnjenje!=0)
  22.         return true; return false; }
  23.     int DajTrajanjeVoznje() const { return trajanje_voznje; }
  24.     void OcekivanoVrijemePolaska(int &sati, int &minute) const;
  25.     void OcekivanoVrijemeDolaska(int &sati, int &minute) const;
  26.     void Ispisi() const;
  27.  
  28. };
  29.  
  30.  
  31.  
  32. class RedVoznje
  33. {
  34.     Polazak **polasci;
  35.     int max_v;
  36.     int broj_polazaka;
  37.     static bool raniji (const Polazak *u1, const Polazak *u2)
  38.     {
  39.         int a,b,c,d;
  40.         u1->OcekivanoVrijemePolaska(a,b);
  41.         u2->OcekivanoVrijemeDolaska(c,d);
  42.         b+=a*60; d+=c*60;
  43.         return b<d; }
  44.  
  45.     public:
  46.     explicit RedVoznje (int max_broj_polazaka):max_v(max_broj_polazaka),
  47.     broj_polazaka(0), polasci(new Polazak*[max_broj_polazaka]) {}
  48.     ~RedVoznje();
  49.     RedVoznje (const RedVoznje &red_voznje);
  50.     RedVoznje &operator =(const RedVoznje &red_voznje);
  51.     void RegistrirajPolazak(string odrediste, int broj_voza,bool brzi_voz, int broj_perona,
  52.     int sat_polaska, int minute_polaska, int trajanje_voznje);
  53.     void RedVoznje::RegistrirajPolazak (Polazak *polazak)
  54.     { polasci[broj_polazaka++]=polazak; }
  55.     int DajBrojPolazaka() const { return broj_polazaka; }
  56.     int DajBrojPolazakaKojiKasne() const;
  57.     int DajProsjecnoTrajanjeVoznji() const;
  58.     Polazak &DajPrviPolazak() const {return *polasci[0];}
  59.     Polazak &DajPosljednjiPolazak() const {return *polasci[broj_polazaka-1];}
  60.     void IsprazniKolekciju();
  61.     void Ispisi(int sati, int minute) const;
  62.     void SortirajPolaske() {sort(polasci,polasci+broj_polazaka, raniji);}
  63.  
  64. };
  65.  
  66.  
  67. Polazak::Polazak(string odrediste, int broj_voza,int broj_perona, bool brzi_voz,
  68. int sat_polaska, int minute_polaska, int trajanje_voznje) :kasnjenje(0)
  69. {
  70.     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)
  71.     throw "Neispravno uneseni podaci!";
  72.     Polazak::odrediste=odrediste;
  73.     Polazak::broj_voza=broj_voza;
  74.     Polazak::brzi_voz=brzi_voz;
  75.     Polazak::broj_perona=broj_perona;
  76.     Polazak::sat_polaska=sat_polaska;
  77.     Polazak::minute_polaska=minute_polaska;
  78.     Polazak::trajanje_voznje=trajanje_voznje;
  79.     Polazak::kasnjenje=kasnjenje;
  80. }
  81.  
  82.  
  83. void Polazak::OcekivanoVrijemePolaska(int &sati, int &minute) const
  84. {
  85.     minute=minute+sati*60+kasnjenje;
  86.     if(minute>60)
  87.     {
  88.         sati=minute/60;
  89.         minute-=sati*60;
  90.     }
  91. }
  92.  
  93. void Polazak::OcekivanoVrijemeDolaska(int &sati, int &minute) const
  94. {
  95.    minute=minute+sati*60+kasnjenje+trajanje_voznje;
  96.    if(minute>60)
  97.    {
  98.        sati=minute/60;
  99.        minute-=sati*60;
  100.    }
  101. }
  102.  
  103.  
  104.  
  105. RedVoznje::~RedVoznje()
  106.     {
  107.     for (int i(0);i<broj_polazaka;i++)
  108.     delete polasci [i];
  109.     delete [] polasci;
  110.     }
  111.  
  112. RedVoznje::RedVoznje(const RedVoznje &red_voznje)
  113. {
  114.     broj_polazaka=red_voznje.broj_polazaka;
  115.     for (int i(0);i<broj_polazaka;i++)
  116.     polasci[i]=new Polazak(*red_voznje.polasci[i]);
  117. }
  118.  
  119.  
  120.  RedVoznje &RedVoznje::operator =(const RedVoznje &red_voznje)
  121. {
  122.     for (int i(0);i<broj_polazaka;i++)
  123.     delete polasci [i];
  124.     broj_polazaka=red_voznje.broj_polazaka;
  125.     for (int i(0);i<broj_polazaka;i++)
  126.     polasci[i]=new Polazak(*red_voznje.polasci[i]);
  127. }
  128.  
  129.  
  130. void RedVoznje::RegistrirajPolazak(string odrediste,int broj_voza,bool brzi_voz,
  131.     int broj_perona, int sat_polaska, int minute_polaska,int trajanje_voznje)
  132.     {
  133.         int kasnjenje;
  134.         cout<<"\nUnesite kasnjenje: ";
  135.         cin>>kasnjenje;
  136.         while((!cin)||kasnjenje<0)
  137.         {
  138.             cout<<"Pogresan unos kasnjenja, unesite ponovo:";
  139.             cin.clear();
  140.             cin.ignore(10000,'\n');
  141.             cin>>kasnjenje;
  142.         }
  143.         Polazak *x=new Polazak (odrediste,broj_voza,brzi_voz,broj_perona,sat_polaska,minute_polaska,trajanje_voznje);
  144.         x->PostaviKasnjenje(kasnjenje);
  145.         RegistrirajPolazak(x);
  146.     }
  147.  
  148. int RedVoznje::DajBrojPolazakaKojiKasne() const
  149. {
  150.     int a(0);
  151.     for (int i(0);i<broj_polazaka;i++)
  152.     {
  153.         if (polasci[i]->DaLiKasni()==true) a++;
  154.     }
  155.     return a;
  156. }
  157.  
  158. int RedVoznje::DajProsjecnoTrajanjeVoznji() const
  159. {
  160.     int x(0);
  161.     for (int i(0);i<broj_polazaka;i++)
  162.     {
  163.         int a,b,c,d,e;
  164.         polasci[i]->OcekivanoVrijemePolaska(a,b);
  165.         polasci[i]->OcekivanoVrijemeDolaska(c,d);
  166.         b=b+a*60; d=d+c*60;
  167.         e=d-a;
  168.         x+=e;
  169.     }
  170.     return x/broj_polazaka;
  171. }
  172.  
  173.     void RedVoznje::IsprazniKolekciju()
  174.     {
  175.         for (int i(0);i<broj_polazaka;i++)
  176.         delete polasci [i];
  177.         broj_polazaka=0;
  178.     }
  179.  
  180.  
  181. void RedVoznje::Ispisi(int sati, int minute) const
  182. {
  183.     int brojac(0);
  184.      for (int i(0);i<broj_polazaka;i++)
  185.      {
  186.         int a(0),b(0);
  187.         polasci[i]->OcekivanoVrijemePolaska(a,b);
  188.         if(sati<a || (sati==a && minute<b))
  189.         {
  190.             polasci[i]->Ispisi();
  191.             brojac++;
  192.         }
  193.     }
  194.     if(brojac==0)
  195.     cout<<"Nema planiranih voznji nakon vremena koje ste unijeli."<<endl;
  196. }
  197.  
  198.  
  199. void Polazak::Ispisi() const
  200. {
  201.  
  202.     if(!brzi_voz)
  203.     cout<<" Lokalni voz broj ";
  204.     else
  205.     cout<<"Brzi voz broj ";
  206.     cout<<broj_voza<<", odrediste "<<odrediste;
  207.     if(kasnjenje!=0)
  208.     {
  209.         int a,b;
  210.         this->OcekivanoVrijemeDolaska(a,b);
  211.         cout<<" polazi sa perona "<<broj_perona<< " u "<<sat_polaska<<":"<<minute_polaska
  212.         <<" a na odrediste stize u "<<a<<":"<<b<<". Putnicima i voznom osoblju želimo ugodno putovanje.\n";
  213.     }
  214.     else
  215.     {
  216.         int a,b,c,d;
  217.         this->OcekivanoVrijemePolaska(a,b);
  218.         this->OcekivanoVrijemeDolaska(c,d);
  219.         cout<<" sa predvidjenim vremenom polaska u "<<sat_polaska<<":"<<minute_polaska
  220.         <<", kasni oko "<<kasnjenje<<" minuta, te ce proci oko "<<a<<":"<<b
  221.         <<"Ocekuje se da voz stigne na odrediste oko "<<c<<":"<<d
  222.         <<"Izvinjavamo se putnicima zbog eventulanih neugodnosti.\n";
  223.     }
  224. }
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231. int main()
  232. {
  233.     int max,broj;
  234.     cout<<"Unesite maximalan broj polazaka za jedan dan: ";
  235.     cin>>max;
  236.     while((!cin)||max<1)
  237.     {
  238.         cout<<"Maximalan broj polazaka nije unesen ispravno,unesite ponovo: ";
  239.         cin.clear();
  240.         cin.ignore(10000, '\n');
  241.         cin>>broj;
  242.     }
  243.     cout<<"Unesite broj polazaka za danasnji dan: ";
  244.     cin>>broj;
  245.     while((!cin)||broj<1)
  246.     {
  247.         cout<<"Broj polazaka nije unesen ispravno,unesite ponovo: ";
  248.         cin.clear();
  249.         cin.ignore(10000, '\n');
  250.         cin>>broj;
  251.     }
  252.     while (broj>max)
  253.     {
  254.         cout<<"Broj polazaka prelazi maximum,unesite ponovo: ";
  255.         cin.clear();
  256.         cin.ignore(10000, '\n');
  257.         cin>>broj;
  258.     }
  259.     RedVoznje x(broj);
  260.     string odrediste;
  261.     bool voz;
  262.     int broj_voza,brzi,broj_perona,sat_polaska,minute_polaska,trajanje_voznje;
  263.     for (int i(1);i<=broj;i++)
  264.     {
  265.         bool moze(true);
  266.         while (moze)
  267.         {
  268.             cout<<"\nUnesite podatke za "<<i<<". polazak: "<<endl<<endl;
  269.             cout<<"\nUnesite broj voza: ";
  270.             cin>>broj_voza;
  271.             cout<<"\nUnesite odrediste: ";
  272.             cin>>odrediste;
  273.             cout<<"\nUnesite broj perona: ";
  274.             cin>>broj_perona;
  275.             cout<<"\nUnesite sat i minute polaska: ";
  276.             cin>>sat_polaska>>minute_polaska;
  277.             cout<<"\nUnesite trajanje voznje: ";
  278.             cin>>trajanje_voznje;
  279.             cout<<"Da li je voz brzi? ( 1-DA , 0-NE)";
  280.             cin>>brzi;
  281.             while(brzi!=1 && brzi!=0)
  282.             {
  283.                 cout<<"Netacan unos tipa voza, ponovite.";
  284.                 cin>>brzi;
  285.                 if(brzi==1)
  286.                 voz=true;
  287.                 else if(brzi==0)
  288.                 voz=false;
  289.             }
  290.  
  291.  
  292.             try
  293.             {
  294.                 x.RegistrirajPolazak(odrediste,broj_voza,voz,broj_perona,sat_polaska,minute_polaska,trajanje_voznje);
  295.                 moze=false;
  296.             }
  297.             catch(const char e[])
  298.             {
  299.                 cout<<e<<", Unesite ponovo:"<<endl;
  300.                 cin.clear();
  301.                 cin.ignore(10000,'\n');
  302.             }
  303.         }
  304.     }
  305.     int sat(0),minut(0);
  306.     cout<<"Unesi referentno vrijeme za sortiranje u satima i minutama:";
  307.     cin>>sat>>minut;
  308.     x.SortirajPolaske();
  309.     cout<<"Pocev od unesenog vremena, planirane su sledece voznje:";
  310.     x.Ispisi(sat,minut);
  311.     cout<<"\n\n\tUkupan broj polazaka za danasnji dan je: "<<x.DajBrojPolazaka()<<endl;
  312.     cout<<"\n\tProsjecno trajanje svih voznji je: "<<x.DajProsjecnoTrajanjeVoznji ()<<" minuta"<<endl;
  313.     cout<<"\n\tUkupan broj polazaka koji kasne je: "<<x.DajBrojPolazakaKojiKasne()<<endl;
  314.     cout<<"\n\tPrvi polazak:"<<endl; x.DajPrviPolazak().Ispisi();
  315.     cout<<"\n\tZadnji polazak:"<<endl; x.DajPosljednjiPolazak().Ispisi();
  316.     RedVoznje a(broj),b(broj);
  317.     a=x;
  318.     b=a;
  319.     x.IsprazniKolekciju();
  320.     return 0;
  321. }