Advertisement
limun11

Studenti_Izostanci-END

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