Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<fstream>
- using namespace std;
- char * crt = "--------------------------------------------------------\n";
- struct Datum {
- int * _dan, *_mjesec, *_godina;
- bool IspravnostDatuma(int d, int m, int g) {
- int brDana[]{ 31,28,31,30,31,30,31,31,30,31,30,31 };
- if (g % 4 == 0 && g % 100 != 0 && g % 400 == 0)
- brDana[1]++;
- if (g < 1 || m < 1 || m > 12 || d < 1 || d > brDana[m-1])
- return false;
- }
- void Unos(int d, int m, int g) {
- if (IspravnostDatuma(d, m, g)) {
- _dan = new int(d);
- _mjesec = new int(m);
- _godina = new int(g);
- }
- }
- void Ispis() { cout << *_dan << "/" << *_mjesec << "/" << *_godina; }
- 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 = datumIzostanka;
- _brojSati = brojSati;
- _opravdano = false;
- _razlogIzostanka = nullptr;
- }
- void Dealociraj() { delete[]_razlogIzostanka; _razlogIzostanka = nullptr; _datumIzostanka.Dealociraj(); }
- void Ispis() { _datumIzostanka.Ispis(); cout << " " << _brojSati; if (_razlogIzostanka != nullptr) cout << " " << _razlogIzostanka; cout << endl; }
- 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;
- //Potpisi funkcija trebaju odgovarati onima u main-u
- //1. Unos
- void Unos(char *brIndeksa, char *imeprezime) {
- strcpy_s(_brojIndeksa, strlen(brIndeksa)+1, brIndeksa);
- _imePrezime = new char[strlen(imeprezime)+1];
- strcpy_s(_imePrezime, strlen(imeprezime)+1, imeprezime);
- _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 noviIzostanak) {
- if (_brojIzostanaka > 0) {
- for (int i = 0; i < _brojIzostanaka; i++)
- if (*_izostanci[i]._datumIzostanka._dan == *noviIzostanak._datumIzostanka._dan && *_izostanci[i]._datumIzostanka._mjesec == *noviIzostanak._datumIzostanka._mjesec && *_izostanci[i]._datumIzostanka._godina == *noviIzostanak._datumIzostanka._godina) {
- _izostanci[i]._brojSati += noviIzostanak._brojSati; return;
- }
- }
- if (_brojIzostanaka == 0) {
- _izostanci = new Izostanak(noviIzostanak);
- _brojIzostanaka++;
- } else {
- Izostanak *_temp = new Izostanak[_brojIzostanaka+1];
- for (int i = 0; i < _brojIzostanaka; i++)
- _temp[i] = _izostanci[i];
- _temp[_brojIzostanaka] = noviIzostanak;
- _brojIzostanaka++;
- delete[]_izostanci;
- _izostanci = new Izostanak[_brojIzostanaka];
- for (int i = 0; i < _brojIzostanaka; i++)
- _izostanci[i] = _temp[i];
- delete[]_temp; _temp = nullptr;
- }
- }
- //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() {
- char temp[20];
- strcpy_s(temp, strlen(_brojIndeksa)+1, _brojIndeksa);
- strncpy_s(temp, sizeof(temp), ".txt", sizeof(".txt"));
- char *nazivFajla = new char[strlen(temp)+1];
- strcpy_s(nazivFajla, strlen(temp)+1, temp);
- ofstream upis(nazivFajla);
- ifstream ispis(nazivFajla);
- if (upis.fail())
- cout << "Greska pri otvaranju fajla!" << endl;
- else {
- upis << "Ime i Prezime : " << _imePrezime << endl;
- upis << "Broj Indeksa : " << _brojIndeksa << endl << crt;
- if (_brojIzostanaka > 0) {
- for (int i = 0; i < _brojIzostanaka; i++) {
- upis << *_izostanci[i]._datumIzostanka._dan << "/" << *_izostanci[i]._datumIzostanka._mjesec << "/" << *_izostanci[i]._datumIzostanka._godina; upis << " " << _izostanci[i]._brojSati; if (_izostanci[i]._razlogIzostanka != nullptr) upis << " " << _izostanci[i]._razlogIzostanka; upis << endl;
- }
- upis.close();
- }
- }
- if (ispis.fail())
- cout << "Greska pri otvaranju fajla!" << endl;
- else {
- char znak;
- while (ispis.get(znak))
- cout << znak;
- ispis.close();
- }
- delete[]nazivFajla; nazivFajla = nullptr;
- }
- void sortDatum() {
- for(int i = 0; i < _brojIzostanaka - 1; i++)
- for (int j = 1; 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]);
- }
- }
- //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 pretraga) {
- sortDatum();
- int prvi = 0, zadnji = _brojIzostanaka-1, srednji;
- while (prvi <= zadnji) {
- srednji = (prvi+zadnji)/2;
- if (*pretraga._godina < *_izostanci[srednji]._datumIzostanka._godina)
- zadnji = srednji-1;
- else if (*pretraga._godina == *_izostanci[srednji]._datumIzostanka._godina) {
- if (*pretraga._mjesec < *_izostanci[srednji]._datumIzostanka._mjesec)
- zadnji = srednji-1;
- else if (*pretraga._mjesec == *_izostanci[srednji]._datumIzostanka._mjesec) {
- if (*pretraga._dan < *_izostanci[srednji]._datumIzostanka._dan)
- zadnji = srednji-1;
- else if (*pretraga._dan == *_izostanci[srednji]._datumIzostanka._dan)
- return &_izostanci[srednji];
- else
- prvi = srednji+1;
- } else
- prvi = srednji+1;
- } else
- prvi = srednji+1;
- }
- return nullptr;
- }
- };
- //1. PronadjiNajveciNeopravdaniIzostanak - rekurzivna funkcija koja vraca pokazivac na neopravdani izostanak koji ima najveci broj sati
- Izostanak *PronadjiNajveciNeopravdaniIzostanak(Student denis, int brojIzostanaka, int maxSati, int indeks) {
- if (brojIzostanaka < 0)
- return &denis._izostanci[indeks];
- else {
- if (denis._izostanci[brojIzostanaka]._brojSati > maxSati) {
- maxSati = denis._izostanci[brojIzostanaka]._brojSati;
- return PronadjiNajveciNeopravdaniIzostanak(denis, brojIzostanaka-1, maxSati, brojIzostanaka);
- }
- else return PronadjiNajveciNeopravdaniIzostanak(denis, brojIzostanaka-1, maxSati, indeks);
- }
- }
- //2. GenerisiSljedeciBrojIndeksa - generise i vraca naredni broj indeksa
- int brIndeksa = 1;
- char *GenerisiSljedeciBrojIndeksa() {
- char *indeks = new char[9];
- strcpy_s(indeks, strlen("IB150000")+1, "IB150000");
- int brojac = 0, temp = brIndeksa;
- do {
- temp /= 10; brojac++;
- } while (temp);
- _itoa_s(brIndeksa, indeks + (8-brojac), sizeof(indeks), 10);
- brIndeksa++;
- return indeks;
- }
- 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(prije10Dana);
- cout << crt << "Binarnom pretragom pronadjen izostanak -> ";
- p->Ispis(); cout << crt;
- denis.Ispis();
- Izostanak * p2 = PronadjiNajveciNeopravdaniIzostanak(denis, denis._brojIzostanaka-1, 0, 0);
- cout << crt << "Rekurzivno pronadjen najveci neopravdani izostanak -> ";
- p2->Ispis();
- cout << crt;
- //dealocirati zauzetu memoriju
- denis.Dealociraj();
- getchar();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement