limun11

Ponavlajnje

Feb 5th, 2017
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.56 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. 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. struct Izostanak {
  20.     char * _razlogIzostanka;
  21.     Datum _datumIzostanka;
  22.     int _brojSati;
  23.     bool _opravdano;//pravdanje zahtijeva da se evidentira i razlog izostanka
  24.     void Unos(Datum datumIzostanka, int brojSati) {
  25.         _datumIzostanka.Unos(*datumIzostanka._dan, *datumIzostanka._mjesec, *datumIzostanka._godina);
  26.         _brojSati = brojSati;
  27.         _opravdano = false;
  28.         _razlogIzostanka = new char;
  29.         _razlogIzostanka[0] = '\0';
  30.     }
  31.     void Dealociraj() { delete[]_razlogIzostanka; _razlogIzostanka = nullptr; }
  32.     void Ispis() { _datumIzostanka.Ispis(); cout << _razlogIzostanka << " " << _razlogIzostanka; }
  33.     void Opravdaj(char * razlogIzostanka) {
  34.         if (_razlogIzostanka != nullptr)
  35.             delete _razlogIzostanka;
  36.         int vel = strlen(razlogIzostanka) + 1;
  37.         _razlogIzostanka = new char[vel];
  38.         strcpy_s(_razlogIzostanka, vel, razlogIzostanka);
  39.         _opravdano = true;
  40.     }
  41. };
  42. struct Student {
  43.  
  44.     //format broja indeksa: IB150051
  45.     //osigurati automatsko generisanje broja indeksa pocevsi od IB150001
  46.     char _brojIndeksa[9];
  47.     char * _imePrezime;
  48.     Izostanak * _izostanci;
  49.     int _brojIzostanaka;
  50.     void Ispisitxt()
  51.     {
  52.         char NazivFajla[20];
  53.         strcpy(NazivFajla, _brojIndeksa);
  54.         strcat(NazivFajla, ".txt");
  55.  
  56.         ofstream Fajl(NazivFajla, ios::ate);
  57.  
  58.         Fajl << _brojIndeksa;
  59.         Fajl << _imePrezime;
  60.         Fajl << _brojIzostanaka;
  61.  
  62.         Fajl.close();
  63.  
  64.     }
  65.  
  66.     //Potpisi funkcija trebaju odgovarati onima u main-u
  67.     //1. Unos
  68.     //2. Dealociraj
  69.     /*3. DodajIzostanak - dodaje novi izostanak u listu izostanaka. Onemoguciti ponavljanje izostanaka na nacin da se uvecava samo broj sati ukoliko
  70.     korisnik (profesor) vise puta pokusa dodati izostanak na isti dan.*/
  71.     //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.
  72.     //5. BinarnaPretraga - koristeci binarnu pretragu, na osnovu datuma, pronalazi i vraca pokazivac na izostanak.
  73.     //Ukoliko trazeni izostanak ne postoji funkcija vraca nullptr.
  74.     Izostanak * BinarnaPretraga(Datum datum)
  75.     {
  76.         for (int i = 0; i < _brojIzostanaka; i++)
  77.         {
  78.             for (int j = 0; j < _brojIzostanaka; j++)
  79.             {
  80.                 if (_izostanci[j]._datumIzostanka._godina < _izostanci[j - 1]._datumIzostanka._godina)
  81.                     swap(_izostanci[j], _izostanci[j - 1]);
  82.                 else if (_izostanci[j]._datumIzostanka._godina == _izostanci[j - 1]._datumIzostanka._godina)
  83.                 {
  84.                     if (_izostanci[j]._datumIzostanka._mjesec < _izostanci[j - 1]._datumIzostanka._mjesec)
  85.                         swap(_izostanci[j], _izostanci[j - 1]);
  86.                     else if (_izostanci[j]._datumIzostanka._mjesec == _izostanci[j - 1]._datumIzostanka._mjesec)
  87.                         if (_izostanci[j]._datumIzostanka._dan < _izostanci[j - 1]._datumIzostanka._dan)
  88.                             swap(_izostanci[j], _izostanci[j - 1]);
  89.                 }
  90.             }
  91.         }
  92.  
  93.         int prvi = 0;
  94.         int srednji;
  95.         int zadnji = _brojIzostanaka - 1;
  96.         bool pronadjen = false;
  97.  
  98.         while ((pronadjen == false) && (prvi <= zadnji))
  99.         {
  100.             srednji = (prvi + zadnji) / 2;
  101.             if (_izostanci[srednji]._datumIzostanka._dan < datum._dan)
  102.                 zadnji = srednji - 1;
  103.             if (_izostanci[srednji]._datumIzostanka._dan > datum._dan)
  104.                 prvi = srednji + 1;
  105.             if (_izostanci[srednji]._datumIzostanka._dan == datum._dan)
  106.                 pronadjen = true;
  107.  
  108.             return &_izostanci[srednji];
  109.         }
  110.  
  111.     }
  112.  
  113.        
  114.  
  115.  
  116. };
  117. //1. PronadjiNajveciNeopravdaniIzostanak - rekurzivna funkcija koja vraca pokazivac na neopravdani izostanak koji ima najveci broj sati
  118. //2. GenerisiSljedeciBrojIndeksa - generise i vraca naredni broj indeksa
  119. int brojIndeksa = 1;
  120. char *GenerisiSljedeciBrojIndeksa()
  121. {
  122.     char * temp = new char[9];
  123.     strcpy_s(temp, strlen("IB150000"), "IB150000");
  124.     int BrojacDecimala = 0;
  125.  
  126.     int BrojIndeksa = brojIndeksa;
  127.  
  128.     while (BrojIndeksa > 0)
  129.     {
  130.         BrojIndeksa = BrojIndeksa / 10;
  131.         BrojacDecimala++;
  132.     }
  133.     _itoa_s(brojIndeksa, &temp[9 - BrojacDecimala], strlen(temp), 10);
  134.     brojIndeksa++;
  135.     return temp;
  136. }
  137.  
  138. void main() {
  139.     Datum jucer, prije5Dana, prije10Dana;
  140.     jucer.Unos(12, 6, 2016);
  141.     prije5Dana.Unos(8, 6, 2016);
  142.     prije10Dana.Unos(3, 6, 2016);
  143.  
  144.     Student denis;
  145.     denis.Unos(GenerisiSljedeciBrojIndeksa(), "Denis Music");
  146.  
  147.     Izostanak izostanakJucer, izostanakPrije5Dana, izostanakPrije10Dana;
  148.  
  149.     izostanakJucer.Unos(jucer, 5);
  150.     denis.DodajIzostanak(izostanakJucer);
  151.  
  152.     izostanakPrije5Dana.Unos(prije5Dana, 3);
  153.     izostanakPrije5Dana.Opravdaj("Odsutan zbog bolesti - gripa");
  154.     denis.DodajIzostanak(izostanakPrije5Dana);
  155.     izostanakPrije5Dana.Unos(prije5Dana, 2);
  156.     denis.DodajIzostanak(izostanakPrije5Dana);
  157.  
  158.     izostanakPrije10Dana.Unos(prije10Dana, 1);
  159.     denis.DodajIzostanak(izostanakPrije10Dana);
  160.     izostanakPrije10Dana.Unos(prije10Dana, 1);
  161.     denis.DodajIzostanak(izostanakPrije10Dana);
  162.  
  163.     denis.Ispis();
  164.     Izostanak * p = denis.BinarnaPretraga(jucer);
  165.     cout << "Binarnom pretragom pronadjen izostanak -> ";
  166.     p->Ispis();
  167.     denis.Ispis();
  168.     Izostanak * p2 = PronadjiNajveciNeopravdaniIzostanak(/*potrebni parametri*/);
  169.     cout << "Rekurzivno pronadjen najveci neopravdani izostanak -> ";
  170.     p2->Ispis();
  171.     cout << endl;
  172.     //dealocirati zauzetu memoriju
  173. }
Advertisement
Add Comment
Please, Sign In to add comment