Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- using namespace std;
- const char * crt = "\n----------------------------------------------------\n";
- struct Datum {
- int * _dan, *_mjesec, *_godina;
- void Unos(int d, int m, int g) {
- _dan = new int(d);
- _mjesec = new int(m);
- _godina = new int(g);
- }
- void Ispis() { cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl; }
- void Dealociraj() {
- delete _dan; delete _mjesec; delete _godina;
- _dan = _mjesec = _godina = nullptr;
- }
- };
- bool veciDatum(Datum d1, Datum d2)
- {
- if (*d1._godina < *d2._godina)
- return true;
- else if (*d2._godina < *d1._godina)
- return false;
- if (*d1._mjesec < *d2._mjesec)
- return true;
- else if (*d2._mjesec < *d1._mjesec)
- return false;
- if (*d1._dan < *d2._dan)
- return true;
- else if (*d2._dan < *d1._dan)
- return false;
- return true;
- }
- struct Izostanak {
- char * _razlogIzostanka;
- Datum _datumIzostanka;
- int _brojSati;
- bool _opravdano;//pravdanje zahtijeva da se evidentira i razlog izostanka
- void Unos(Datum datumIzostanka, int brojSati) {
- _datumIzostanka.Unos(*datumIzostanka._dan, *datumIzostanka._mjesec, *datumIzostanka._godina);
- _brojSati = brojSati;
- _opravdano = false;
- _razlogIzostanka = new char;
- _razlogIzostanka[0] = '\0';
- }
- void Dealociraj() { delete[]_razlogIzostanka; _razlogIzostanka = nullptr; }
- void Ispis() {
- _datumIzostanka.Ispis();
- cout << _razlogIzostanka << " " << _razlogIzostanka;
- }
- void Opravdaj(const char * razlogIzostanka) {
- if (_razlogIzostanka != nullptr)
- delete _razlogIzostanka;
- int vel = strlen(razlogIzostanka) + 1;
- _razlogIzostanka = new char[vel];
- strcpy_s(_razlogIzostanka, vel, razlogIzostanka);
- _opravdano = true;
- }
- };
- struct Student {
- //format broja indeksa: IB150051
- //osigurati automatsko generisanje broja indeksa pocevsi od IB150001
- char _brojIndeksa[9];
- char * _imePrezime;
- Izostanak * _izostanci;
- int _brojIzostanaka;
- //Potpisi funkcija trebaju odgovarati onima u main-u
- //1. Unos
- void Unos(const char * indeks, const char * imePrezime)
- {
- strcpy_s(_brojIndeksa, 9, indeks);
- int size = strlen(imePrezime) + 1;
- _imePrezime = new char[size];
- strcpy_s(_imePrezime, size, imePrezime);
- _izostanci = nullptr;
- _brojIzostanaka = 0;
- }
- //2. Dealociraj
- void Dealociraj()
- {
- delete[] _imePrezime; _imePrezime = nullptr;
- for (int i = 0; i < _brojIzostanaka; i++)
- {
- _izostanci[i].Dealociraj();
- }
- delete[] _izostanci; _izostanci = nullptr;
- }
- /*3. DodajIzostanak - dodaje novi izostanak u listu izostanaka.
- Onemoguciti ponavljanje izostanaka na nacin da se uvecava samo broj sati ukoliko korisnik (profesor) vise puta pokusa dodati izostanak na isti dan.*/
- void DodajIzostanak(Izostanak izostanak)
- {
- for (int i = 0; i < _brojIzostanaka; i++)
- {
- if (strcmp(_izostanci[i]._razlogIzostanka, izostanak._razlogIzostanka) == 0)
- {
- _izostanci[i]._brojSati += izostanak._brojSati;
- return;
- }
- }
- Izostanak * temp = new Izostanak[_brojIzostanaka + 1];
- for (int i = 0; i < _brojIzostanaka; i++)
- {
- temp[i].Unos(_izostanci[i]._datumIzostanka, _izostanci[i]._brojSati);
- }
- temp[_brojIzostanaka].Unos(izostanak._datumIzostanka, izostanak._brojSati);
- for (int i = 0; i < _brojIzostanaka; i++)
- {
- _izostanci[i].Dealociraj();
- }
- delete[] _izostanci;
- _izostanci = temp;
- _brojIzostanaka++;
- return;
- }
- //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.
- void Ispis()
- {
- cout << "Broj indeksa: " << _brojIndeksa << "\tIme i prezime: " << _imePrezime << "\tBroj izostanaka: " << _brojIzostanaka << endl;
- cout << "Izostnaci: " << endl;
- for (int i = 0; i < _brojIzostanaka; i++)
- {
- _izostanci[i].Ispis();
- }
- char nazivFajla[20];
- strcpy_s(nazivFajla, 20, _brojIndeksa);
- strcat_s(nazivFajla, 20, ".txt");
- ofstream upis(nazivFajla);
- upis << "Broj indeksa: " << _brojIndeksa << "\tIme i prezime: " << _imePrezime << "\tBroj izostanaka: " << _brojIzostanaka << endl;
- upis << "Izostnaci: " << endl;
- for (int i = 0; i < _brojIzostanaka; i++)
- {
- upis << "Datum izostanka: " << *_izostanci[i]._datumIzostanka._dan << "." << *_izostanci[i]._datumIzostanka._mjesec << "." << *_izostanci[i]._datumIzostanka._godina << endl;
- upis << "Razlog izostanka: " << _izostanci[i]._razlogIzostanka << endl;
- upis << "Broj sati: " << _izostanci[i]._brojSati << endl;
- upis << "Opravdano: " << _izostanci[i]._opravdano << endl;
- }
- if (upis.fail())
- cout << "Greska prilikom upisa u .txt file. " << endl;
- else
- cout << "File uspjesno upisan: " << nazivFajla << endl;
- upis.close();
- }
- //5. BinarnaPretraga - koristeci binarnu pretragu, na osnovu datuma, pronalazi i vraca pokazivac na izostanak. U
- //koliko trazeni izostanak ne postoji funkcija vraca nullptr.
- void sortNiz()
- {
- int minI;
- for (int i = 0; i < _brojIzostanaka; i++)
- {
- minI = i;
- for (int j = i + 1; j < _brojIzostanaka; j++)
- {
- if (veciDatum(_izostanci[j]._datumIzostanka, _izostanci[minI]._datumIzostanka))
- minI = j;
- }
- swap(_izostanci[minI]._datumIzostanka, _izostanci[i]._datumIzostanka);
- }
- /*for (int i = 0; i < _brojIzostanaka; i++)
- {
- _izostanci[i]._datumIzostanka.Ispis();
- }*/
- }
- Izostanak * BinarnaPretraga(Datum datum)
- {
- sortNiz();
- int srednji;
- int zadnji = _brojIzostanaka;
- for (int i = 0; i < zadnji; i++)
- {
- srednji = (zadnji + i) / 2;
- if (veciDatum(_izostanci[srednji]._datumIzostanka, datum))//>0
- {
- i = -1;
- zadnji = srednji;
- }
- else if (veciDatum(_izostanci[srednji]._datumIzostanka, datum))//<0
- {
- i = srednji;
- }
- else
- {
- return &_izostanci[srednji];
- }
- }
- return nullptr;
- }
- };
- //1. PronadjiNajveciNeopravdaniIzostanak - rekurzivna funkcija koja vraca pokazivac na neopravdani izostanak koji ima najveci broj sati
- Izostanak * PronadjiNajveciNeopravdaniIzostanak(int & maxSati, int & i, int & indeksIzostanka, Student & student)
- {
- Izostanak * rezultat;
- if (student._brojIzostanaka == i)
- {
- if (maxSati == 0)
- return nullptr;
- else
- {
- rezultat = &student._izostanci[indeksIzostanka];
- return rezultat;
- }
- }
- else
- {
- if (student._izostanci[i]._opravdano == false)
- {
- if (maxSati < student._izostanci[i]._brojSati)
- {
- maxSati = student._izostanci[i]._brojSati;
- indeksIzostanka = i;
- }
- }
- }
- i++;
- return PronadjiNajveciNeopravdaniIzostanak(maxSati, i, indeksIzostanka, student);
- }
- //2. GenerisiSljedeciBrojIndeksa - generise i vraca naredni broj indeksa
- int BrojIndeksa = 150000;
- const char * GenerisiSljedeciBrojIndeksa()
- {
- char * niz = new char[9];
- strcpy_s(niz, strlen("IB150000") + 1, "IB150000");
- int brojac = 0;
- int brojIndeksa = BrojIndeksa;
- while (brojIndeksa > 0)
- {
- brojIndeksa = brojIndeksa / 10;
- brojac++;
- }
- _itoa_s(BrojIndeksa, &niz[8 - brojac], strlen(niz) + 1, 10);
- BrojIndeksa++;
- return niz;
- }
- void main() {
- Datum jucer, prije5Dana, prije10Dana;
- jucer.Unos(12, 6, 2016);
- prije5Dana.Unos(8, 6, 2016);
- prije10Dana.Unos(3, 6, 2016);
- Student denis;
- denis.Unos(GenerisiSljedeciBrojIndeksa(), "Denis Music");
- Izostanak izostanakJucer, izostanakPrije5Dana, izostanakPrije10Dana;
- izostanakJucer.Unos(jucer, 5);
- denis.DodajIzostanak(izostanakJucer);
- izostanakPrije5Dana.Unos(prije5Dana, 3);
- izostanakPrije5Dana.Opravdaj("Odsutan zbog bolesti - gripa");
- denis.DodajIzostanak(izostanakPrije5Dana);
- izostanakPrije5Dana.Unos(prije5Dana, 2);
- denis.DodajIzostanak(izostanakPrije5Dana);
- izostanakPrije10Dana.Unos(prije10Dana, 1);
- denis.DodajIzostanak(izostanakPrije10Dana);
- izostanakPrije10Dana.Unos(prije10Dana, 1);
- denis.DodajIzostanak(izostanakPrije10Dana);
- /*denis.Ispis();
- cout << "sort" << endl;
- denis.sortNiz();*/
- Izostanak * p = denis.BinarnaPretraga(jucer);
- cout << "Binarnom pretragom pronadjen izostanak -> ";
- if (p != nullptr)
- p->Ispis();
- denis.Ispis();
- int maxSati = 0, i = 0, indeksIzostanka = 0;
- Izostanak * p2 = PronadjiNajveciNeopravdaniIzostanak(maxSati, i, indeksIzostanka, denis);
- cout << "Rekurzivno pronadjen najveci neopravdani izostanak -> ";
- if (p2 != nullptr)
- p2->Ispis();
- cout << endl;
- //dealocirati zauzetu memoriju
- jucer.Dealociraj(); prije5Dana.Dealociraj(); prije10Dana.Dealociraj();
- denis.Dealociraj();
- izostanakJucer.Dealociraj(); izostanakPrije5Dana.Dealociraj(); izostanakPrije10Dana.Dealociraj();
- system("PAUSE");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement