Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- /*
- 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. IB160061.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
- */
- using namespace std;
- //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
- #pragma warning(disable:4996)
- enum VrstaObaveze { Seminarski, Parcijalni1, Parcijalni2, Integralni, Prakticni };
- const char * vrstaObavezeChar[] = { "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; }
- };
- 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 ObavezeNaPredmetu {
- shared_ptr<VrstaObaveze> _vrstaObaveze;
- Datum _datumIzvrsenja;
- char * _napomena;
- int _ocjena; // 5 - 10
- void Unos(VrstaObaveze vrsta, Datum datum, int ocjena, const char * napomena) {
- _vrstaObaveze = make_shared <VrstaObaveze>(vrsta) /*DOPUNITI*/;
- //_datumIzvrsenja = datum;
- _datumIzvrsenja.Unos(*datum._dan, *datum._mjesec, *datum._godina);
- _ocjena = ocjena;
- _napomena = new char[strlen(napomena) + 1];
- strcpy_s(_napomena, strlen(napomena) + 1, napomena);
- }
- void Ispis() {
- cout << vrstaObavezeChar[*_vrstaObaveze] /*DOPUNITI*/ << " " << _ocjena << " " << _napomena;
- _datumIzvrsenja.Ispis();
- cout << endl;
- }
- void Dealociraj() {
- _datumIzvrsenja.Dealociraj();
- delete[] _napomena; _napomena = nullptr;
- }
- };
- const char * _kljucneRijeci[15] = { NULL }; /*da bi se odredjena obaveza na predmetu smatrala uspjesno izvrsenom,
- u napomeni (objekta ObavezeNaPredmetu) ne smije stajati niti jedna od rijeci koja se nalazi u nizu _kljucneRijeci*/
- 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;
- int _trenutnoIzvrsenihObaveza;
- int _minimalanBrojDana; //odnosi se na minimalan broj dana koji mora proci od izvrsenja pojedinih obaveza na predmetu (npr. 7 dana)
- int _konacnaOcjena; //formira se na osnovu ocjena izvrsenih obaveza
- void Unos(const char * naziv, int minimalanBrojDana) {
- _nazivPredmeta = new char[strlen(naziv) + 1];
- strcpy_s(_nazivPredmeta, strlen(naziv) + 1, naziv);
- _listaIzvrsenihObaveza = nullptr;
- _trenutnoIzvrsenihObaveza = 0;
- _minimalanBrojDana = minimalanBrojDana;
- _konacnaOcjena = 0;
- _datumPolaganja.Unos(0, 0, 0);
- }
- void Dealociraj()
- {
- //if (_datumPolaganja._dan != nullptr && _datumPolaganja._mjesec != nullptr && _datumPolaganja._godina != nullptr)
- //{
- _datumPolaganja.Dealociraj();
- //}
- delete[] _nazivPredmeta; _nazivPredmeta = nullptr;
- for (size_t i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- _listaIzvrsenihObaveza[i].Dealociraj();
- }
- delete[]_listaIzvrsenihObaveza;
- }
- /*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 onoliko dana koliko je definisano vrijednoscu atributa _minimalanBrojDana.
- Identicna vrsta obaveze se moze dodati samo u slucaju da je prethodno dodana obaveza (identicne vrste) imala ocjenu 5
- ili je u napomeni sadrzavala neku od zabranjenih rijeci
- (definisanih nizom _kljucneRijeci).*/
- bool DodajIzvrsenuObavezu(VrstaObaveze obaveza, Datum datum, int ocjena, const char * napomena)
- {
- //provjere
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == obaveza && _listaIzvrsenihObaveza[i]._ocjena != 5) //uvjet za provjeru kljucnih rijeci
- {
- return false;
- }
- }
- for (int j = 0; j < 15; j++)
- {
- if (_kljucneRijeci[j] != nullptr)
- {
- if (strstr(napomena, _kljucneRijeci[j]) != nullptr)
- {
- return false;
- }
- }
- }
- ObavezeNaPredmetu * temp = new ObavezeNaPredmetu[_trenutnoIzvrsenihObaveza + 1];
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- temp[i].Unos(*_listaIzvrsenihObaveza[i]._vrstaObaveze, _listaIzvrsenihObaveza[i]._datumIzvrsenja, _listaIzvrsenihObaveza[i]._ocjena,
- _listaIzvrsenihObaveza[i]._napomena);
- }
- temp[_trenutnoIzvrsenihObaveza].Unos(obaveza, datum, ocjena, napomena);
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- _listaIzvrsenihObaveza[i].Dealociraj();
- }
- delete[] _listaIzvrsenihObaveza;
- _listaIzvrsenihObaveza = temp;
- _trenutnoIzvrsenihObaveza++;
- //cout << "Obaveza: " << _trenutnoIzvrsenihObaveza << " dodana. ";
- return true;
- }
- /*Konacna ocjene predstavlja prosjecnu ocjenu na predmetu (prosjecnu ocjenu izvrsenih obaveza koje ispunjavaju uslove za uspjesno polaganje predmeta),
- 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 i jedan prakticni rad.
- Takodjer, datum polaganja drugog parcijalnog ispita ne smije biti raniji (manji) od datuma polaganja prvog parcijalnog ispita.
- Konacna ocjena ne smije biti formirana u slucaju da napomena bilo koje odbaveze (koja je ucestvovala u formiranju konacne ocjene) sadrzi neku od
- zabranjenih rijeci (niz _kljucneRijeci).
- U slucaju da neki od navedenih uslova nije zadovoljen konacna ocjena treba biti postavljena na vrijednost 5. Ukoliko su ispunjeni svi uslovi,
- osim formiranja konacne ocjene, datum polaganja je potrebno postaviti na vrijednost datuma posljednje izvrsene obaveze sa najvecom ocjenom.
- */
- float FormirajKonacnuOcjenu()
- {
- //provjere
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- for (int j = 0; j < 15; j++)
- {
- if (_kljucneRijeci[j] != nullptr)
- {
- if (strstr(_listaIzvrsenihObaveza[i]._napomena, _kljucneRijeci[j]) != nullptr)
- {
- cout << "U napomeni stoji neka od zabranjenih rijeci... " << endl;
- _konacnaOcjena = 5;
- return _konacnaOcjena;
- }
- }
- }
- }
- int brojSeminarskih = 0, brojPrakticnih = 0;
- int ocjenaSeminarski = 0, ocjenaPrakticni = 0, ocjenaParcijala = 0;
- int sumaSvihOcjena = 0;
- float prosjecnaOcjena = 0;
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)//brojanje uslova za parcijale i sabiranje ocjena
- {
- if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Seminarski && _listaIzvrsenihObaveza[i]._ocjena > 5)
- {
- ocjenaSeminarski += _listaIzvrsenihObaveza[i]._ocjena;
- brojSeminarskih++;
- }
- if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Prakticni && _listaIzvrsenihObaveza[i]._ocjena > 5)
- {
- ocjenaPrakticni += _listaIzvrsenihObaveza[i]._ocjena;
- brojPrakticnih++;
- }
- }
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)//ukoliko se radi o integralnom ispitu
- {
- if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Integralni && _listaIzvrsenihObaveza[i]._ocjena > 5)
- {
- _konacnaOcjena = _listaIzvrsenihObaveza[i]._ocjena;
- return _konacnaOcjena;
- }
- }
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)// ukoliko se radi o parcijalnim ispitima, ako nisu izvrsene obaveze pada
- {
- if (brojSeminarskih < 2)
- {
- _konacnaOcjena = 5;
- return _konacnaOcjena;
- }
- if (brojPrakticnih < 1)
- {
- _konacnaOcjena = 5;
- return _konacnaOcjena;
- }
- if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Parcijalni1 && _listaIzvrsenihObaveza[i]._ocjena > 5) //polozen prvi parcijalni - saberi date ocjene
- {
- ocjenaParcijala += _listaIzvrsenihObaveza[i]._ocjena;
- }
- else if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Parcijalni1 && _listaIzvrsenihObaveza[i]._ocjena == 5) // prvi parcijalni nije polozen, pao si
- {
- _konacnaOcjena = 5;
- return _konacnaOcjena;
- }
- if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Parcijalni2 && _listaIzvrsenihObaveza[i]._ocjena > 5) // polozen II parcijalni, saberi ocjene
- {
- ocjenaParcijala += _listaIzvrsenihObaveza[i]._ocjena;
- }
- else if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Parcijalni2 && _listaIzvrsenihObaveza[i]._ocjena == 5)// II parcijalni nije polozen, pao si
- {
- _konacnaOcjena = 5;
- return _konacnaOcjena;
- }
- }
- //sabiranje svih ocjena uz obaveze koje zahtjevaju parcijalni ispiti(parcijale, seminarki, partkicni)
- sumaSvihOcjena += ocjenaSeminarski;
- sumaSvihOcjena += ocjenaPrakticni;
- sumaSvihOcjena += ocjenaParcijala;
- prosjecnaOcjena = sumaSvihOcjena / (2, brojPrakticnih + brojSeminarskih); //konacna ocjena parcijala i izvrsenih obaveza
- _konacnaOcjena = prosjecnaOcjena;
- int maximalnaOcjena = 0;
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++) //trazenje makismalne ocjene tj. njen indeks
- {
- if (_listaIzvrsenihObaveza[i]._ocjena > _listaIzvrsenihObaveza[maximalnaOcjena]._ocjena)
- {
- maximalnaOcjena = i;
- }
- }
- //postavljanje datuma na indeks maksimalne ocjene
- _datumPolaganja.Unos(*_listaIzvrsenihObaveza[maximalnaOcjena]._datumIzvrsenja._dan, *_listaIzvrsenihObaveza[maximalnaOcjena]._datumIzvrsenja._mjesec,
- *_listaIzvrsenihObaveza[maximalnaOcjena]._datumIzvrsenja._godina);
- return prosjecnaOcjena;
- }
- };
- /*Rekurzivna funkcija treba vratiti prosjecnu ocjenu uspjesno izvrsenih obaveze na predmetu odredjene vrste u definisanom periodu.
- Izbjegavati koristenje globalnih varijabli*/
- int i=0;
- float PretragaRekurzivno(PolozeniPredmet & predmet, VrstaObaveze obaveza, Datum OD, Datum DO, int brojac, int suma)
- {
- float prosjek;
- if (predmet._trenutnoIzvrsenihObaveza == i)
- {
- if (brojac == 0)
- return 0;
- else
- {
- prosjek = float(suma) / brojac;
- return prosjek;
- }
- }
- else
- {
- if (*predmet._listaIzvrsenihObaveza[i]._vrstaObaveze == obaveza)
- {
- if (veciDatum(OD, predmet._listaIzvrsenihObaveza[i]._datumIzvrsenja) && veciDatum(predmet._listaIzvrsenihObaveza[i]._datumIzvrsenja, DO))
- {
- suma += predmet._listaIzvrsenihObaveza[i]._ocjena;
- brojac++;
- }
- }
- }
- i++;
- return PretragaRekurzivno(predmet, obaveza, OD, DO, brojac, suma);
- }
- /*Koristeci lambda-u, unutar funkcije GetBrojObavezaIznadProsjeka pronaci broj izvrsenih obaveza koje imaju istu ili vecu ocjenu od prosjecne*/
- int GetBrojObavezaIznadProsjeka(PolozeniPredmet & predmet, float prosjek)
- {
- auto lambda = [&]()
- {
- int brojac = 0;
- int sumaOcjena = 0;
- for (int i = 0; i < predmet._trenutnoIzvrsenihObaveza; i++)
- {
- sumaOcjena += predmet._listaIzvrsenihObaveza[i]._ocjena;
- }
- prosjek = sumaOcjena / predmet._trenutnoIzvrsenihObaveza;
- for (int i = 0; i < predmet._trenutnoIzvrsenihObaveza; i++)
- {
- if (predmet._listaIzvrsenihObaveza[i]._ocjena >= prosjek)
- {
- brojac++;
- }
- }
- return brojac;
- };
- return lambda();
- }
- void main() {
- _kljucneRijeci[0] = "prepisivao";
- _kljucneRijeci[1] = "ometao";
- _kljucneRijeci[2] = "nije dostavio";
- Datum datumSeminarski1, datumSeminarski2, datumParcijalni1, datumParcijalni2, datumIntegralni;
- datumSeminarski1.Unos(10, 6, 2017);
- datumSeminarski2.Unos(18, 6, 2017);
- datumParcijalni1.Unos(22, 6, 2017);
- datumParcijalni2.Unos(30, 6, 2017);
- PolozeniPredmet prII;
- //naziv predmeta, minimalan broj dana
- prII.Unos("Programiranje II", 7);
- /*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 onoliko dana koliko je definisano vrijednoscu atributa _minimalanBrojDana. Identicna vrsta obaveze se moze dodati samo u slucaju da je prethodno dodana obaveza (identicne vrste) imala ocjenu 5 ili je u napomeni sadrzavala neku od zabranjenih rijeci (definisanih nizom _kljucneRijeci).*/
- if (prII.DodajIzvrsenuObavezu(Parcijalni1, datumParcijalni1, 6, "uslovno polozen ispit"))
- cout << "Parcijalni 1...dodan" << endl;
- if (prII.DodajIzvrsenuObavezu(Parcijalni2, datumParcijalni2, 5, "previse gresaka, a tokom ispita ometao druge studente"))
- 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;
- /*Konacna ocjene predstavlja prosjecnu ocjenu na predmetu (prosjecnu ocjenu izvrsenih obaveza koje ispunjavaju uslove za uspjesno polaganje predmeta),
- 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 i jedan prakticni rad. Takodjer, datum polaganja
- drugog parcijalnog ispita ne smije biti raniji (manji) od datuma polaganja prvog parcijalnog ispita. Konacna ocjena ne smije biti formirana u
- slucaju da napomena bilo koje odbaveze (koja je ucestvovala u formiranju konacne ocjene) sadrzi neku od zabranjenih rijeci (niz _kljucneRijeci).
- U slucaju da neki od navedenih uslova nije zadovoljen konacna ocjena treba biti postavljena na vrijednost 5. Ukoliko su ispunjeni svi uslovi,
- osim formiranja konacne ocjene, datum polaganja je potrebno postaviti na vrijednost datuma posljednje izvrsene obaveze sa najvecom ocjenom.
- */
- cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
- datumParcijalni2.Unos(22, 7, 2017);
- if (prII.DodajIzvrsenuObavezu(Parcijalni2, datumParcijalni2, 6, ""))
- cout << "Parcijalni 2...dodan" << endl;
- cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
- Datum OD, DO; OD.Unos(1, 1, 2017); DO.Unos(1, 7, 2017);
- /*Rekurzivna funkcija treba vratiti prosjecnu ocjenu uspjesno izvrsenih obaveze na predmetu odredjene vrste u definisanom periodu.
- Izbjegavati koristenje globalnih varijabli*/
- float prosjek = PretragaRekurzivno(prII, Seminarski, OD, DO, 0, 0);
- cout << "Prosjecna ocjena izvrsenih obaveza je: " << prosjek << endl;
- /*Koristeci lambda-u, unutar funkcije GetBrojObavezaIznadProsjeka pronaci broj izvrsenih obaveza koje imaju istu ili vecu ocjenu od prosjecne*/
- int iznadProsjeka = GetBrojObavezaIznadProsjeka(prII, prosjek);
- cout << "Broj izvrsenih obaveza iznad prosjeka je: " << iznadProsjeka << endl;
- datumParcijalni1.Dealociraj();
- datumParcijalni2.Dealociraj();
- datumSeminarski1.Dealociraj();
- datumSeminarski2.Dealociraj();
- //datumIntegralni.Dealociraj(); - zakomentarisan jer nigdje unutar main funckije nije unesen
- datumIntegralni.Unos(23, 03, 1995); // ili je moguce prvo unijeti datum, pa onda pozivati njegovu funkciju za dealokaciju
- datumIntegralni.Dealociraj();
- prII.Dealociraj();
- system("PAUSE");
- }
Advertisement
Add Comment
Please, Sign In to add comment