You are on page 1of 8

#include <iostream>

using namespace std;


//narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala
smetnje u radu
#pragma warning(disable:4996)

enum enumKursevi { HtmlCSSJavaScript, SoftwareEngeneeringFundamentals,


MasteringSQL, WindowsSecurity };
char *_ispisKurs[]{ "HtmlCSSJavaScript", "SoftwareEngeneeringFundamentals",
"MasteringSQL", "WindowsSecurity" };
char *crt = "\n--------------------------------------------\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 (d < 1 || m < 1 || m > 12 || g < 1920 || 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);
}
else Unos(1, 1, 1920);
}
int sumaDana() {
int brDana[]{ 31,28,31,30,31,30,31,31,30,31,30,31 }, suma = 0;
for (int i = 1920; i < *_godina; i++) {
if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
suma += 366;
else suma += 365;
}
for (int i = 1; i < *_mjesec; i++) {
if (i == 2 && ((*_godina % 4 == 0 && *_godina % 100 != 0) ||
*_godina % 400 == 0))
suma += 29;
else suma += brDana[i - 1];
}
suma += *_dan;
return suma;
}
void Ispis() { cout << *_dan << "/" << *_mjesec << "/" << *_godina; }
void Dealociraj() { delete _dan; delete _mjesec; delete _godina; _dan =
_mjesec = _godina = nullptr; }
};
bool DaLiSuIsti(Datum prvi, Datum drugi) {
return *prvi._godina == *drugi._godina && *prvi._mjesec == *drugi._mjesec &&
*prvi._dan == *drugi._dan;
}
bool StarijiOd15Dana(Datum kraj, Datum pocetak) {
return pocetak.sumaDana() - kraj.sumaDana() >= 15;
}
struct Kurs {
enumKursevi _kurs;
Datum * _pocetak;
Datum * _kraj;
char * _imePredavaca;
float _cijenaKursa;
void Unos(enumKursevi kurs, Datum pocetak, Datum kraj, char * imePredavaca,
float cijenaKursa) {
_kurs = kurs;
_pocetak = new Datum;
_pocetak->Unos(*pocetak._dan, *pocetak._mjesec, *pocetak._godina);
_kraj = new Datum;
_kraj->Unos(*kraj._dan, *kraj._mjesec, *kraj._godina);
int size = strlen(imePredavaca) + 1;
_imePredavaca = new char[size];
strcpy_s(_imePredavaca, size, imePredavaca);
_cijenaKursa = cijenaKursa;
}
void Ispis() {
cout << _ispisKurs[_kurs] << " " << _imePredavaca << " " <<
_cijenaKursa << " (";
_pocetak->Ispis(); cout << " - "; _kraj->Ispis(); cout << ")\n";
}
void Dealociraj() {
delete[] _imePredavaca; _imePredavaca = nullptr;
_pocetak->Dealociraj();
_kraj->Dealociraj();
delete _pocetak; _pocetak = nullptr;
delete _kraj; _kraj = nullptr;
}
};
struct Polaznik {
char * _imePrezime;
Datum * _datumRodjenja;
void Unos(char * imePrezime, Datum datumRodjenja) {
int size = strlen(imePrezime) + 1;
_imePrezime = new char[size];
strcpy_s(_imePrezime, size, imePrezime);
_datumRodjenja = new Datum;
_datumRodjenja->Unos(*datumRodjenja._dan, *datumRodjenja._mjesec,
*datumRodjenja._godina);
}
void Dealociraj() {
delete[] _imePrezime; _imePrezime = nullptr;
_datumRodjenja->Dealociraj();
delete _datumRodjenja; _datumRodjenja = nullptr;
}
void Ispis() { cout << _imePrezime << "("; _datumRodjenja->Ispis(); cout <<
")"; }
};
struct Prijava {
Polaznik * _polaznik; //prijava moze biti pojedinacna ili grupna
float * _uplaceniIznos;
/*za svakog polaznika ce se cuvati podatak o iznosu uplate. uplaceni iznos
svakog pojedinog polaznika treba biti jednak punoj cijeni kursa osim u sljedecim
slucajevima:
1. prijave 2 ili 3 polaznika dobijaju 10% popusta na ukupnu cijenu kursa
2. prijave za vise od 3 polaznika dobijaju 15% na ukupnu cijenu kursa
*/
int _trenutnoPolaznika;
Kurs * _kurs; //prijava treba cuvati adresu (pokazivati) na postojeci kurs, a
ne kreirati novi
void Unos(Kurs *k) {
_polaznik = nullptr;
_uplaceniIznos = new float(0);
_trenutnoPolaznika = 0;
_kurs = new Kurs(*k);
}
void Dealociraj() {
delete[]_uplaceniIznos; _uplaceniIznos = nullptr;
for (int i = 0; i < _trenutnoPolaznika; i++)
_polaznik[i].Dealociraj();
delete[]_polaznik; _polaznik = nullptr;
}
void Ispis() {
cout << crt + 1;
for (int i = 0; i < _trenutnoPolaznika; i++) {
_polaznik[i].Ispis(); cout << " Uplaceni Iznos : " <<
_uplaceniIznos[i] << endl;
}
}
int potrebnaUplata() {
float zaUplatiti = _kurs->_cijenaKursa; //formiranje cijene kursa
if (_trenutnoPolaznika == 2 || _trenutnoPolaznika == 3) //1
zaUplatiti = (_kurs->_cijenaKursa / 100) * 90; // popust od 10%
else if (_trenutnoPolaznika >= 4) //2
zaUplatiti = (_kurs->_cijenaKursa / 100) * 85; // popust od 15%
return zaUplatiti;
}
bool DodajPolaznika(Polaznik p, float uplata) {
if (uplata < potrebnaUplata() / 2) // 50% uplate
return false;
for (int i = 0; i < _trenutnoPolaznika; i++)
if (strcmp(p._imePrezime, _polaznik[i]._imePrezime) == 0 &&
DaLiSuIsti(*p._datumRodjenja, *_polaznik[i]._datumRodjenja))
return false; // dupliranje polaznika
if (_trenutnoPolaznika == 0) {
_polaznik = new Polaznik;
_polaznik->Unos(p._imePrezime, *p._datumRodjenja);
_uplaceniIznos = new float(uplata);
_trenutnoPolaznika++;
}
else {
Polaznik *tempp = new Polaznik[_trenutnoPolaznika + 1];
float *tempu = new float[_trenutnoPolaznika + 1];
for (int i = 0; i < _trenutnoPolaznika; i++) {
tempp[i] = _polaznik[i];
tempu[i] = _uplaceniIznos[i];
}
tempp[_trenutnoPolaznika].Unos(p._imePrezime, *p._datumRodjenja);
tempu[_trenutnoPolaznika] = uplata;
_trenutnoPolaznika++;
delete[]_polaznik;
delete[]_uplaceniIznos;
_polaznik = new Polaznik[_trenutnoPolaznika];
_uplaceniIznos = new float[_trenutnoPolaznika];
_polaznik = tempp;
_uplaceniIznos = tempu;
}
return true;
}
bool DodajUplatu(Polaznik p, float uplata) {
for (int i = 0; i < _trenutnoPolaznika; i++)
if (strcmp(p._imePrezime, _polaznik[i]._imePrezime) == 0 &&
DaLiSuIsti(*p._datumRodjenja, *_polaznik[i]._datumRodjenja)) {
_uplaceniIznos[i] += uplata; return true;
}
return false;
}
float StatusUplate(Polaznik p) {
int _indeksPolaznika;
for (int i = 0; i < _trenutnoPolaznika; i++) // trazim polaznika za
kojeg provjeravamo status uplate
if (strcmp(p._imePrezime, _polaznik[i]._imePrezime) == 0 &&
DaLiSuIsti(*p._datumRodjenja, *_polaznik[i]._datumRodjenja))
_indeksPolaznika = i;
return _uplaceniIznos[_indeksPolaznika] - potrebnaUplata(); //ukoliko
je uplaceni iznos manji, vratiti ce negativan broj
}
void sortPolaznike() {
for (int j = _trenutnoPolaznika; j > 0; j--)
for (int i = 1; i < j; i++)
if (StatusUplate(_polaznik[i]) < StatusUplate(_polaznik[i -
1])) { //sortiranje po najvisem dugovanju
swap(_polaznik[i], _polaznik[i - 1]);
swap(_uplaceniIznos[i], _uplaceniIznos[i - 1]);
}
}
};

struct SkillsCentar {
char * _nazivCentra;
Kurs * _kursevi[50];//JEDAN EDUKACIJSKI CENTAR MOZE NUDITI NAJVISE 50 KURSEVA
int _trenutnoKurseva;
Prijava * _prijave;
int _trenutnoPrijava;
void Unos(char *nazivCentra) {
int size = strlen(nazivCentra) + 1;
_nazivCentra = new char[size];
strcpy_s(_nazivCentra, size, nazivCentra);
for (int i = 0; i < 50; i++)
_kursevi[i] = nullptr;
_trenutnoKurseva = 0;
_prijave = nullptr;
_trenutnoPrijava = 0;
}
void Dealociraj() {
delete[]_nazivCentra; _nazivCentra = nullptr;
for (int i = 0; i < _trenutnoKurseva; i++) {
_kursevi[i]->Dealociraj();
delete _kursevi[i]; _kursevi[i] = nullptr;
}
for (int i = 0; i < _trenutnoPrijava; i++)
_prijave[i].Dealociraj();
delete[]_prijave; _prijave = nullptr;
}
void Ispis() {
cout << crt << "Naziv Centra : " << _nazivCentra << crt;
for (int i = 0; i < _trenutnoKurseva; i++) {
_prijave[i]._kurs->Ispis();
_prijave[i].sortPolaznike();
_prijave[i].Ispis();
cout << crt + 1;
}
}
bool DodajKurs(Kurs k) {
if (_trenutnoKurseva >= 50) return false;
for (int i = 0; i < _trenutnoKurseva; i++)
if (_kursevi[i]->_kurs == k._kurs && !
StarijiOd15Dana(*_kursevi[i]->_kraj, *k._pocetak))
return false; //prolazi kroz sve kurseve i provjerava
termine, ukoliko pronadje neki da ne ispunjava uslov vraca false
_kursevi[_trenutnoKurseva] = new Kurs;
_kursevi[_trenutnoKurseva]->Unos(k._kurs, *k._pocetak, *k._kraj,
k._imePredavaca, k._cijenaKursa);
_trenutnoKurseva++;
return true;
}
bool DodajPrijavu(Prijava p) {
bool pronadjen = false;
for (int i = 0; i < _trenutnoKurseva; i++) // da li postoji kurs u
EduCentru?
if (p._kurs->_kurs == _kursevi[i]->_kurs)
pronadjen = true;
if (!pronadjen)
return false;
else {
float _ukupnaUplata = 0;
for (int i = 0; i < p._trenutnoPolaznika; i++)
_ukupnaUplata += p._uplaceniIznos[i]; // ukupna uplata za
trenutni broj polaznika
if (_ukupnaUplata < ((p.potrebnaUplata() / 100) * 80) *
p._trenutnoPolaznika) // ukupna cijena kursa = broj polaznika * cijena po
polazniku(potrebna uplata)
return false; // <80%
if (_trenutnoPrijava == 0) {
_prijave = new Prijava(p);
_trenutnoPrijava++;
}
else {
Prijava *tempp = new Prijava[_trenutnoPrijava + 1];
for (int i = 0; i < _trenutnoPrijava; i++)
tempp[i] = _prijave[i];
tempp[_trenutnoPrijava] = p;
_trenutnoPrijava++;
delete[]_prijave;
_prijave = new Prijava[_trenutnoPrijava];
_prijave = tempp;

}
return true;
}
}
Polaznik * PolazniciDugovanja(int &_brojPolaznika) {
Polaznik *_lista = nullptr;
for (int i = 0; i < _trenutnoPrijava; i++)
for (int j = 0; j < _prijave[i]._trenutnoPolaznika; j++)
if (_prijave[i].StatusUplate(_prijave[i]._polaznik[j]) < 0)
{
if (_brojPolaznika == 0) {
_lista = new
Polaznik(_prijave[i]._polaznik[j]);
_brojPolaznika++;
}
else {
Polaznik *tempp = new Polaznik[_brojPolaznika +
1];
for (int e = 0; e < _brojPolaznika; e++)
tempp[e] = _lista[e];
tempp[_brojPolaznika] =
_prijave[i]._polaznik[j];
_brojPolaznika++;
delete[]_lista;
_lista = new Polaznik[_brojPolaznika];
_lista = tempp;
}
}
return _lista;
}
};
int PretragaRekurzivno(SkillsCentar centar, int _brojPrijava, int _najveciDug) {
if (_brojPrijava < 0)
return abs(_najveciDug);
else {
for (int i = 0; i < centar._prijave[_brojPrijava]._trenutnoPolaznika;
i++) {
if
(centar._prijave[_brojPrijava].StatusUplate(centar._prijave[_brojPrijava]._polaznik
[i]) < _najveciDug)
_najveciDug =
centar._prijave[_brojPrijava].StatusUplate(centar._prijave[_brojPrijava]._polaznik[
i]);
}
PretragaRekurzivno(centar, _brojPrijava - 1, _najveciDug);
}
}
void main() {

/*
1. BROJ I TIPOVI PARAMETARA MORAJU BITI IDENTICNI ONIMA U TESTNOM CODE-U
(OSIM UKOLIKO IMATE OPRAVDANU POTREBU ZA MODIFIKACIJOM). U SUPROTNOM SE RAD NEE
BODOVATI
2. KREIRAJTE .DOC FAJL SA VAIM BROJEM INDEKSA ( NPR. IB130030.DOC BEZ IMENA
I PREZIMENA), TE NA KRAJU ISPITA U NJEGA KOPIRAJTE RJEENJA VAIH ZADATAKA.
NE PREDAVATI .TXT ILI .CPP FAJLOVE. TAKOER, UKLONITE SVE DIJELOVE CODE-A
KOJI NISU IMPLEMENTIRANI
3. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORITENJE HELP-A
4. TOKOM IZRADE ISPITA MOGU BITI POKRENUTA SAMO TRI PROGRAMA: PDF READER
(ISPITNI ZADACI), MS VISUAL STUDIO, MS WORD (U KOJI ETE KOPIRATI VAA RJEENJA)
5. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAENI, SVI STUDENTI KOJI SU
PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
*/

Datum datum1, datum2, datum3, datum4, datum5, datum6, rodjendan;


datum1.Unos(26, 11, 2015);
datum2.Unos(29, 5, 2016);
datum3.Unos(5, 6, 2016);
datum4.Unos(15, 8, 2016);
datum5.Unos(13, 7, 2016);
datum6.Unos(22, 9, 2016);
rodjendan.Unos(15, 6, 1995);

Kurs softverski, html, sql, security;


softverski.Unos(SoftwareEngeneeringFundamentals, datum1, datum2, "Emina
Junuz", 1800);
html.Unos(HtmlCSSJavaScript, datum2, datum3, "Larisa Tipura", 1000);
sql.Unos(MasteringSQL, datum3, datum4, "Jasmin Azemovic", 2230);
security.Unos(WindowsSecurity, datum3, datum4, "Adel Handzic", 4000);

Polaznik denis, zanin, indira, dubravka;


denis.Unos("Denis Music", rodjendan);
zanin.Unos("Zanin Vejzovic", rodjendan);
indira.Unos("Indira Hamulic", rodjendan);
dubravka.Unos("Dubravka Plosko", rodjendan);

Prijava denisZaninDubravkaHtml, zaninIndiraHtml, indiraSql;


denisZaninDubravkaHtml.Unos(&html);
//700 predstavlja uplatu polaznika koji se prijavljuje na kurs
if (denisZaninDubravkaHtml.DodajPolaznika(denis, 700))//tokom prijave
polaznika nije potrebno uplatiti kompletan iznos, ali on mora biti veci od 50%
iznosa kojeg je u tom momentu potrebno platiti (u zavisnosti od broja prijavljenih
tj. ostvarenog popusta)
cout << "Polaznik uspjesno dodan!" << endl;
if (denisZaninDubravkaHtml.DodajPolaznika(zanin, 650))
cout << "Polaznik uspjesno dodan!" << endl;
if (denisZaninDubravkaHtml.DodajPolaznika(zanin, 650))//onemoguciti
dupliranje polaznika na istoj prijavi
cout << "Polaznik uspjesno dodan!" << endl;
if (denisZaninDubravkaHtml.DodajPolaznika(dubravka, 430))//uplata ne
zadovoljava kriterije
cout << "Polaznik uspjesno dodan!" << endl;

if (denisZaninDubravkaHtml.DodajUplatu(zanin, 200))//polaznik mora biti


prethodno dodan prijavi da bi mogao dodati novu uplatu
cout << "Uplata uspjesno dodana" << endl;

zaninIndiraHtml.Unos(&html);
if (zaninIndiraHtml.DodajPolaznika(zanin, 800))
cout << "Polaznik uspjesno dodan!" << endl;
if (zaninIndiraHtml.DodajPolaznika(indira, 750))
cout << "Polaznik uspjesno dodan!" << endl;

float stanjeUplate = denisZaninDubravkaHtml.StatusUplate(zanin);//ako


polaznik duguje novca funkcija vraca negativan iznos potrebne uplate
cout << "Polaznik "; zanin.Ispis();
if (stanjeUplate > 0)
cout << " je u pretplati " << stanjeUplate << " KM" << endl;
else
cout << " je duzan uplatiti " << stanjeUplate * -1 << " KM" << endl;

SkillsCentar mostar;
mostar.Unos("Skills Center Mostar");
//jedan edukacijski centar moze moze nuditi vise istih kurseva (npr.
MasteringSQL), ali novi kurs moze poceti tek 15 dana nakon zavrsetka prethodnog
kursa npr.
//ako prethodni kurs MasteringSQL traje 01.03.2016 - 01.04.2016, onda se novi
kurs MasteringSQL moze poceti nakon 15.04.2016
if (mostar.DodajKurs(softverski)) {
cout << crt + 1 << "KURS USPJESNO REGISTROVAN" << crt;
softverski.Ispis();
cout << crt + 1;
}
if (mostar.DodajKurs(html)) {
cout << crt + 1 << "KURS USPJESNO REGISTROVAN" << crt;
html.Ispis();
cout << crt + 1;
}
//nije moguce dodati prijavu onog kursa koji nije evidentiran (registrovan,
ponudjen) u tom edukacijskom centru
//moguce je dodati samo one prijave koje kod kojih ukupna uplata iznosi vise
od 80% cijene kursa (za prijavljeni broj polaznika)
if (mostar.DodajPrijavu(denisZaninDubravkaHtml)) {
cout << crt + 1 << "PRIJAVA EVIDENTIRANA" << crt;
denisZaninDubravkaHtml.Ispis();
}
if (mostar.DodajPrijavu(zaninIndiraHtml)) {
cout << crt + 1 << "PRIJAVA EVIDENTIRANA" << crt;
zaninIndiraHtml.Ispis();
}
int brojPolaznika = 0;
//vraca niz polaznika koji nisu izmirili uplate
Polaznik * polazniciDugovanja = mostar.PolazniciDugovanja(brojPolaznika);

cout << crt + 1 << "Pronadjeno " << brojPolaznika << " polaznika koji nisu
kompletirali svoje uplate --->>> \n";
for (size_t i = 0; i < brojPolaznika; i++) {
polazniciDugovanja[i].Ispis(); cout << endl;
}
cout << crt + 1;
//PretragaRekurzivno - rekurzivna funkcija pronalazi najveci iznos duga
ostvarenog u odredjenom edukacijskom centru
cout << "\nNajveci dug iznosi : " << PretragaRekurzivno(mostar,
mostar._trenutnoPrijava - 1, 0) << " KM" << endl;
//ispisuje sve informacije o edukacijskom centru. prije ispisa sortirati sve
prijave po visini dugovanja njenih polaznika
mostar.Ispis();

//izvrsiti potrebne dealokacije


datum1.Dealociraj(); datum2.Dealociraj(); datum3.Dealociraj();
datum4.Dealociraj(); datum5.Dealociraj(); datum6.Dealociraj();
rodjendan.Dealociraj();
softverski.Dealociraj(); html.Dealociraj(); security.Dealociraj();
sql.Dealociraj();
denis.Dealociraj(); zanin.Dealociraj(); indira.Dealociraj();
dubravka.Dealociraj();
mostar.Dealociraj();
system("pause");
}

You might also like