Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ConsoleApplication37.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include<iostream>
- #include<memory>
- #include<cstring>
- using namespace std;
- enum VrstaObaveze { 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;// moramo vratiti na nulu pokazivace
- _dan = nullptr; _mjesec = nullptr; _godina = nullptr;}
- bool provjeraDana(Datum date,int brojDana)
- {
- if (_godina==date._godina)
- {
- if (_mjesec==date._mjesec)
- {
- if (_dan-date._dan<brojDana)
- {
- 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);
- _datumIzvrsenja = datum;
- _ocjena = ocjena;
- _napomena = new char[strlen(napomena) + 1];
- strcpy_s(_napomena, strlen(napomena) + 1, napomena);
- }
- void Ispis() {
- cout << _vrstaObaveze<< " " << _ocjena << " " << _napomena;
- _datumIzvrsenja.Ispis();
- cout << endl;
- }
- void Dealociraj() {
- //_datumIzvrsenja.Dealociraj(); ne mozemo varijablu dealocirati pokazivac se dealocira
- 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;
- }
- void Dealociraj() {
- //_datumPolaganja.Dealociraj(); ne moze se varijabla dealocirati mora biti pokazivac
- delete[] _nazivPredmeta; _nazivPredmeta = nullptr;
- for (size_t i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- _listaIzvrsenihObaveza[i].Dealociraj();
- delete[]_listaIzvrsenihObaveza;
- }
- bool DodajIzvrsenuObavezu(VrstaObaveze vrsta, Datum date, int ocjena, const char*napomena)
- {
- const char *pok = nullptr;
- for (int j = 0; j < 3; j++)
- {
- pok = strstr(napomena, _kljucneRijeci[j]);
- if (pok != nullptr)
- {
- cout << "Ne smije sadrzavati kljucne rijeci" << endl;
- return false;
- }
- }
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- if (_listaIzvrsenihObaveza[i]._datumIzvrsenja.provjeraDana(date,_minimalanBrojDana) == false)
- {
- cout << "Datum 1 mora biti manji datuma 2" << endl;
- return false;
- }
- if (*_listaIzvrsenihObaveza[i]._vrstaObaveze==vrsta && _listaIzvrsenihObaveza[i]._ocjena>5 && vrsta!=Seminarski)
- {
- cout << "Ocjena i vrsta" << endl;
- return false;
- }
- }
- if (_trenutnoIzvrsenihObaveza==0)
- {
- _listaIzvrsenihObaveza = new ObavezeNaPredmetu;
- _listaIzvrsenihObaveza->Unos(vrsta, date, ocjena, napomena);
- _trenutnoIzvrsenihObaveza++;
- }
- else
- {
- ObavezeNaPredmetu *temp = new ObavezeNaPredmetu[_trenutnoIzvrsenihObaveza + 1];
- temp[_trenutnoIzvrsenihObaveza].Unos(vrsta, date, ocjena, napomena);
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- temp[i] = _listaIzvrsenihObaveza[i];
- }
- _trenutnoIzvrsenihObaveza++;
- _listaIzvrsenihObaveza = nullptr;
- _listaIzvrsenihObaveza = new ObavezeNaPredmetu[_trenutnoIzvrsenihObaveza];
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- _listaIzvrsenihObaveza[i] = temp[i];
- }
- delete[]temp;
- temp = nullptr;
- }
- }
- int FormirajKonacnuOcjenu()
- {
- int brojacPar=0, brojacSem=0, brojacPrak = 0,brojacDat=0;
- Datum par1, par2;
- bool temp = true;
- for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
- {
- if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Integralni)
- {
- _konacnaOcjena = _listaIzvrsenihObaveza[i]._ocjena;
- _datumPolaganja = _listaIzvrsenihObaveza[i]._datumIzvrsenja;
- return _konacnaOcjena;
- }
- if (*_listaIzvrsenihObaveza[i]._vrstaObaveze== Parcijalni1 || *_listaIzvrsenihObaveza[i]._vrstaObaveze==Parcijalni2)
- {
- if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Parcijalni1)
- {
- par1 = _listaIzvrsenihObaveza[i]._datumIzvrsenja;
- brojacDat++;
- }
- if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Parcijalni2)
- {
- par2 = _listaIzvrsenihObaveza[i]._datumIzvrsenja;
- brojacDat++;
- }
- if (brojacDat == 2)
- {
- if (*par1._mjesec > *par2._mjesec)
- {
- if (*par1._dan > *par2._dan)
- {
- cout << "Datum prvog parcijalnog mora biti manji od datuma drugog parcijalnog";
- _konacnaOcjena = 5;
- temp = false;
- }
- }
- }
- char *pok = nullptr;
- for (int j = 0; j < 3; j++)
- {
- pok = strstr(_listaIzvrsenihObaveza[i]._napomena, _kljucneRijeci[j]);
- if (pok != nullptr)
- {
- cout << "Ne smije biti kljucnih rijeci" << endl;
- _konacnaOcjena = 5;
- return _konacnaOcjena;
- }
- }
- if (_listaIzvrsenihObaveza[i]._ocjena<=5)
- {
- cout << "Obaveze moraju imati vecu ocjenu od 5" << endl;
- _konacnaOcjena = 5;
- temp = false;
- }
- if (temp==true)
- {
- _konacnaOcjena += _listaIzvrsenihObaveza[i]._ocjena;
- brojacPar++;
- }
- }
- if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Seminarski)
- {
- if (_listaIzvrsenihObaveza[i]._ocjena>5)
- {
- brojacSem++;
- }
- }
- if (*_listaIzvrsenihObaveza[i]._vrstaObaveze==Prakticni)
- {
- brojacPar;
- }
- if (brojacPar>=2)
- {
- if (brojacSem>=2)
- {
- if (brojacPrak>0)
- {
- _konacnaOcjena /= 5;
- return _konacnaOcjena;
- }
- }
- }
- }
- _konacnaOcjena = 5;
- return _konacnaOcjena;
- }
- };
- bool ODDO(Datum OD, Datum DO, Datum DatObaveze)
- {
- if (*OD._godina<*DatObaveze._godina<*DO._godina)
- {
- return true;
- }
- if (*OD._godina==*DatObaveze._godina==*DO._godina)
- {
- if (*OD._mjesec<*DatObaveze._mjesec<*DO._mjesec)
- {
- return true;
- }
- if (*OD._mjesec==*DatObaveze._mjesec==*DO._mjesec)
- {
- if (*OD._dan==*DatObaveze._dan<*DO._dan)
- {
- return true;
- }
- }
- }
- }
- float PretragaRekurzivno(PolozeniPredmet predmet, VrstaObaveze vrsta, Datum OD, Datum DO, int brojac, float prosjek)
- {
- int brojac2 = 0;
- if (predmet._trenutnoIzvrsenihObaveza==brojac)
- {
- for (int i = 0; i < predmet._trenutnoIzvrsenihObaveza; i++)
- {
- if (*predmet._listaIzvrsenihObaveza[i]._vrstaObaveze == vrsta)
- {
- if (ODDO(OD, DO, predmet._listaIzvrsenihObaveza[i]._datumIzvrsenja) == true)
- {
- brojac2++;
- }
- }
- }
- return prosjek /= brojac2;
- }
- else
- {
- if (*predmet._listaIzvrsenihObaveza[brojac]._vrstaObaveze == vrsta)
- {
- if (ODDO(OD, DO, predmet._listaIzvrsenihObaveza[brojac]._datumIzvrsenja) == true)
- {
- prosjek += predmet._listaIzvrsenihObaveza[brojac]._ocjena;
- }
- }
- return PretragaRekurzivno(predmet, vrsta, OD, DO, brojac+1, prosjek);
- }
- }
- int GetBrojObavezaIznadProsjeka(PolozeniPredmet predmet, float prosjek)
- {
- int brojac = 0,brojac2=0;
- auto lambd=[&brojac](PolozeniPredmet predmet,float prosjek)
- {
- for (int i = 0; i < predmet._trenutnoIzvrsenihObaveza; i++)
- {
- if (predmet._listaIzvrsenihObaveza[i]._ocjena>prosjek)
- {
- brojac=brojac+1;
- }
- }
- return brojac;
- };
- brojac2=lambd(predmet,prosjek);
- return brojac2;
- }
- 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(); ne mozemo dealocirati kada ga nismo unusili
- prII.Dealociraj();
- system("pause>0");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement