Advertisement
limun11

rekurzija

Aug 27th, 2018
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.69 KB | None | 0 0
  1. #include<iostream>
  2. /*
  3. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE BODOVATI
  4. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  5. 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
  6. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  7. 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)
  8. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  9. */
  10.  
  11. using namespace std;
  12. //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
  13. #pragma warning(disable:4996)
  14.  
  15. enum VrstaObaveze { Seminarski, Parcijalni1, Parcijalni2, Integralni, Prakticni };
  16. const char * VrstaObavezeChar [] = { "Seminarski", "Parcijalni1", "Parcijalni2", "Integralni", "Prakticni" };
  17. struct Datum {
  18.     int * _dan, *_mjesec, *_godina;
  19.     void Unos(int d, int m, int g) {
  20.         _dan = new int(d);
  21.         _mjesec = new int(m);
  22.         _godina = new int(g);
  23.     }
  24.     void Ispis() {
  25.         cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl;
  26.     }
  27.     void Dealociraj() { delete _dan; delete _mjesec; delete _godina; }
  28. };
  29. bool veciDatum(Datum d1, Datum d2)
  30. {
  31.     if (*d1._godina < *d2._godina)
  32.         return true;
  33.     else if (*d2._godina < *d1._godina)
  34.         return false;
  35.  
  36.     if (*d1._mjesec < *d2._mjesec)
  37.         return true;
  38.     else if (*d2._mjesec < *d1._mjesec)
  39.         return false;
  40.  
  41.     if (*d1._dan < *d2._dan)
  42.         return true;
  43.     else if (*d2._dan < *d1._dan)
  44.         return false;
  45.  
  46.     return true;
  47. }
  48. struct ObavezeNaPredmetu {
  49.     shared_ptr<VrstaObaveze> _vrstaObaveze;
  50.     Datum _datumIzvrsenja;
  51.     char * _napomena;
  52.     int _ocjena; // 5 - 10
  53.     void Unos(VrstaObaveze vrsta, Datum datum, int ocjena, char * napomena) {
  54.         _vrstaObaveze = make_shared <VrstaObaveze>(vrsta);
  55.         _datumIzvrsenja = datum;
  56.         _ocjena = ocjena;
  57.         _napomena = new char[strlen(napomena) + 1];
  58.         strcpy_s(_napomena, strlen(napomena) + 1, napomena);
  59.     }
  60.     void Ispis() {
  61.         cout << VrstaObavezeChar[*_vrstaObaveze]<< " " << _ocjena << " " << _napomena;
  62.         _datumIzvrsenja.Ispis();
  63.         cout << endl;
  64.     }
  65.     void Dealociraj() {
  66.         _datumIzvrsenja.Dealociraj();
  67.         delete[] _napomena; _napomena = nullptr;
  68.     }
  69. };
  70.  
  71. 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*/
  72.  
  73. struct PolozeniPredmet {
  74.     Datum _datumPolaganja;//datum koji ce se evidentirati kao datum kada je predmet polozen tj. kada je formirana konacna ocjena
  75.     char * _nazivPredmeta;
  76.     ObavezeNaPredmetu * _listaIzvrsenihObaveza;
  77.     int _trenutnoIzvrsenihObaveza;
  78.     int _minimalanBrojDana; //odnosi se na minimalan broj dana koji mora proci od izvrsenja pojedinih obaveza na predmetu (npr. 7 dana)
  79.     int _konacnaOcjena; //formira se na osnovu ocjena izvrsenih obaveza
  80.  
  81.     void Unos(const char * naziv, int minimalanBrojDana) {
  82.         _nazivPredmeta = new char[strlen(naziv) + 1];
  83.         strcpy_s(_nazivPredmeta, strlen(naziv) + 1, naziv);
  84.         _listaIzvrsenihObaveza = nullptr;
  85.         _trenutnoIzvrsenihObaveza = 0;
  86.         _minimalanBrojDana = minimalanBrojDana;
  87.         _konacnaOcjena = 0;
  88.     }
  89.     void Dealociraj() {
  90.         _datumPolaganja.Dealociraj();
  91.         delete[] _nazivPredmeta; _nazivPredmeta = nullptr;
  92.         for (size_t i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  93.             _listaIzvrsenihObaveza[i].Dealociraj();
  94.         delete[]_listaIzvrsenihObaveza;
  95.     }
  96. };
  97. /*Rekurzivna funkcija treba vratiti prosjecnu ocjenu uspjesno izvrsenih obaveze na predmetu odredjene vrste u definisanom periodu.
  98. Izbjegavati koristenje globalnih varijabli*/
  99. int petlja = 0;
  100. float PretragaRekurzivno(PolozeniPredmet predmet, VrstaObaveze vrsta, Datum OD, Datum DO, int brojac, int suma)
  101. {
  102.     float prosjek;
  103.     if (predmet._trenutnoIzvrsenihObaveza == petlja)
  104.     {
  105.         if (brojac == 0)
  106.             return 0;
  107.         else
  108.         {
  109.             prosjek = suma / brojac;
  110.             return prosjek;
  111.         }
  112.     }
  113.     else
  114.     {
  115.         if (veciDatum(OD, predmet._listaIzvrsenihObaveza[petlja]._datumIzvrsenja) && veciDatum(predmet._listaIzvrsenihObaveza[petlja]._datumIzvrsenja, DO))
  116.         {
  117.             //uvjet dodati
  118.             brojac++;
  119.             suma += predmet._listaIzvrsenihObaveza[petlja]._ocjena;
  120.         }
  121.     }
  122.     petlja++;
  123.     return PretragaRekurzivno (predmet, vrsta, OD, DO, brojac, suma);
  124. }
  125. /*Koristeci lambda-u, unutar funkcije GetBrojObavezaIznadProsjeka pronaci broj izvrsenih obaveza koje imaju istu ili vecu ocjenu od prosjecne*/
  126. int GetBrojObavezaIznadProsjeka(PolozeniPredmet predmet, float prosjek)
  127. {
  128.     auto lambda = [&]()
  129.     {
  130.         int brojac = 0;
  131.         for (int i = 0; i < predmet._trenutnoIzvrsenihObaveza; i++)
  132.         {
  133.             if ((predmet._listaIzvrsenihObaveza[i]._ocjena == prosjek) || (predmet._listaIzvrsenihObaveza[i]._ocjena > prosjek))
  134.             {
  135.                 brojac++;
  136.             }
  137.         }
  138.         return brojac;
  139.     };
  140.     return lambda();
  141. }
  142. void main() {
  143.     _kljucneRijeci[0] = "prepisivao";
  144.     _kljucneRijeci[1] = "ometao";
  145.     _kljucneRijeci[2] = "nije dostavio";
  146.  
  147.     Datum datumSeminarski1, datumSeminarski2, datumParcijalni1, datumParcijalni2, datumIntegralni;
  148.     datumSeminarski1.Unos(10, 6, 2017);
  149.     datumSeminarski2.Unos(18, 6, 2017);
  150.     datumParcijalni1.Unos(22, 6, 2017);
  151.     datumParcijalni2.Unos(30, 6, 2017);
  152.  
  153.     PolozeniPredmet prII;
  154.     //naziv predmeta, minimalan broj dana
  155.     prII.Unos("Programiranje II", 7);
  156.  
  157.     /*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).*/
  158.     /*if (prII.DodajIzvrsenuObavezu(Parcijalni1, datumParcijalni1, 6, "uslovno polozen ispit"))
  159.         cout << "Parcijalni 1...dodan" << endl;
  160.     if (prII.DodajIzvrsenuObavezu(Parcijalni2, datumParcijalni2, 5, "previse gresaka, a tokom ispita ometao druge studente"))
  161.         cout << "Parcijalni 2...dodan" << endl;
  162.     if (prII.DodajIzvrsenuObavezu(Seminarski, datumSeminarski1, 8, "implementirani svi algoritmi"))
  163.         cout << "Seminarski1...dodan" << endl;
  164.     if (prII.DodajIzvrsenuObavezu(Seminarski, datumSeminarski2, 6, "rad slican kao kod studenta IB150388"))
  165.         cout << "Seminarski2...dodan" << endl;*/
  166.  
  167.     /*Konacna ocjene predstavlja prosjecnu ocjenu na predmetu (prosjecnu ocjenu izvrsenih obaveza koje ispunjavaju uslove za uspjesno polaganje predmeta),
  168.     a za njeno formiranje student mora posjedovati polozen integralni ili dva parijcalna ispita. Ukoliko je ispit polozen putem parcijalnih ispita,
  169.     student takodjer mora imati pozitivno (ocjenom vecom od 5) ocijenjena najmanje dva seminarska i jedan prakticni rad. Takodjer,
  170.     datum polaganja drugog parcijalnog ispita ne smije biti raniji (manji) od datuma polaganja prvog parcijalnog ispita.
  171.     Konacna ocjena ne smije biti formirana u slucaju da napomena bilo koje odbaveze (koja je ucestvovala u formiranju konacne ocjene) sadrzi
  172.     neku od zabranjenih rijeci (niz _kljucneRijeci). U slucaju da neki od navedenih uslova nije zadovoljen konacna ocjena treba biti postavljena na vrijednost 5.
  173.     Ukoliko su ispunjeni svi uslovi, osim formiranja konacne ocjene, datum polaganja je potrebno postaviti na vrijednost datuma posljednje izvrsene obaveze sa
  174.     najvecom ocjenom.
  175.     */
  176.     //cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
  177.  
  178.     datumParcijalni2.Unos(22, 7, 2017);
  179.     /*if (prII.DodajIzvrsenuObavezu(Parcijalni2, datumParcijalni2, 6, ""))
  180.         cout << "Parcijalni 2...dodan" << endl;
  181.     cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;*/
  182.     Datum OD, DO; OD.Unos(1, 1, 2017); DO.Unos(1, 7, 2017);
  183.  
  184.     /*Rekurzivna funkcija treba vratiti prosjecnu ocjenu uspjesno izvrsenih obaveze na predmetu odredjene vrste u definisanom periodu.
  185.     Izbjegavati koristenje globalnih varijabli*/
  186.     float prosjek = PretragaRekurzivno(prII, Seminarski, OD, DO, 0, 0);
  187.     cout << "Prosjecna ocjena izvrsenih obaveza je: " << prosjek << endl;
  188.  
  189.     /*Koristeci lambda-u, unutar funkcije GetBrojObavezaIznadProsjeka pronaci broj izvrsenih obaveza koje imaju istu ili vecu ocjenu od prosjecne*/
  190.     int iznadProsjeka = GetBrojObavezaIznadProsjeka(prII, prosjek);
  191.     cout << "Broj izvrsenih obaveza iznad prosjeka je: " << iznadProsjeka << endl;
  192.  
  193.     /*datumParcijalni1.Dealociraj();
  194.     datumParcijalni2.Dealociraj();
  195.     datumSeminarski1.Dealociraj();
  196.     datumSeminarski2.Dealociraj();
  197.     datumIntegralni.Dealociraj();
  198.     prII.Dealociraj();*/
  199.     system("PAUSE");
  200. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement