Advertisement
EnsarMeskovic

[PRII] PolozeniPredmeti/IzvrseneObaveze - Pretraga

Jul 1st, 2016
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.81 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3. enum VrstaObaveze { Seminarski, Parcijalni1, Parcijalni2, Integralni, Prakticni };
  4. char *vrstaObaveze[] = { "Seminarski","Prvi Parcijalni","Drugi Parcijalni","Integralni","Prakticni" };
  5. struct Datum {
  6.     int * _dan, *_mjesec, *_godina;
  7.     void Unos(int d, int m, int g) {
  8.         _dan = new int(d);
  9.         _mjesec = new int(m);
  10.         _godina = new int(g);
  11.     }
  12.     void Ispis() { cout << "[ " << *_dan << "/"<< *_mjesec <<"/"<< *_godina << " ] "; }
  13.     void Dealociraj() { delete _dan; delete _mjesec; delete _godina; _dan = nullptr; _mjesec = nullptr; _godina = nullptr; }
  14. };
  15. struct ObavezeNaPredmetu {
  16.     VrstaObaveze _vrstaObaveze;
  17.     Datum * _datumIzvrsenja;
  18.     char * _napomena;
  19.     int _ocjena; // 5 - 10
  20.     void Unos(VrstaObaveze vrsta, Datum * datum, int ocjena, char * napomena) {
  21.         _vrstaObaveze = vrsta;
  22.         _datumIzvrsenja = new Datum;
  23.         _datumIzvrsenja->Unos(*datum->_dan, *datum->_mjesec, *datum->_godina);
  24.         _ocjena = ocjena;
  25.         int size = strlen(napomena) + 1;
  26.         _napomena = new char[size];
  27.         strcpy_s(_napomena, strlen(napomena)+1, napomena);
  28.     }
  29.     void Ispis() {
  30.         _datumIzvrsenja->Ispis();
  31.         cout << vrstaObaveze[_vrstaObaveze] << " : " << _ocjena << " -> " << _napomena;
  32.         cout << endl;
  33.     }
  34.     void Dealociraj() { _datumIzvrsenja->Dealociraj(); delete _datumIzvrsenja; _datumIzvrsenja = nullptr; delete[] _napomena; _napomena = nullptr; }
  35. };
  36. struct PolozeniPredmet {
  37.     Datum _datumPolaganja;
  38.     ObavezeNaPredmetu * _listaIzvrsenihObaveza[10];
  39.     int _trenutnoIzvrsenihObaveza;
  40.     int _konacnaOcjena; //formira se na osnovu ocjena izvrsenih obaveza
  41.     void Unos(Datum * d) {
  42.         /*Na osnovu vrijednosti primljenog parametra izvrsiti inicijalizaciju odgovarajucih atributa*/
  43.         _datumPolaganja = *d;
  44.         _trenutnoIzvrsenihObaveza = 0;
  45.         _konacnaOcjena = 5;
  46.     }
  47.     bool DodajIzvrsenuObavezu(ObavezeNaPredmetu o) {
  48.         /*Na osnovu vrijednosti primljenog parametra osigurati dodavanje novoizvrsene obaveze na predmetu. Potrebno je onemoguciti dodavanje identicnih obaveza, a izmedju izvrsenja pojedinih obaveza mora proci najmanje 7 dana. Identicna vrsta obaveze se moze dodati samo u slucaju da se radi o Seminarskom ili je prethodno dodana obaveza (identicne vrste) imala ocjenu 5. Ukoliko je moguce, osigurati prosirenje niza*/
  49.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  50.             if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == o._vrstaObaveze && o._vrstaObaveze != Integralni && o._vrstaObaveze != Seminarski)
  51.                 if ((_listaIzvrsenihObaveza[i]->_ocjena <= 5 || _listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni1 || _listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni2))
  52.                     return false;
  53.         if (_trenutnoIzvrsenihObaveza < 10) {
  54.             _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza] = new ObavezeNaPredmetu(o);
  55.             _trenutnoIzvrsenihObaveza++;
  56.             return true;
  57.         } else return false;
  58.     }
  59.     int FormirajKonacnuOcjenu() {
  60.         /*Konacna ocjene predstavlja prosjecnu ocjenu na predmetu, 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 rada. U slucaju da bilo koji od navedenih uslova nije zadovoljen konacna ocjena treba biti postavljena na vrijednost 5. Konacna ocjena, takodjer, ne smije biti formirana u slucaju da u napomeni od dvije obaveze stoji rijec 'prepisivao' ili 'izbacen'.*/
  61.         int brojac = 0, ocjene = 0;
  62.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  63.             if (strcmp(_listaIzvrsenihObaveza[i]->_napomena, "prepisivao") == 0 || strcmp(_listaIzvrsenihObaveza[i]->_napomena, "izbacen") == 0){
  64.                 _konacnaOcjena = 5;
  65.                 return _konacnaOcjena;
  66.             }
  67.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++) {
  68.             if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Integralni && _listaIzvrsenihObaveza[i]->_ocjena > 5)
  69.                 _konacnaOcjena = _listaIzvrsenihObaveza[i]->_ocjena;
  70.             else if ((_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni1 && _listaIzvrsenihObaveza[i]->_ocjena > 5) || (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni2 && _listaIzvrsenihObaveza[i]->_ocjena > 5) && brojac < 2) {
  71.                 ocjene += _listaIzvrsenihObaveza[i]->_ocjena; brojac++;
  72.             }
  73.         }
  74.         if (brojac == 2 && ocjene >= 12)
  75.             for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  76.                 if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Seminarski && _listaIzvrsenihObaveza[i]->_ocjena > 5)
  77.                     brojac++;
  78.         if (brojac >= 4 && ocjene >= 12) {
  79.             _konacnaOcjena = ocjene / 2;
  80.             if(ocjene % 2 == 1)
  81.                 _konacnaOcjena++;
  82.         }
  83.         return _konacnaOcjena;
  84.     }
  85. };
  86.  
  87. float Pretraga(PolozeniPredmet * p, int max, int ocjena, Datum d)
  88. {
  89.     /*Funkcija ima zadatak da ispise informacije o svim polozenim predmetima kod kojih je student sve obaveze na predmetu izvrsio prije odredjenog datuma i ostvario konacnu ocjenu vecu od definisane (ocjenu i datum unosi korisnik). Nakon ispisa, funkcija vraca prosjecnu ocjenu polozenih predmeta koji su zadovoljili pomenute kriterije.*/
  90.     int suma = 0;
  91.     for(int i = 0; i < max; i++)
  92.     {
  93.         if (p[i]._konacnaOcjena >= ocjena) {
  94.             if (*d._godina == *p[i]._datumPolaganja._godina) {
  95.                 if (*d._mjesec == *p[i]._datumPolaganja._mjesec) {
  96.                     if (*p[i]._datumPolaganja._dan <= *d._dan) {
  97.                         for (int j = 0; j < p[i]._trenutnoIzvrsenihObaveza; j++) {
  98.                             p[i]._listaIzvrsenihObaveza[j]->Ispis();
  99.                         }
  100.                         suma += p[i]._konacnaOcjena;
  101.                     }
  102.                 } else if (*p[i]._datumPolaganja._mjesec < *d._mjesec) {
  103.                     for (int j = 0; j < p[i]._trenutnoIzvrsenihObaveza; j++) {
  104.                         p[i]._listaIzvrsenihObaveza[j]->Ispis();
  105.                     }
  106.                     suma += p[i]._konacnaOcjena;
  107.                 }
  108.             } else if (*p[i]._datumPolaganja._godina < *d._godina) {
  109.                 for (int j = 0; j < p[i]._trenutnoIzvrsenihObaveza; j++) {
  110.                     p[i]._listaIzvrsenihObaveza[j]->Ispis();
  111.                 }
  112.                 suma += p[i]._konacnaOcjena;
  113.             }
  114.         }
  115.     }
  116.     return float(suma)/max;
  117. }
  118.  
  119. void main() {
  120.     //izbjegavajte koristenje vlastitog imena i prezimena.
  121.     //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti
  122.     PolozeniPredmet *predmet = new PolozeniPredmet[2]; Datum *datum = new Datum[3];; ObavezeNaPredmetu *obaveza[6];
  123.     datum[0].Unos(13, 6, 2016);
  124.     datum[1].Unos(14, 7, 2016);
  125.     datum[2].Unos(15, 7, 2016);
  126.     obaveza[0] = new ObavezeNaPredmetu;
  127.     obaveza[0]->Unos(Parcijalni1, &datum[0], 8, "uredan");
  128.     obaveza[1] = new ObavezeNaPredmetu;
  129.     obaveza[1]->Unos(Parcijalni2, &datum[1], 6, "uredan");
  130.     obaveza[2] = new ObavezeNaPredmetu;
  131.     obaveza[2]->Unos(Seminarski, &datum[0], 9, "rad prihvacen");
  132.     obaveza[3] = new ObavezeNaPredmetu;
  133.     obaveza[3]->Unos(Seminarski, &datum[0], 9, "rad prihvacen");
  134.     obaveza[4] = new ObavezeNaPredmetu;
  135.     obaveza[4]->Unos(Integralni, &datum[0], 5, "RE");
  136.     obaveza[5] = new ObavezeNaPredmetu;
  137.     obaveza[5]->Unos(Integralni, &datum[1], 10, "prekucao");
  138.     predmet[0].Unos(&datum[1]);
  139.     predmet[1].Unos(&datum[1]);
  140.     predmet[0].DodajIzvrsenuObavezu(*obaveza[0]);
  141.     predmet[0].DodajIzvrsenuObavezu(*obaveza[1]);
  142.     predmet[0].DodajIzvrsenuObavezu(*obaveza[2]);
  143.     predmet[0].DodajIzvrsenuObavezu(*obaveza[3]);
  144.     predmet[1].DodajIzvrsenuObavezu(*obaveza[4]);
  145.     predmet[1].DodajIzvrsenuObavezu(*obaveza[5]);
  146.     for (int e = 0; e < 2; e++) {
  147.         for (int i = 0; i < predmet[e]._trenutnoIzvrsenihObaveza; i++)
  148.             predmet[e]._listaIzvrsenihObaveza[i]->Ispis();
  149.         cout << "\nKonacna ocjena : " << predmet[e].FormirajKonacnuOcjenu() << endl << endl;
  150.     }
  151.     cout << "\nProsjek pronadjenih predmeta, po unesenom kriteriju : " << Pretraga(predmet, 2, 6, datum[2]) << endl;
  152.     for (int e = 0; e < 2; e++)
  153.         for (int i = 0; i < predmet[e]._trenutnoIzvrsenihObaveza; i++) {
  154.             predmet[e]._listaIzvrsenihObaveza[i]->Dealociraj();
  155.             delete predmet[e]._listaIzvrsenihObaveza[i];
  156.             predmet[e]._listaIzvrsenihObaveza[i] = nullptr;
  157.     }
  158.     for (int i = 0; i < 6; i++) {
  159.         delete obaveza[i];
  160.         obaveza[i] = nullptr;
  161.     }
  162.     delete[] datum; delete[] predmet;
  163.     datum = nullptr; predmet = nullptr;
  164.     system("pause>0");
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement