You are on page 1of 7

#include<iostream>

#include <memory>
/*
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 };
char * vrste[] = { "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; }
};
struct ObavezeNaPredmetu {
shared_ptr<VrstaObaveze> _vrstaObaveze;
Datum _datumIzvrsenja;
char * _napomena;
int _ocjena; // 5 - 10
void Unos(VrstaObaveze vrsta, Datum datum, int ocjena, char * napomena) {
_vrstaObaveze = make_shared<VrstaObaveze>(vrsta);
_datumIzvrsenja = datum;
_ocjena = ocjena;
_napomena = new char[strlen(napomena) + 1];
strcpy_s(_napomena, strlen(napomena) + 1, napomena);
}
void Ispis() {
cout << vrste[*_vrstaObaveze]<< " " << _ocjena << " " << _napomena;
_datumIzvrsenja.Ispis();
cout << endl;
}
void Dealociraj() {
_datumIzvrsenja.Dealociraj();
delete[] _napomena; _napomena = nullptr;
}
};

int minimalanBrojDana) { _nazivPredmeta = new char[strlen(naziv) + 1]. delete[]_listaIzvrsenihObaveza. strlen(naziv) + 1.*/ //provjera koliko je dana proslo if (_trenutnoIzvrsenihObaveza > 0) { if (abs(sumaDana(d) - sumaDana(_listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza . j < 15. //formira se na osnovu ocjena izvrsenih obaveza void Unos(char * naziv. _minimalanBrojDana = minimalanBrojDana. i < _trenutnoIzvrsenihObaveza. } bool DodajIzvrsenuObavezu(VrstaObaveze v. a izmedju izvrsenja pojedinih obaveza mora proci najmanje onoliko dana koliko je definisano vrijednoscu atributa _minimalanBrojDana. naziv)._dan + *d. delete[] _nazivPredmeta. Potrebno je onemoguciti dodavanje identicnih obaveza.1]._ocjena > 5 && v != Seminarski) { return false. i < _trenutnoIzvrsenihObaveza._datumIzvrsenja)) < _minimalanBrojDana) return false. kada je formirana konacna ocjena char * _nazivPredmeta.Dealociraj(). int _trenutnoIzvrsenihObaveza. _listaIzvrsenihObaveza = nullptr. 7 dana) int _konacnaOcjena._vrstaObaveze == v && _listaIzvrsenihObaveza[i]. } struct PolozeniPredmet { Datum _datumPolaganja. j++) { . u napomeni (objekta ObavezeNaPredmetu) ne smije stajati niti jedna od rijeci koja se nalazi u nizu _kljucneRijeci*/ int sumaDana(Datum d) { return *d. 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). strcpy_s(_nazivPredmeta. } void Dealociraj() { _datumPolaganja. for (int i = 0. _konacnaOcjena = 0._mjesec * 30 + *d.//datum koji ce se evidentirati kao datum kada je predmet polozen tj._godina * 365. _trenutnoIzvrsenihObaveza = 0.Dealociraj(). //provjera zabranjenih rijeci for (int j = 0. /*da bi se odredjena obaveza na predmetu smatrala uspjesno izvrsenom. for (size_t i = 0. char * napomena) { ///*Na osnovu vrijednosti primljenih parametara osigurati /*dodavanje novoizvrsene obaveze na predmetu. int ocjena. //odnosi se na minimalan broj dana koji mora proci od izvrsenja pojedinih obaveza na predmetu (npr. Datum d. i++) { if (*_listaIzvrsenihObaveza[i]. _nazivPredmeta = nullptr. i++) _listaIzvrsenihObaveza[i]. int _minimalanBrojDana.char * _kljucneRijeci[15] = { NULL }. ObavezeNaPredmetu * _listaIzvrsenihObaveza. } //provjera iste obaveze bool ima = true.

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). i < _trenutnoIzvrsenihObaveza. i < _trenutnoIzvrsenihObaveza._datumIzvrsenja. U slucaju da neki od navedenih uslova nije zadovoljen konacna ocjena treba biti postavljena na vrijednost 5. indexParcijalnog1 = -1.a za njeno formiranje student mora posjedovati polozen integralni ili dva parijcalna ispita. bool imaZabranjenu = false. datum polaganja drugog parcijalnog ispita ne smije biti raniji (manji) od datuma polaganja prvog parcijalnog ispita._ocjena. return true._ocjena > 5) { if (*_listaIzvrsenihObaveza[i]. osim formiranja konacne ocjene. delete[] _listaIzvrsenihObaveza. } float FormirajKonacnuOcjenu() { ///*Konacna ocjene predstavlja prosjecnu ocjenu na predmetu /*(prosjecnu ocjenu izvrsenih obaveza koje ispunjavaju uslove za uspjesno polaganje predmeta). _listaIzvrsenihObaveza = temp.*/ int brIntegralnih = 0._napomena). sumaPrakticnih = 0. brPrakticnih = 0. Ukoliko su ispunjeni svi uslovi._vrstaObaveze. for (int i = 0. _kljucneRijeci[j]) != nullptr) ima = false._vrstaObaveze == Integralni) { . d. napomena). } } ObavezeNaPredmetu * temp = new ObavezeNaPredmetu[_trenutnoIzvrsenihObaveza + 1]. sumaSeminarskih = 0. ParcijalniVeci = true.Unos(*_listaIzvrsenihObaveza[i]. Ukoliko je ispit polozen putem parcijalnih ispita.Unos(v. student takodjer mora imati pozitivno (ocjenom vecom od 5) ocijenjena najmanje dva seminarska i jedan prakticni rad. _listaIzvrsenihObaveza[i]. float najvecaOcjena = 0. brSeminarskih = 0. i++) { if (_listaIzvrsenihObaveza[i]. } } if (ima) return false. indexNajveceOcjene = -1. if (_kljucneRijeci[j] != NULL) { if (strstr(_listaIzvrsenihObaveza[i]. Takodjer. for (int i = 0. _konacnaOcjena = 5._napomena. sumaParcijalnih = 0. _trenutnoIzvrsenihObaveza++. brParcijalnih = 0. ocjena. datum polaganja je potrebno postaviti na vrijednost datuma posljednje izvrsene obaveze sa najvecom ocjenom. i++) temp[i]. _listaIzvrsenihObaveza[i]. int sumaIntegralnih = 0. _listaIzvrsenihObaveza[i]. temp[_trenutnoIzvrsenihObaveza].

_godina).Unos(*_listaIzvrsenihObaveza[indexNajveceOcjene]. if (brIntegralnih > 0 && brSeminarskih >= 2) _konacnaOcjena = float(sumaIntegralnih + sumaSeminarskih) / (brIntegralnih + brSeminarskih). } for (int j = 0._vrstaObaveze == Parcijalni1) { brParcijalnih++._datumIzvrsenja._vrstaObaveze == Prakticni) { brPrakticnih++._datumIzvrsenja) <= sumaDana(_listaIzvrsenihObaveza[indexParcijalnog1]._ocjena._mjesec. } brParcijalnih++. indexNajveceOcjene = i._napomena. *_listaIzvrsenihObaveza[indexNajveceOcjene]. *_listaIzvrsenihObaveza[indexNajveceOcjene]. sumaParcijalnih += _listaIzvrsenihObaveza[i]._datumIzvrsenja. sumaParcijalnih += _listaIzvrsenihObaveza[i]. } } if (_listaIzvrsenihObaveza[i]. } } } if(imaZabranjenu == true || ParcijalniVeci == false) return _konacnaOcjena. indexParcijalnog1 = i. sumaIntegralnih = _listaIzvrsenihObaveza[i]. return _konacnaOcjena. if (brParcijalnih == 2 && brSeminarskih >= 2 && brPrakticnih == 1) _konacnaOcjena = float(sumaParcijalnih + sumaSeminarskih + sumaPrakticnih) / (brParcijalnih + brSeminarskih + brPrakticnih)._ocjena. sumaPrakticnih += _listaIzvrsenihObaveza[i]. brIntegralnih++. } if (*_listaIzvrsenihObaveza[i]. j < 15. } if (*_listaIzvrsenihObaveza[i]._ocjena._ocjena._vrstaObaveze == Parcijalni2) { if (indexParcijalnog1 != -1) { if (sumaDana(_listaIzvrsenihObaveza[i]._ocjena > najvecaOcjena) { najvecaOcjena = _listaIzvrsenihObaveza[i]. if (_konacnaOcjena > 5) _datumPolaganja._ocjena._datumIzvrsenja._d an. sumaSeminarskih += _listaIzvrsenihObaveza[i]. _kljucneRijeci[j]) != nullptr) imaZabranjenu = true. j++) { if (_kljucneRijeci[j] != NULL) { if (strstr(_listaIzvrsenihObaveza[i]._ocjena. } if (*_listaIzvrsenihObaveza[i]. } . } if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Seminarski) { brSeminarskih++._datumIzvrsenja)) ParcijalniVeci = false.

6._listaIzvrsenihObaveza[lokacija]. }. datumParcijalni1. int lokacija. 7). i++) { if (p. datumParcijalni2. 6. void Ispis() {//testni ispis for (int i = 0. Datum datumSeminarski1. datumParcijalni1. float prosjek) { auto veceOD = [&p](float prosjek) { int brojac = 0._vrstaObaveze] << endl._listaIzvrsenihObaveza[lokacija]. 2017). else return 0. v.Unos(18. i++) { cout << vrste[*_listaIzvrsenihObaveza[i]. v. } else { return PretragaRekurzivno(p. float PretragaRekurzivno(PolozeniPredmet p.brojac+1). return PretragaRekurzivno(p. return veceOD(prosjek). minimalan broj dana prII. VrstaObaveze v. i < p._listaIzvrsenihObaveza[lokacija].Unos(10._datumIzvrsenja) >= sumaDana(d1) && sumaDana(p. 2017). ._vrstaObaveze == v) { prosjek += p.Unos(30._ocjena > prosjek) brojac++. Datum d1. } return brojac. } } } int GetBrojObavezaIznadProsjeka(PolozeniPredmet p.Unos(22. _kljucneRijeci[2] = "nije dostavio". d2. 2017). PolozeniPredmet prII. Datum d2._trenutnoIzvrsenihObaveza. lokacija + 1. ////naziv predmeta. 6. } else { if (sumaDana(p. i < _trenutnoIzvrsenihObaveza. datumSeminarski2._datumIzvrsenja) <= sumaDana(d2) && *p. for (int i = 0. _kljucneRijeci[1] = "ometao". datumSeminarski1._trenutnoIzvrsenihObaveza) { if (brojac != 0) return prosjek / brojac. float prosjek. d1._listaIzvrsenihObaveza[lokacija]._listaIzvrsenihObaveza[i]. d1.brojac)._ocjena. int brojac) { if (lokacija >= p. lokacija + 1. 6. prosjek.Unos("Programiranje II". } } }. prosjek. datumSeminarski2. d2. datumParcijalni2. } void main() { _kljucneRijeci[0] = "prepisivao". datumIntegralni. 2017).

DodajIzvrsenuObavezu(Parcijalni2.. if (prII.Unos(22. if (prII. 7. a izmedju izvrsenja pojedinih obaveza mora proci najmanje onoliko dana koliko je definisano vrijednoscu atributa _minimalanBrojDana. 6. 5.FormirajKonacnuOcjenu() << endl.Unos(1. ///*Koristeci lambda-u. "uslovno polozen ispit")) cout << "Parcijalni 1.DodajIzvrsenuObavezu(Parcijalni1. DO. Datum datumPrakticni.. datumSeminarski2. //Izbjegavati koristenje globalnih varijabli*/ float prosjek = PretragaRekurzivno(prII.. 6. datum polaganja drugog parcijalnog ispita ne smije biti raniji (manji) od datuma polaganja prvog parcijalnog ispita. DO.*/ if (prII. unutar funkcije GetBrojObavezaIznadProsjeka pronaci broj izvrsenih obaveza koje imaju istu ili vecu ocjenu od //prosjecne*/ . Ukoliko je ispit polozen putem parcijalnih ispita.Unos(1. 2017).dodan" << endl. DO. if (prII. 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). "implementirani svi algoritmi")) cout << "Seminarski1. datumParcijalni2.dodan" << endl. //*/ cout << "Konacna ocjena iz predmeta PRII je: " << prII. 0. datumParcijalni2. U slucaju da neki od navedenih uslova nije zadovoljen konacna ocjena treba biti postavljena na vrijednost 5. OD.. if (prII. Potrebno je onemoguciti dodavanje identicnih obaveza. osim formiranja konacne ocjene. 2017). a tokom ispita ometao druge studente")) cout << "Parcijalni 2.. 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). "previse gresaka. ///*Rekurzivna funkcija treba vratiti prosjecnu ocjenu uspjesno izvrsenih obaveze na predmetu odredjene vrste u definisanom periodu. datum polaganja je potrebno postaviti na vrijednost datuma posljednje izvrsene obaveze sa najvecom ocjenom. ///*Na osnovu vrijednosti primljenih parametara osigurati dodavanje novoizvrsene obaveze na predmetu. cout << "Konacna ocjena iz predmeta PRII je: " << prII. datumPrakticni. "")) cout << "Parcijalni 2. 0.. Seminarski. Takodjer. 1. 2017).DodajIzvrsenuObavezu(Seminarski. 2017). datumPrakticni.DodajIzvrsenuObavezu(Prakticni. if (prII.. datumSeminarski1.FormirajKonacnuOcjenu() << endl. ""))//dodao sam kako bi se moglo fino testirati da li funkcija radi cout << "Prakticni.dodan" << endl. cout << "Prosjecna ocjena izvrsenih obaveza je: " << prosjek << endl. datumParcijalni2.0).dodan" << endl. "rad slican kao kod studenta IB150388")) cout << "Seminarski2. datumParcijalni1. student takodjer mora imati pozitivno (ocjenom vecom od 5) ocijenjena najmanje dva seminarska i jedan prakticni rad. 6.. 7.DodajIzvrsenuObavezu(Seminarski.Unos(30.. Ukoliko su ispunjeni svi uslovi. Datum OD. 7.a za njeno formiranje student mora posjedovati polozen integralni ili dva parijcalna ispita.DodajIzvrsenuObavezu(Parcijalni2. OD.... 8.dodan" << endl. ///*Konacna ocjene predstavlja prosjecnu ocjenu na predmetu (prosjecnu ocjenu izvrsenih obaveza koje ispunjavaju uslove za uspjesno polaganje predmeta). 8.dodan" << endl.

Dealociraj(). } . prosjek). prII. int iznadProsjeka = GetBrojObavezaIznadProsjeka(prII.Dealociraj(). //datumIntegralni. //datumSeminarski2.Dealociraj(). //datumParcijalni1. system("pause").Dealociraj(). //datumParcijalni2. cout << "Broj izvrsenih obaveza iznad prosjeka je: " << iznadProsjeka << endl. //datumSeminarski1.Dealociraj().Dealociraj().