Advertisement
EnsarMeskovic

[PRII] StudentiIzostanci - sortBinarnaPretragaNajveci

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