limun11

Studenti - izostnaci

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