Advertisement
Guest User

abc

a guest
Jan 19th, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.23 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. using namespace std;
  5.  
  6. char * crt = "\n----------------------------------------------------\n";
  7. struct Datum {
  8.     int * _dan, *_mjesec, *_godina;
  9.     void Unos(int d, int m, int g) {
  10.         _dan = new int(d);
  11.         _mjesec = new int(m);
  12.         _godina = new int(g);
  13.     }
  14.     void Ispis() { cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl; }
  15.     void Dealociraj() {
  16.         delete _dan; delete _mjesec; delete _godina;
  17.         _dan = _mjesec = _godina = nullptr;
  18.     }
  19.     bool DaLiSuIsti(Datum * d)
  20.     {
  21.         return *d->_dan == *_dan && *d->_mjesec == *_mjesec && *d->_godina == *_godina;
  22.     }
  23.     int sumaDana()
  24.     {
  25.         int brDana[] = { 31,28,31,30,31,30,31,30,30,31,30,31 };
  26.         int s = 0;
  27.         for (int i = 0; i < *_godina; i++)
  28.         {
  29.             if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
  30.                 s += 366;
  31.             else
  32.                 s += 365;
  33.         }
  34.         for (int i = 1; i < *_mjesec; i++)
  35.         {
  36.             if (((*_godina % 4 == 0 && *_godina % 100 != 0) || *_godina % 400 == 0) && i == 2)
  37.                 s += 29;
  38.             else
  39.                 s += brDana[i - 1];
  40.         }
  41.         return s;
  42.     }
  43. };
  44. struct Izostanak {
  45.     char * _razlogIzostanka;
  46.     Datum _datumIzostanka;
  47.     int _brojSati;
  48.     bool _opravdano;//pravdanje zahtijeva da se evidentira i razlog izostanka  
  49.     void Unos(Datum datumIzostanka, int brojSati) {
  50.         _datumIzostanka.Unos(*datumIzostanka._dan, *datumIzostanka._mjesec, *datumIzostanka._godina);
  51.         _brojSati = brojSati;
  52.         _opravdano = false;
  53.         _razlogIzostanka = new char;
  54.         _razlogIzostanka[0] = '\0';
  55.     }
  56.     void Dealociraj() { delete[]_razlogIzostanka; _razlogIzostanka = nullptr; }
  57.     void Ispis() { _datumIzostanka.Ispis(); cout << _brojSati << " " << _razlogIzostanka; }
  58.     void Opravdaj(char * razlogIzostanka) {
  59.         if (_razlogIzostanka != nullptr)
  60.             delete _razlogIzostanka;
  61.         int vel = strlen(razlogIzostanka) + 1;
  62.         _razlogIzostanka = new char[vel];
  63.         strcpy_s(_razlogIzostanka, vel, razlogIzostanka);
  64.         _opravdano = true;
  65.         _brojSati = 0;
  66.     }
  67. };
  68. struct Student {
  69.     //format broja indeksa: IB150051
  70.     //osigurati automatsko generisanje broja indeksa pocevsi od IB150001
  71.     char _brojIndeksa[9];
  72.     char * _imePrezime;
  73.     Izostanak * _izostanci;
  74.     int _brojIzostanaka;
  75.     //Potpisi funkcija trebaju odgovarati onima u main-u
  76.     //1. Unos
  77.     //2. Dealociraj
  78.     /*3. DodajIzostanak - dodaje novi izostanak u listu izostanaka. Onemoguciti ponavljanje izostanaka na
  79.     nacin da se uvecava samo broj sati ukoliko
  80.     korisnik (profesor) vise puta pokusa dodati izostanak na isti dan.*/
  81.     //4. Ispis - ispisuje izostanke u formatu prikazanom na slici (nije obavezno da ispis bude identican,
  82.     //ali je svakako pozeljno). Prilikom svakog ispisa, izostanke je potrebno spasiti u tekstualni fajl sa
  83.     //istim nazivom kao i broj indeksa.
  84.     //5. BinarnaPretraga - koristeci binarnu pretragu, na osnovu datuma, pronalazi i vraca pokazivac na
  85.     //izostanak. Ukoliko trazeni izostanak ne postoji funkcija vraca nullptr.
  86.     void Unos(char * i, char * ip)
  87.     {
  88.         strcpy_s(_brojIndeksa, strlen(i) + 1, i);
  89.         _imePrezime = new char[strlen(ip) + 1];
  90.         strcpy_s(_imePrezime, strlen(ip) + 1, ip);
  91.         _brojIzostanaka = 0;
  92.     }
  93.     void DodajIzostanak(Izostanak novi)
  94.     {
  95.         for (int i = 0; i < _brojIzostanaka; i++)
  96.         {
  97.             if (_izostanci[i]._datumIzostanka.DaLiSuIsti(&novi._datumIzostanka))
  98.             {
  99.                 _izostanci[i]._brojSati += novi._brojSati;
  100.                 return;
  101.             }
  102.         }
  103.  
  104.         if (_brojIzostanaka == 0)
  105.         {
  106.             _izostanci = new Izostanak(novi);
  107.             _brojIzostanaka++;
  108.         }
  109.         if (_brojIzostanaka > 0)
  110.         {
  111.             Izostanak * pom = new Izostanak[_brojIzostanaka + 1];
  112.             for (int i = 0; i < _brojIzostanaka; i++)
  113.             {
  114.                 pom[i] = _izostanci[i];
  115.  
  116.             }
  117.             pom[_brojIzostanaka].Unos(novi._datumIzostanka, novi._brojSati);
  118.             _brojIzostanaka++;
  119.             delete[] _izostanci;
  120.             _izostanci = nullptr;
  121.             _izostanci = new Izostanak[_brojIzostanaka];
  122.             for (int i = 0; i < _brojIzostanaka; i++)
  123.             {
  124.                 _izostanci[i] = pom[i];
  125.             }
  126.             delete[]pom;
  127.             pom = nullptr;
  128.         }
  129.     }
  130.     void Ispis()
  131.     {
  132.        
  133.         cout << crt << endl;
  134.         cout << "Ime i prezime --> " << _imePrezime << endl;
  135.         cout << "Broj indexa --> " << _brojIndeksa << endl;
  136.         cout << crt << endl;
  137.         for (int i = 0; i < _brojIzostanaka; i++)
  138.         {
  139.             _izostanci[i].Ispis();
  140.             cout << endl;
  141.         }
  142.         cout << crt << endl;
  143.  
  144.         char temp[30];
  145.         strcpy_s(temp, strlen(_brojIndeksa) + 1, _brojIndeksa);
  146.         strcat_s(temp, ".txt");
  147.  
  148.         char * Naziv = new char[strlen(temp) + 1];
  149.         strcpy_s(Naziv, strlen(temp) + 1, temp);
  150.  
  151.         ofstream Upis(Naziv);
  152.         if (!Upis.fail())
  153.         {
  154.             Upis << crt << endl;
  155.             Upis << "Ime i prezime --> " << _imePrezime << endl;
  156.             Upis << "Broj indeksa --> " << _brojIndeksa << endl;
  157.             Upis << crt << endl;
  158.             for (int i = 0; i < _brojIzostanaka; i++)
  159.             {
  160.                 Upis << *_izostanci[i]._datumIzostanka._dan << "/" << *_izostanci[i]._datumIzostanka._mjesec << "/" << *_izostanci[i]._datumIzostanka._godina;
  161.                 Upis << " " << _izostanci[i]._brojSati << " " << _izostanci[i]._razlogIzostanka << endl;
  162.             }
  163.             Upis << crt << endl;
  164.             Upis.close();
  165.         }
  166.         else
  167.             cout << "Poruka o grešci" << endl;
  168.     }
  169.     void Dealociraj()
  170.     {
  171.         delete[]_imePrezime;
  172.         _imePrezime = nullptr;
  173.         delete[]_izostanci;
  174.         _izostanci = nullptr;
  175.     }
  176.     void sortDatum()
  177.     {
  178.         int vel = _brojIzostanaka;
  179.         bool zamjena = false;;
  180.         do
  181.         {
  182.             zamjena = false;
  183.             for (int i = 0; i < vel-1; i++)
  184.             {
  185.                 if (_izostanci[i]._datumIzostanka.sumaDana() > _izostanci[i + 1]._datumIzostanka.sumaDana())
  186.                 {
  187.                     Izostanak temp;
  188.                     temp.Unos(_izostanci[i]._datumIzostanka, _izostanci[i]._brojSati);
  189.                     delete[i]_izostanci; _izostanci = new Izostanak;
  190.                     _izostanci[i].Unos(_izostanci[i + 1]._datumIzostanka, _izostanci[i+1]._brojSati);
  191.                     delete[i+1]_izostanci; _izostanci = new Izostanak;
  192.                     _izostanci[i + 1].Unos(temp._datumIzostanka, temp._brojSati);
  193.                     temp.Dealociraj();
  194.                     zamjena = true;
  195.                 }
  196.  
  197.             }
  198.             vel--;
  199.         } while (vel > 1 && zamjena == true);
  200.  
  201.     }
  202.     Izostanak * BinarnaPretraga(Datum trazeni)
  203.     {
  204.         sortDatum();
  205.         int prvi=0, zadnji = _brojIzostanaka - 1, srednji;
  206.         while (prvi<=zadnji)
  207.         {
  208.             srednji = (prvi + zadnji) / 2;
  209.             if (trazeni.sumaDana() < _izostanci[srednji]._datumIzostanka.sumaDana())
  210.                 zadnji = srednji - 1;
  211.             if (trazeni.sumaDana() > _izostanci[srednji]._datumIzostanka.sumaDana())
  212.                 prvi = srednji + 1;
  213.             if (trazeni.sumaDana() == _izostanci[srednji]._datumIzostanka.sumaDana())
  214.                 return &_izostanci[srednji];
  215.  
  216.         }
  217.  
  218.         return nullptr;
  219.     }
  220. };
  221. //1. PronadjiNajveciNeopravdaniIzostanak - rekurzivna funkcija koja vraca pokazivac na neopravdani
  222. //izostanak koji ima najveci broj sati
  223. //2. GenerisiSljedeciBrojIndeksa - generise i vraca naredni broj indeksa
  224. Izostanak * PronadjiNajveciNeopravdaniIzostanak(Student d, int bi, int s, int p)
  225. {
  226.     if (bi < 0)
  227.         return &d._izostanci[p];
  228.     if (d._izostanci[bi]._brojSati > s)
  229.     {
  230.         s = d._izostanci[bi]._brojSati;
  231.         p = bi;
  232.     }
  233.     return PronadjiNajveciNeopravdaniIzostanak(d, bi - 1, s, p);
  234.  
  235. }
  236. int i = 150001;
  237. char * GenerisiSljedeciBrojIndeksa()
  238. {
  239.     char * brojindexa = new char[9];
  240.     char t[7];
  241.     strcpy_s(brojindexa, strlen("IB") + 1, "IB");
  242.     _itoa_s(i, t, 10);
  243.     strcat_s(brojindexa, 9, t);
  244.     return brojindexa;
  245.     i++;
  246. }
  247. void main() {
  248.     Datum jucer, prije5Dana, prije10Dana;
  249.     jucer.Unos(12, 6, 2016);
  250.     prije5Dana.Unos(8, 6, 2016);
  251.     prije10Dana.Unos(3, 6, 2016);
  252.  
  253.     Student denis;
  254.     denis.Unos(GenerisiSljedeciBrojIndeksa(), "Denis Music");
  255.  
  256.     Izostanak izostanakJucer, izostanakPrije5Dana, izostanakPrije10Dana;
  257.  
  258.     izostanakJucer.Unos(jucer, 5);
  259.     denis.DodajIzostanak(izostanakJucer);
  260.  
  261.     izostanakPrije5Dana.Unos(prije5Dana, 3);
  262.     izostanakPrije5Dana.Opravdaj("Odsutan zbog bolesti - gripa");
  263.     denis.DodajIzostanak(izostanakPrije5Dana);
  264.     izostanakPrije5Dana.Unos(prije5Dana, 8);
  265.     denis.DodajIzostanak(izostanakPrije5Dana);
  266.  
  267.     izostanakPrije10Dana.Unos(prije10Dana, 1);
  268.     denis.DodajIzostanak(izostanakPrije10Dana);
  269.     izostanakPrije10Dana.Unos(prije10Dana, 6);
  270.     denis.DodajIzostanak(izostanakPrije10Dana);
  271.  
  272.  
  273.     denis.Ispis();
  274.     Izostanak * p = denis.BinarnaPretraga(prije5Dana);
  275.     cout << "Binarnom pretragom pronadjen izostanak -> ";
  276.     p->Ispis();
  277.     cout << endl;
  278.     //denis.Ispis();
  279.     Izostanak * p2 = PronadjiNajveciNeopravdaniIzostanak(denis, denis._brojIzostanaka - 1, 0, 0);
  280.     cout << "Rekurzivno pronadjen najveci neopravdani izostanak -> ";
  281.     p2->Ispis();
  282.     cout << endl;
  283.     //dealocirati zauzetu memoriju
  284.     denis.Dealociraj();
  285. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement