limun11

studenti_izostanci

Jun 24th, 2018
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.79 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. const char * crt = "\n----------------------------------------------------\n";
  6. struct Datum {
  7.     int * _dan, *_mjesec, *_godina;
  8.     void Unos(int d, int m, int g) {
  9.         _dan = new int(d);
  10.         _mjesec = new int(m);
  11.         _godina = new int(g);
  12.     }
  13.     void Ispis() { cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl; }
  14.     void Dealociraj() {
  15.         delete _dan; delete _mjesec; delete _godina;
  16.         _dan = _mjesec = _godina = nullptr;
  17.     }
  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.     if (*d1._mjesec > *d2._mjesec)
  27.         return true;
  28.     else if (*d2._mjesec > *d1._mjesec)
  29.         return false;
  30.     if (*d1._dan > *d2._dan)
  31.         return true;
  32.     else if (*d2._dan > *d1._dan)
  33.         return false;
  34.  
  35.     return false;
  36. }
  37. struct Izostanak {
  38.     char * _razlogIzostanka;
  39.     Datum _datumIzostanka;
  40.     int _brojSati;
  41.     bool _opravdano;//pravdanje zahtijeva da se evidentira i razlog izostanka  
  42.     void Unos(Datum datumIzostanka, int brojSati)
  43.     {
  44.         //_datumIzostanka.Unos(0, 0, 0);
  45.         _datumIzostanka.Unos(*datumIzostanka._dan, *datumIzostanka._mjesec, *datumIzostanka._godina);
  46.         _brojSati = brojSati;
  47.         _opravdano = false;
  48.         _razlogIzostanka = new char;
  49.         _razlogIzostanka[0] = '\0';
  50.     }
  51.     void Dealociraj() { delete[]_razlogIzostanka; _razlogIzostanka = nullptr; }
  52.  
  53.     void Ispis() { _datumIzostanka.Ispis(); cout << _razlogIzostanka << " " << _razlogIzostanka; }
  54.  
  55.     void Opravdaj(const char * razlogIzostanka)
  56.     {
  57.         if (_razlogIzostanka != nullptr)
  58.             delete _razlogIzostanka;
  59.         int vel = strlen(razlogIzostanka) + 1;
  60.         _razlogIzostanka = new char[vel];
  61.         strcpy_s(_razlogIzostanka, vel, razlogIzostanka);
  62.         _opravdano = true;
  63.     }
  64. };
  65. struct Student {
  66.    
  67.     char _brojIndeksa[9];
  68.     char * _imePrezime;
  69.     Izostanak * _izostanci;
  70.     int _brojIzostanaka;
  71.     //Potpisi funkcija trebaju odgovarati onima u main-u
  72.     //1. Unos
  73.     void Unos(const char * brojIndeksa, const char * imePrezime)
  74.     {
  75.         strcpy_s(_brojIndeksa, 9, brojIndeksa);
  76.  
  77.         int size = strlen(imePrezime) + 1;
  78.         _imePrezime = new char[size];
  79.         strcpy_s(_imePrezime, size, imePrezime);
  80.  
  81.         _izostanci = nullptr;
  82.  
  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;
  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.         //provjere
  100.         for (int i = 0; i < _brojIzostanaka; i++)
  101.         {
  102.             if (*_izostanci[i]._datumIzostanka._dan==*izostanak._datumIzostanka._dan)
  103.             {
  104.                 _izostanci[i]._brojSati += izostanak._brojSati;
  105.                 cout << "Izostanak: " << i << " vec dodan ranije. Uvecavam broj sati: " << _izostanci[i]._brojSati << endl;
  106.                 return;
  107.             }
  108.         }
  109.  
  110.         Izostanak * temp = new Izostanak[_brojIzostanaka + 1];
  111.         for (int i = 0; i < _brojIzostanaka; i++)
  112.         {
  113.             temp[i].Unos(_izostanci[i]._datumIzostanka, _izostanci[i]._brojSati);
  114.         }
  115.         temp[_brojIzostanaka].Unos(izostanak._datumIzostanka, izostanak._brojSati);
  116.         for (int i = 0; i < _brojIzostanaka; i++)
  117.         {
  118.             _izostanci[i].Dealociraj();
  119.         }
  120.         delete[] _izostanci;
  121.         _izostanci = temp;
  122.         _brojIzostanaka++;
  123.         cout << "Dodan izostanak: " <<_brojIzostanaka<< endl;
  124.         return;
  125.  
  126.     }
  127.     //4. Ispis - ispisuje izostanke u formatu prikazanom na slici (nije obavezno da ispis bude identican, ali je svakako pozeljno). Prilikom svakog ispisa,
  128.     //izostanke je potrebno spasiti u tekstualni fajl sa istim nazivom kao i broj indeksa.
  129.     void Ispis()
  130.     {
  131.         cout << "Broj indeksa: " << _brojIndeksa << endl;
  132.         cout << "Ime i prezime: " << _imePrezime << endl;
  133.         cout << crt;
  134.         cout << "Izostnaci:" << endl;
  135.         for (int i = 0; i < _brojIzostanaka; i++)
  136.         {
  137.             cout <<"\t"<< i + 1 << ": ";  _izostanci[i].Ispis();
  138.         }
  139.         cout << crt;
  140.  
  141.         char nazivFajla[20];
  142.         strcpy_s(nazivFajla, "IB140261");
  143.         strcat_s(nazivFajla, ".txt");
  144.         ofstream upis(nazivFajla);
  145.         upis << "Broj indeksa: " << _brojIndeksa << endl;
  146.         upis << "Ime i prezime: " << _imePrezime << endl;
  147.         upis << crt;
  148.         upis << "Izostnaci:" << endl;
  149.         for (int i = 0; i < _brojIzostanaka; i++)
  150.         {
  151.             upis << "\t" << i + 1 << ": ";  
  152.             upis << *_izostanci[i]._datumIzostanka._dan << "/" << *_izostanci[i]._datumIzostanka._mjesec << "/" << *_izostanci[i]._datumIzostanka._godina << endl;
  153.         }
  154.         upis << crt;
  155.         if (upis.fail())
  156.             cout << "Greska prilikom upisa u fajl: " << nazivFajla << endl;
  157.         else
  158.             cout << "Uspjeno upisano u fajl: " << nazivFajla << endl;
  159.     }
  160.     //5. BinarnaPretraga - koristeci binarnu pretragu, na osnovu datuma, pronalazi i vraca pokazivac na izostanak. Ukoliko trazeni izostanak ne postoji
  161.     //funkcija vraca nullptr.
  162.     void sortNiz()
  163.     {
  164.         int minI;
  165.         for (int i = 0; i < _brojIzostanaka; i++)
  166.         {
  167.             minI = i;
  168.             for (int j = i + 1; j < _brojIzostanaka; j++)
  169.             {
  170.                 if (veciDatum(_izostanci[j]._datumIzostanka, _izostanci[minI]._datumIzostanka))
  171.                     minI = j;
  172.             }
  173.             swap(_izostanci[minI]._datumIzostanka, _izostanci[i]._datumIzostanka);
  174.         }
  175.     }
  176.     Izostanak * BinarnaPretraga(Datum datum)
  177.     {
  178.         sortNiz();
  179.         int srednji;
  180.         int zadnji = _brojIzostanaka;
  181.         for (int i = 0; i < zadnji; i++)
  182.         {
  183.             srednji = (i + _brojIzostanaka) / 2;
  184.             if (veciDatum(_izostanci[srednji]._datumIzostanka, datum))
  185.             {
  186.                 i = -1;
  187.                 zadnji = srednji;
  188.             }
  189.             else if (veciDatum(_izostanci[srednji]._datumIzostanka, datum))
  190.             {
  191.                 i = srednji;
  192.             }
  193.             else
  194.             {
  195.                 return &_izostanci[srednji];
  196.             }
  197.         }
  198.         return nullptr;
  199.     }
  200. };
  201. //1. PronadjiNajveciNeopravdaniIzostanak - rekurzivna funkcija koja vraca pokazivac na neopravdani izostanak koji ima najveci broj sati
  202. Izostanak * PronadjiNajveciNeopravdaniIzostanak(/*potrebni parametri*/)
  203. {
  204.     Izostanak * temp = nullptr;
  205.     return temp;
  206. }
  207. //2. GenerisiSljedeciBrojIndeksa - generise i vraca naredni broj indeksa
  208. //format broja indeksa: IB150051
  209. //osigurati automatsko generisanje broja indeksa pocevsi od IB150001
  210. int BrojIndeksa = 150000;
  211. const char * GenerisiSljedeciBrojIndeksa()
  212. {
  213.     char * niz = new char[9];
  214.     strcpy_s(niz, strlen("IB150000") + 1, "IB150000");
  215.     int brojac = 0;
  216.  
  217.     int brojIndeksa = BrojIndeksa;
  218.     while (brojIndeksa > 0)
  219.     {
  220.         brojIndeksa = brojIndeksa / 10;
  221.         brojac++;
  222.     }
  223.     _itoa_s(BrojIndeksa, &niz[8 - brojac], strlen(niz) + 1, 10);
  224.  
  225.     BrojIndeksa++;
  226.     return niz;
  227. }
  228.  
  229. void main() {
  230.     Datum jucer, prije5Dana, prije10Dana;
  231.     jucer.Unos(12, 6, 2016);
  232.     prije5Dana.Unos(8, 6, 2016);
  233.     prije10Dana.Unos(3, 6, 2016);
  234.  
  235.     Student denis;
  236.     denis.Unos(GenerisiSljedeciBrojIndeksa(), "Denis Music");
  237.  
  238.     Izostanak izostanakJucer, izostanakPrije5Dana, izostanakPrije10Dana;
  239.  
  240.     izostanakJucer.Unos(jucer, 5);
  241.     denis.DodajIzostanak(izostanakJucer);
  242.  
  243.     izostanakPrije5Dana.Unos(prije5Dana, 3);
  244.     izostanakPrije5Dana.Opravdaj("Odsutan zbog bolesti - gripa");
  245.     denis.DodajIzostanak(izostanakPrije5Dana);
  246.     izostanakPrije5Dana.Unos(prije5Dana, 2);
  247.     denis.DodajIzostanak(izostanakPrije5Dana);
  248.  
  249.     izostanakPrije10Dana.Unos(prije10Dana, 1);
  250.     denis.DodajIzostanak(izostanakPrije10Dana);
  251.     izostanakPrije10Dana.Unos(prije10Dana, 1);
  252.     denis.DodajIzostanak(izostanakPrije10Dana);
  253.  
  254.     denis.Ispis();
  255.     Izostanak * p = denis.BinarnaPretraga(jucer);
  256.     cout << "Binarnom pretragom pronadjen izostanak -> ";
  257.     p->Ispis();
  258.     denis.Ispis();
  259.     Izostanak * p2 = PronadjiNajveciNeopravdaniIzostanak(/*potrebni parametri*/);
  260.     cout << "Rekurzivno pronadjen najveci neopravdani izostanak -> ";
  261.     //p2->Ispis();
  262.     cout << endl;
  263.     //dealocirati zauzetu memoriju
  264.     p->Dealociraj();
  265.     izostanakJucer.Dealociraj(); izostanakPrije5Dana.Dealociraj(); izostanakPrije10Dana.Dealociraj();
  266.     denis.Dealociraj();
  267.     system("PAUSE");
  268. }
Advertisement
Add Comment
Please, Sign In to add comment