Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<fstream>
- using namespace std;
- enum VrstaObaveze { Seminarski, Parcijalni1, Parcijalni2, Integralni, Prakticni };
- const char *charVrste[] = { "Seminarski", "Parcijalni1", "Parcijalni2", "Integralni", "Prakticni" };
- 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 ObavezeNaPredmetu
- {
- VrstaObaveze * _vrstaObaveze;
- Datum * _datumIzvrsenja;
- char * _napomena;
- int _ocjena; // 5 - 10
- void Unos(VrstaObaveze vrsta, Datum * datum, int ocjena, const char * napomena)
- {
- _vrstaObaveze = new VrstaObaveze(vrsta);
- _datumIzvrsenja = new Datum;
- _datumIzvrsenja->Unos(*datum->_dan, *datum->_mjesec, *datum->_godina);
- _ocjena = ocjena;
- int size = strlen(napomena) + 1;
- _napomena = new char[size];
- strcpy_s(_napomena, size, napomena);
- }
- void Ispis()
- {
- cout <<"Vrsta obaveze: "<< charVrste[*_vrstaObaveze] << "\nOcjena: " << _ocjena << "\nNapomena: " << _napomena;
- cout << "Datum izvrsenja: ";
- _datumIzvrsenja->Ispis();
- cout << endl;
- }
- void Dealociraj()
- {
- _datumIzvrsenja->Dealociraj();
- delete _vrstaObaveze; _vrstaObaveze = nullptr;
- delete _datumIzvrsenja; _datumIzvrsenja = nullptr;
- delete[] _napomena; _napomena = nullptr;
- }
- };
- bool Proslo7dana(Datum d1, Datum d2)
- {
- if (*d1._godina == *d2._godina && *d1._mjesec == *d2._mjesec)
- {
- if (*d1._dan<*d2._dan - 7 || *d1._dan>*d2._dan - 7)
- return true;
- else return false;
- }
- else
- return true;
- }
- struct PolozeniPredmet
- {
- Datum _datumPolaganja;//datum koji ce se evidentirati kao datum kada je predmet polozen tj. kada je formirana konacna ocjena
- char * _nazivPredmeta;
- ObavezeNaPredmetu * _listaIzvrsenihObaveza[10];
- int _trenutnoIzvrsenihObaveza;
- int _konacnaOcjena; //formira se na osnovu ocjena izvrsenih obaveza
- void Unos(const char *nazivPredmeta)
- {
- _nazivPredmeta = new char[strlen(nazivPredmeta) + 1];
- strcpy_s(_nazivPredmeta, strlen(nazivPredmeta) + 1, nazivPredmeta);
- _trenutnoIzvrsenihObaveza = 0;
- }
- void Dealokacija()
- {
- _datumPolaganja.Dealociraj();
- delete _nazivPredmeta; _nazivPredmeta = nullptr;
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- _listaIzvrsenihObaveza[i]->Dealociraj();
- }
- void Ispis()
- {
- cout << "Naziv predmeta: " << _nazivPredmeta << endl;
- cout << "Datum polaganja: ";
- _datumPolaganja.Ispis();
- cout << "Konacna ocjena :" << _konacnaOcjena << endl;
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- _listaIzvrsenihObaveza[i]->Ispis();
- }
- }
- bool DodajIzvrsenuObavezu(VrstaObaveze obaveza, Datum datum,int ocjena, const char*napomena)
- {
- if (_trenutnoIzvrsenihObaveza >= 10)
- return false;
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == obaveza)
- {
- if (charVrste[obaveza] == "Seminarski" || _listaIzvrsenihObaveza[i]->_ocjena==5)
- continue;
- else
- return false;
- }
- else if (Proslo7dana(*_listaIzvrsenihObaveza[i]->_datumIzvrsenja, datum)==false)
- {
- cout << "Nije proslo najmanje 7 dana" << endl;
- return false;
- }
- }
- _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza] = new ObavezeNaPredmetu;
- _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza]->Unos(obaveza, &datum, ocjena, napomena);
- _trenutnoIzvrsenihObaveza++;
- return true;
- }
- bool ImaLiPolozenParcijalni2ISeminarski()
- {
- int brojac = 0;
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni2)
- {
- if (_listaIzvrsenihObaveza[i]->_ocjena > 5)
- {
- if(strcmp(_listaIzvrsenihObaveza[i]->_napomena,"prepisivao")!=0 && (strcmp(_listaIzvrsenihObaveza[i]->_napomena, "izbacen") != 0))
- brojac++;
- }
- }
- else if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Seminarski)
- {
- if (_listaIzvrsenihObaveza[i]->_ocjena > 5)
- {
- if (strcmp(_listaIzvrsenihObaveza[i]->_napomena, "prepisivao") != 0 && (strcmp(_listaIzvrsenihObaveza[i]->_napomena, "izbacen") != 0))
- brojac++;
- }
- }
- }
- if (brojac == 3)
- return true;
- else
- return false;
- }
- int Ocjena()
- {
- int ocjena = 0;
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni2)
- {
- ocjena += _listaIzvrsenihObaveza[i]->_ocjena;
- }
- }
- return ocjena;
- }
- int IndeksPosljednjeObaveze()
- {
- int p1 = 0, p2 = 0, s = 0;
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni1)
- p1 = i;
- else if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni2)
- p2 = i;
- else if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Seminarski)
- s = i;
- }
- if (p1 > p2 && p1 > s)
- return p1;
- else if (p2 > p1 && p2 > s)
- return p2;
- else
- return s;
- }
- int FormirajKonacnuOcjenu()
- {
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Integralni)
- {
- if (_listaIzvrsenihObaveza[i]->_ocjena > 5)
- {
- _konacnaOcjena = _listaIzvrsenihObaveza[i]->_ocjena;
- return _konacnaOcjena;
- _datumPolaganja.Unos(*_listaIzvrsenihObaveza[i]->_datumIzvrsenja->_dan, *_listaIzvrsenihObaveza[i]->_datumIzvrsenja->_mjesec, *_listaIzvrsenihObaveza[i]->_datumIzvrsenja->_godina);
- }
- }
- else if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni1)
- {
- if (_listaIzvrsenihObaveza[i]->_ocjena > 5)
- {
- if (strcmp(_listaIzvrsenihObaveza[i]->_napomena, "prepisivao") != 0 && (strcmp(_listaIzvrsenihObaveza[i]->_napomena, "izbacen") != 0))
- {
- if (ImaLiPolozenParcijalni2ISeminarski())
- {
- _konacnaOcjena = (_listaIzvrsenihObaveza[i]->_ocjena + Ocjena()) / 2;
- _datumPolaganja.Unos(*_listaIzvrsenihObaveza[IndeksPosljednjeObaveze()]->_datumIzvrsenja->_dan, *_listaIzvrsenihObaveza[IndeksPosljednjeObaveze()]->_datumIzvrsenja->_mjesec, *_listaIzvrsenihObaveza[IndeksPosljednjeObaveze()]->_datumIzvrsenja->_godina);
- return _konacnaOcjena;
- }
- }
- }
- else
- return 5;
- }
- }
- return 5;
- }
- /*
- 1. Unos - na osnovu vrijednosti primljenog parametra izvrsiti inicijalizaciju odgovarajucih atributa
- 2. DodajIzvrsenuObavezu – na osnovu vrijednosti primljenih parametara osigurati dodavanje novoizvrsene obaveze na predmetu.
- Potrebno je onemoguciti dodavanje identicnih obaveza, a izmedju izvrsenja pojedinih obaveza mora proci najmanje 7 dana.
- Identicna vrsta obaveze se moze dodati samo u slucaju da se radi o Seminarskom ili je prethodno dodana obaveza
- (identicne vrste)
- imala ocjenu 5. Ukoliko je moguce, osigurati prosirenje niza na nacin da prihvati vise od 10 obaveza.
- 3. FormirajKonacnuOcjenu - konacna ocjene predstavlja prosjecnu ocjenu na predmetu, a za njeno formiranje student mora
- posjedovati polozen integralni ili dva parijcalna ispita. Ukoliko je ispit polozen putem parcijalnih ispita,
- student takodjer mora imati pozitivno (ocjenom vecom od 5) ocijenjena najmanje dva seminarska rada.
- U slucaju da bilo koji od navedenih uslova nije zadovoljenkonacna ocjena treba biti postavljena na vrijednost 5.
- Konacna ocjena, takodjer, ne smije biti formirana u slucaju da u napomeni od dvije obaveze stoji rijec 'prepisivao' ili
- 'izbacen'. Ukoliko su ispunjeni svi uslovi, osim formiranja konacne ocjene, kao datum polaganja je potrebno postaviti
- na vrijednost datuma posljednje izvrsene obaveze koja je usla u formiranje ocjene.
- 4. Ispis – ispsuje vrijednosti svih atributa strukture
- */
- };
- //1. UpisiUBinarniFajl - objekat koji je primljen kao parametar upisuje u binarni fajl. Naziv fajla treba biti sastavljen od naziva predmeta i
- //konacne ocjena npr. "Programiranje II_6"
- void UpisiUBinarniFajl(PolozeniPredmet &p)
- {
- char *ocjena;
- ocjena = new char[3];
- _itoa_s(p._konacnaOcjena, ocjena,strlen(ocjena), 10);
- char *nazivFajla = new char[strlen(p._nazivPredmeta) + strlen(ocjena)+2];
- strcpy_s(nazivFajla, strlen(p._nazivPredmeta) + strlen(ocjena) + 2, p._nazivPredmeta);
- strcat_s(nazivFajla, strlen(p._nazivPredmeta) + strlen(ocjena) + 2, "_");
- _itoa_s(p._konacnaOcjena, ocjena, 8, 10);
- strcat_s(nazivFajla, strlen(p._nazivPredmeta) + strlen(ocjena) + 2, ocjena);
- ofstream fajl;
- fajl.open(nazivFajla, ios::binary);
- fajl.write((char*)(&p),sizeof(p));
- fajl.close();
- }
- //2. UcitajIzBinarnogFajla - u objekat koji je primljen kao parametar ucitava sadrzaj binarnog fajla (naziv fajla je takodjer proslijedjen kao parametar)
- void UcitajIzBinarnogFajla(PolozeniPredmet &p, const char*naziv)
- {
- ifstream fajl;
- fajl.open(naziv, ios::binary);
- fajl.read((char*)(&p), sizeof(p));
- fajl.close();
- }
- //3. PretragaRekurzivno - rekurzivna funkcija koja treba da vrati broj obaveza kod koji je student ostvario negativnu ocjenu
- int PretragaRekurzivno(PolozeniPredmet p, int brojPredmeta, int brojac = 0, int Brocjena = 0)
- {
- if (brojac == brojPredmeta)
- return Brocjena;
- else if (p._listaIzvrsenihObaveza[brojac]->_ocjena == 5)
- Brocjena += 1;
- PretragaRekurzivno(p, brojPredmeta, brojac + 1, Brocjena);
- }
- void main() {
- /*
- 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NECE BODOVATI
- 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
- 3. KREIRAJTE .DOC FAJL SA VAŠIM BROJEM INDEKSA ( NPR. IB130030.DOC BEZ IMENA I PREZIMENA), TE NA KRAJU ISPITA U NJEGA KOPIRAJTE RJEŠENJA VAŠIH ZADATAKA. NE PREDAVATI .TXT ILI .CPP FAJLOVE
- 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
- 5. TOKOM IZRADE ISPITA MOGU BITI POKRENUTA SAMO TRI PROGRAMA: PDF READER (ISPITNI ZADACI), MS VISUAL STUDIO, MS WORD (U KOJI CETE KOPIRATI VAŠA RJEŠENJA)
- 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
- */
- Datum datumSeminarski1, datumSeminarski2, datumParcijalni1, datumParcijalni2,
- datumIntegralni;
- datumSeminarski1.Unos(10, 6, 2016);
- datumSeminarski2.Unos(18, 6, 2016);
- datumParcijalni1.Unos(22, 3, 2016);
- datumParcijalni2.Unos(22, 6, 2016);
- //polozeni predmet
- PolozeniPredmet prII, prII_FromFile;
- prII.Unos("Programiranje II");
- if (prII.DodajIzvrsenuObavezu(Parcijalni1, datumParcijalni1, 6, "uslovno polozen"))
- cout << "Parcijalni 1...dodan" << endl;
- if (prII.DodajIzvrsenuObavezu(Parcijalni2, datumParcijalni2, 5, "previse gresaka"))
- cout << "Parcijalni 2...dodan" << endl;
- if (prII.DodajIzvrsenuObavezu(Seminarski, datumSeminarski1, 8, "implementirani svi algoritmi"))
- cout << "Seminarski1...dodan" << endl;
- if (prII.DodajIzvrsenuObavezu(Seminarski, datumSeminarski2, 6, "rad slican kao kod studenta IB150388"))
- cout << "Seminarski2...dodan" << endl;
- cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
- datumParcijalni2.Unos(22, 7, 2016);
- if (prII.DodajIzvrsenuObavezu(Parcijalni2, datumParcijalni2, 6, ""))
- cout << "Parcijalni 2...dodan" << endl;
- cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
- //rekurzija
- cout << "Broj negativnih ocjena je: " << PretragaRekurzivno(prII,prII._trenutnoIzvrsenihObaveza) << endl;
- cout << "\n------------------------------------------------------------------------------------------------\n";
- ////manipulacija fajlovima
- UpisiUBinarniFajl(prII);
- prII.Ispis();
- UcitajIzBinarnogFajla(prII_FromFile, "Programiranje II_8");
- prII_FromFile.Ispis();
- datumSeminarski1.Dealociraj();
- datumSeminarski2.Dealociraj();
- datumParcijalni1.Dealociraj();
- datumParcijalni2.Dealociraj();
- prII.Dealokacija();
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement