Advertisement
limun11

Studenti_izostanci KONACNA

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