limun11

GOTOVO::Studenti_Izostanci

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