Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- using namespace std;
- 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;
- }
- };
- 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(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;
- void Ispisitxt()
- {
- char NazivFajla[20];
- strcpy(NazivFajla, _brojIndeksa);
- strcat(NazivFajla, ".txt");
- ofstream Fajl(NazivFajla, ios::ate);
- Fajl << _brojIndeksa;
- Fajl << _imePrezime;
- Fajl << _brojIzostanaka;
- Fajl.close();
- }
- //Potpisi funkcija trebaju odgovarati onima u main-u
- //1. Unos
- //2. Dealociraj
- /*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.*/
- //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.
- //5. BinarnaPretraga - koristeci binarnu pretragu, na osnovu datuma, pronalazi i vraca pokazivac na izostanak.
- //Ukoliko trazeni izostanak ne postoji funkcija vraca nullptr.
- Izostanak * BinarnaPretraga(Datum datum)
- {
- for (int i = 0; i < _brojIzostanaka; i++)
- {
- for (int j = 0; j < _brojIzostanaka; j++)
- {
- if (_izostanci[j]._datumIzostanka._godina < _izostanci[j - 1]._datumIzostanka._godina)
- swap(_izostanci[j], _izostanci[j - 1]);
- else if (_izostanci[j]._datumIzostanka._godina == _izostanci[j - 1]._datumIzostanka._godina)
- {
- if (_izostanci[j]._datumIzostanka._mjesec < _izostanci[j - 1]._datumIzostanka._mjesec)
- swap(_izostanci[j], _izostanci[j - 1]);
- else if (_izostanci[j]._datumIzostanka._mjesec == _izostanci[j - 1]._datumIzostanka._mjesec)
- if (_izostanci[j]._datumIzostanka._dan < _izostanci[j - 1]._datumIzostanka._dan)
- swap(_izostanci[j], _izostanci[j - 1]);
- }
- }
- }
- int prvi = 0;
- int srednji;
- int zadnji = _brojIzostanaka - 1;
- bool pronadjen = false;
- while ((pronadjen == false) && (prvi <= zadnji))
- {
- srednji = (prvi + zadnji) / 2;
- if (_izostanci[srednji]._datumIzostanka._dan < datum._dan)
- zadnji = srednji - 1;
- if (_izostanci[srednji]._datumIzostanka._dan > datum._dan)
- prvi = srednji + 1;
- if (_izostanci[srednji]._datumIzostanka._dan == datum._dan)
- pronadjen = true;
- return &_izostanci[srednji];
- }
- }
- };
- //1. PronadjiNajveciNeopravdaniIzostanak - rekurzivna funkcija koja vraca pokazivac na neopravdani izostanak koji ima najveci broj sati
- //2. GenerisiSljedeciBrojIndeksa - generise i vraca naredni broj indeksa
- int brojIndeksa = 1;
- char *GenerisiSljedeciBrojIndeksa()
- {
- char * temp = new char[9];
- strcpy_s(temp, strlen("IB150000"), "IB150000");
- int BrojacDecimala = 0;
- int BrojIndeksa = brojIndeksa;
- while (BrojIndeksa > 0)
- {
- BrojIndeksa = BrojIndeksa / 10;
- BrojacDecimala++;
- }
- _itoa_s(brojIndeksa, &temp[9 - BrojacDecimala], strlen(temp), 10);
- brojIndeksa++;
- return temp;
- }
- 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();
- Izostanak * p = denis.BinarnaPretraga(jucer);
- cout << "Binarnom pretragom pronadjen izostanak -> ";
- p->Ispis();
- denis.Ispis();
- Izostanak * p2 = PronadjiNajveciNeopravdaniIzostanak(/*potrebni parametri*/);
- cout << "Rekurzivno pronadjen najveci neopravdani izostanak -> ";
- p2->Ispis();
- cout << endl;
- //dealocirati zauzetu memoriju
- }
Advertisement
Add Comment
Please, Sign In to add comment