Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
- #include <iostream>
- #include <fstream>
- using namespace std;
- #pragma warning(disable:4996)
- enum VrstaObaveze { Seminarski, Parcijalni1, Parcijalni2, Integralni, Prakticni };
- char * vrstaobavezeChar[] = { "Seminarski", "Parcijalni1", "Parcijalni2", "Integralni", "Prakticni" };
- struct Datum
- {
- int *_dan, *_mjesec, *_godina;
- void Unos(int d, int m, int g)
- {
- _dan = &d; _mjesec = &m; _godina = &g;
- }
- void Ispis()
- {
- cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl;
- }
- void Dealociraj()
- {
- delete _dan; _dan = nullptr;
- delete _mjesec; _mjesec = nullptr;
- delete _godina; _godina = nullptr;
- }
- bool provjeraDatum15Dana(Datum datum)
- {
- if (*datum._godina > *_godina)
- return true;
- else if (*datum._godina == *_godina && *datum._mjesec > *_mjesec)
- return true;
- else if (*datum._godina == *_godina && *datum._mjesec == *_mjesec && *datum._dan - *_dan > 15)
- return true;
- else return false;
- }
- };
- struct ObavezeNaPredmetu {
- VrstaObaveze _vrstaObaveze;
- Datum * _datumIzvrsenja;
- char * _napomena;
- int _ocjena; // 5 - 10
- void Unos(VrstaObaveze vrsta, Datum * datum, int ocjena, char * napomena)
- {
- _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: " << vrstaobavezeChar[_vrstaObaveze] << endl;
- cout << "Ocjena: " << _ocjena << endl;
- cout << "Napomena:" << _napomena << endl;
- cout << "Datun izvrsenja:";
- _datumIzvrsenja->Ispis();
- cout << endl;
- }
- void Dealociraj()
- {
- _datumIzvrsenja->Dealociraj();
- delete[] _datumIzvrsenja; _datumIzvrsenja = nullptr;
- delete[] _napomena; _napomena = nullptr;
- }
- //omogucava dodavanje dodatnih napomena vezano za obeveze na predmetu
- void DodajNapomenu(char * napomena)
- {
- int size = strlen(napomena) + 1;
- _napomena = new char[size];
- strcpy_s(_napomena, size, napomena);
- }
- };
- struct PolozeniPredmet
- {
- char * _nazivPredmeta;
- ObavezeNaPredmetu * _listaIzvrsenihObaveza[10];//ogranicen je broj izvrsenih obavezan na predmetu
- int _trenutnoIzvrsenihObaveza;
- int _konacnaOcjena; //formira se na osnovu ocjena izvrsenih obaveza
- char * ocjenaKaoNizKaraktera()
- {
- char ocjena[3];
- _itoa_s(_konacnaOcjena, ocjena, 10);
- char * niz = new char[3];
- strcpy_s(niz, 3, ocjena);
- return niz;
- }
- bool dodajPredmet(ObavezeNaPredmetu obevaze)
- {
- 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(obevaze._vrstaObaveze, obevaze._datumIzvrsenja, obevaze._ocjena, obevaze._napomena);
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- _listaIzvrsenihObaveza[i]->Dealociraj();
- }
- delete[] _listaIzvrsenihObaveza;
- _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza] = temp;
- _trenutnoIzvrsenihObaveza++;
- return true;
- }
- void Unos(char * naziv)
- {
- int size = strlen(naziv) + 1;
- _nazivPredmeta = new char[size];
- strcpy_s(_nazivPredmeta, size, naziv);
- _trenutnoIzvrsenihObaveza = 0;
- _konacnaOcjena = 5;
- }
- void Dealociraj()
- {
- delete[] _nazivPredmeta; _nazivPredmeta = nullptr;
- for (size_t i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- _listaIzvrsenihObaveza[i]->Dealociraj();
- delete[] _listaIzvrsenihObaveza[i];
- _listaIzvrsenihObaveza[i] = nullptr;
- }
- }
- void Ispis()
- {
- //cout << "Naziv predmeta:" << _nazivPredmeta << endl;
- cout << "Konacna ocjena: " << _konacnaOcjena << endl;
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- _listaIzvrsenihObaveza[i]->Ispis();
- }
- /*
- 1. DodajIzvrsenuObavezu – na osnovu vrijednosti primljenog parametra osigurati dodavanje novoizvrsene obaveze na predmetu.
- Potrebno je onemoguciti dodavanje identicnih obaveza. Identicna vrsta obaveze se moze dodati samo u slucaju da se radi o Prakticno radu ili je prethodno
- dodana obaveza (identicne vrste) imala ocjenu 5.*/
- bool DodajIzvrsenuObavezu(ObavezeNaPredmetu obaveza)
- {
- if (_trenutnoIzvrsenihObaveza > 10)
- {
- cout << "Max broj obaveza je 10. " << endl;
- return false;
- }
- if (_trenutnoIzvrsenihObaveza > 0)
- {
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == obaveza._vrstaObaveze && _listaIzvrsenihObaveza[i]->_ocjena != 5 &&
- obaveza._vrstaObaveze != Prakticni)
- {
- cout << "Obaveza vec dodana. " << endl;
- return false;
- }
- }
- _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza] = new ObavezeNaPredmetu;
- _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza]->Unos(obaveza._vrstaObaveze, obaveza._datumIzvrsenja, obaveza._ocjena, obaveza._napomena);
- _trenutnoIzvrsenihObaveza++;
- cout << "Dodan: ";
- return true;
- }
- if (_trenutnoIzvrsenihObaveza == 0)
- {
- _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza] = new ObavezeNaPredmetu;
- _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza]->Unos(obaveza._vrstaObaveze, obaveza._datumIzvrsenja, obaveza._ocjena, obaveza._napomena);
- _trenutnoIzvrsenihObaveza++;
- cout << "Dodan: ";
- return true;
- }
- }
- /*
- 2. FormirajKonacnuOcjenu - formiranje konacne ocjene se vrsi prema sljedecim pravilima: 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
- okviru kojih nije evidentirana losa napomena (rijeci koje oznacavaju losu napomenu: nije dobro, kopirano, nije ispravljeno); u slucaju da je ispit
- polozen putem integralnog ispita student mora imati polozen i prakticni ispit (polozen najkasnije 15 dana od dana polaganja integralnog ispita).
- */
- float FormirajKonacnuOcjenu()
- {
- int brojParcijalnih1 = 0;
- int brojParcijalnih2 = 0;
- int brojSeminarskih = 0;
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Integralni && _listaIzvrsenihObaveza[i]->_ocjena > 5)
- {
- if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Prakticni &&
- _listaIzvrsenihObaveza[i]->_datumIzvrsenja->provjeraDatum15Dana(*_listaIzvrsenihObaveza[i]->_datumIzvrsenja) == false)
- {
- _konacnaOcjena = _listaIzvrsenihObaveza[i]->_ocjena;
- return _konacnaOcjena;
- }
- }
- if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni1 && _listaIzvrsenihObaveza[i]->_ocjena > 5)
- brojParcijalnih1++;
- if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni2 && _listaIzvrsenihObaveza[i]->_ocjena > 5)
- brojParcijalnih2++;
- if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Seminarski && _listaIzvrsenihObaveza[i]->_ocjena > 5 &&
- strstr(_listaIzvrsenihObaveza[i]->_napomena, "nije dobro") == NULL || strstr(_listaIzvrsenihObaveza[i]->_napomena, "kopirano") == NULL ||
- strstr(_listaIzvrsenihObaveza[i]->_napomena, "nije ispravljeno") == NULL)
- brojSeminarskih++;
- }
- if (brojParcijalnih1 >= 1 && brojParcijalnih2 >= 1 && brojSeminarskih >= 2)
- {
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Seminarski && _listaIzvrsenihObaveza[i]->_ocjena > 5)
- _konacnaOcjena += _listaIzvrsenihObaveza[i]->_ocjena;
- if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni1 && _listaIzvrsenihObaveza[i]->_ocjena > 5)
- _konacnaOcjena += _listaIzvrsenihObaveza[i]->_ocjena;
- if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni2 && _listaIzvrsenihObaveza[i]->_ocjena > 5)
- _konacnaOcjena += _listaIzvrsenihObaveza[i]->_ocjena;
- }
- return _konacnaOcjena / (brojParcijalnih1 + brojParcijalnih2 + brojSeminarskih);
- }
- else
- {
- cout << "Nisu ispunjene sve obaveza prema predmetu! " << endl;
- _konacnaOcjena = 5;
- return _konacnaOcjena;
- }
- }
- };
- struct Student {
- char * _imePrezime;
- char * _brojIndeksa;
- PolozeniPredmet * _polozeniPredmeti;
- int _brojPolozenih;
- void Unos(char * IB, char * imePrezime) {
- int size = strlen(imePrezime) + 1;
- _imePrezime = new char[size];
- strcpy_s(_imePrezime, size, imePrezime);
- size = strlen(IB) + 1;
- _brojIndeksa = new char[size];
- strcpy_s(_brojIndeksa, size, IB);
- _brojPolozenih = 0;
- _polozeniPredmeti = nullptr;
- }
- void Ispis()
- {
- cout << "Broj indeksa:" << _brojIndeksa << endl;
- cout << "Ime i prezime: " << _imePrezime << endl;
- for (int i = 0; i < _brojPolozenih; i++)
- _polozeniPredmeti[i].Ispis();
- }
- void Dealociraj() {
- delete[] _imePrezime; _imePrezime = nullptr;
- delete[] _brojIndeksa; _brojIndeksa = nullptr;
- for (size_t i = 0; i < _brojPolozenih; i++)
- _polozeniPredmeti[i].Dealociraj();
- delete[] _polozeniPredmeti;
- _polozeniPredmeti = nullptr;
- }
- /*
- 1. DodajPolozeniPredmet - na osnovu vrijednosti primljenog parametra osigurati dodavanje novopolozenog predmeta.
- Potrebno je onemoguciti dodavanje identicnih predmeta,
- predmeta koja ne posjeduju formiranu konacnu ocjenu,
- te predmeta kod kojih je u napomeni neke od izvrsenih obaveza navedena rijec'prepisivao' ili 'izbacen'.*/
- bool DodajPolozeniPredmet(PolozeniPredmet predmet)
- {
- for (int i = 0; i < _brojPolozenih; i++)
- {
- if (_brojPolozenih > 0)
- {
- if (_polozeniPredmeti[i]._konacnaOcjena < 5 || _polozeniPredmeti[i]._konacnaOcjena>10)
- {
- cout << "Nije formirana ispravna konacna ocjena";
- return false;
- }
- if (strcmp(_polozeniPredmeti[i]._nazivPredmeta, predmet._nazivPredmeta) == 0)
- {
- cout << "Identicni predmet vec dodan. " << endl;
- return false;
- }
- for (int j = 0; j < _polozeniPredmeti[i]._trenutnoIzvrsenihObaveza; j++)
- {
- if (strstr(_polozeniPredmeti[i]._listaIzvrsenihObaveza[j]->_napomena, "prepisivao") != NULL ||
- strstr(_polozeniPredmeti[i]._listaIzvrsenihObaveza[j]->_napomena, "izbacen") != NULL)
- {
- cout << "Napomena x. " << endl;
- return false;
- }
- }
- }
- }
- if (_brojPolozenih == 0)
- {
- _polozeniPredmeti = new PolozeniPredmet;
- _polozeniPredmeti->Unos(predmet._nazivPredmeta);
- _brojPolozenih++;
- cout << "Dodano: ";
- return true;
- }
- }
- /*/
- 2. PronadjiNajuspjesnijuObavezu - vraca pokazivac na predmet u okviru koga je student ostvario najvecu ocjenu tokom realizacije odredjene obaveze
- (vrsta obaveze je proslijedjena kao parametar). Ukoliko postoje dva identicna predmeta, onda funkcija vraca pokazivac na posljednje pronadjeni predmet.
- U slucaju da obaveza nije pronadjena, funkcija vraca nullptr.
- */
- PolozeniPredmet * PronadjiNajuspjesnijuObavezu(VrstaObaveze obaveza)
- {
- PolozeniPredmet * temp = nullptr;
- return temp;
- }
- };
- /*
- 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"
- 2. UcitajIzBinarnogFajla - u objekat koji je primljen kao parametar ucitava sadrzaj binarnog fajla (naziv fajla je takodjer proslijedjen kao parametar)
- */
- void UpisiUBinarniFajl(PolozeniPredmet predmet)
- {
- char nazivFajla[100];
- strcpy_s(nazivFajla, predmet._nazivPredmeta);
- strcat_s(nazivFajla, "_");
- strcat_s(nazivFajla, predmet.ocjenaKaoNizKaraktera());
- ofstream upis(nazivFajla, ios::out | ios::binary);
- if (upis.is_open())
- {
- upis.write((char*)(&predmet), sizeof(predmet));
- cout << "Fajl: " << nazivFajla << " uspjesno upisan. " << endl;
- }
- else
- cout << "Greska prilikom upisa fajla: " << nazivFajla << endl;
- upis.close();
- }
- void UcitajIzBinarnogFajla(PolozeniPredmet & predmet, char * nazivPredemta)
- {
- // greska prilikom ucitavanja iz binarnog fajla je zbog naziva predmeta "Programiranje II_6"
- //jer takav naziv predemta nije učitan, učitan je naziv "Programiranje II, ukoliko bi kao naziv predmeta umjesto "Programiranje II_6" proslijedili
- //"Programiranje II" fajl bi bio uspješno učitan
- ifstream ispis(nazivPredemta, ios::in | ios::binary);
- if (ispis.is_open())
- {
- ispis.read((char*)(&predmet), sizeof(predmet));
- cout << "Fajl: " << nazivPredemta << " je uspjesno ucitan... " << endl;
- }
- else
- cout << "Greska prilikom citanja u fajl : " << nazivPredemta << endl;
- ispis.close();
- }
- void main() {
- /*
- 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE 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 ĆETE 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);
- ObavezeNaPredmetu parcijalni1, parcijalni2, seminarski1, seminarski2;
- parcijalni1.Unos(Parcijalni1, &datumParcijalni1, 6, "uslovno polozen");
- parcijalni2.Unos(Parcijalni2, &datumParcijalni2, 5, "previse gresaka");
- parcijalni2.DodajNapomenu("sugerisati da se vise paznje obrati na rad sa dinamickim nizovima");
- //parcijalni2.Ispis();//dodano radi testiranja
- seminarski1.Unos(Seminarski, &datumSeminarski1, 8, "implementirani svi algoritmi");
- seminarski1.DodajNapomenu("predloziti ucesce na FITCC 2017");//omogucava dodavanje dodatnih napomena vezano za obeveze na predmetu
- //seminarski1.Ispis(); //dodano radi testiranja
- seminarski2.Unos(Seminarski, &datumSeminarski2, 6, "rad slican kao kod studenta IB150388");
- //polozeni predmet
- PolozeniPredmet prII, prII_FromFile;
- prII.Unos("Programiranje II");
- if (prII.DodajIzvrsenuObavezu(parcijalni1))
- cout << "Parcijalni 1...dodan" << endl;
- if (prII.DodajIzvrsenuObavezu(parcijalni2))
- cout << "Parcijalni 2...dodan" << endl;
- if (prII.DodajIzvrsenuObavezu(seminarski1))
- cout << "Seminarski1...dodan" << endl;
- if (prII.DodajIzvrsenuObavezu(seminarski2))
- cout << "Seminarski2...dodan" << endl;
- datumParcijalni2.Unos(22, 7, 2016);
- parcijalni2._datumIzvrsenja = &datumParcijalni2;
- if (prII.DodajIzvrsenuObavezu(parcijalni2))
- cout << "Parcijalni 2...dodan" << endl;
- cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
- //manipulacija fajlovima
- UpisiUBinarniFajl(prII);
- prII.Ispis();
- UcitajIzBinarnogFajla(prII_FromFile, "Programiranje II_6");
- prII_FromFile.Ispis();
- Student jasmin;
- jasmin.Unos("IB130031", "Jasmin Azemovic");
- if (jasmin.DodajPolozeniPredmet(prII))
- cout << "PRII uspjesno dodan!" << endl;
- //PolozeniPredmet * p = jasmin.PronadjiNajuspjesnijuObavezu(Seminarski);
- //cout << "Najuspjesniji seminarski je realizovan u okviru predmeta "; p->Ispis();
- jasmin.Ispis();
- //izvrsiti potrebne dealokacije
- system("PAUSE");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement