Advertisement
limun11

grupa a - KONACNA

Jul 7th, 2017
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.74 KB | None | 0 0
  1. #include<iostream>
  2. #include <memory>
  3. #include <functional>
  4.  
  5. using namespace std;
  6. /*
  7. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE BODOVATI
  8. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  9. 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
  10. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  11. 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)
  12. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  13. */
  14.  
  15. //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
  16. #pragma warning(disable:4996)
  17.  
  18. char *crt = "\n-------------------------------------------\n";
  19.  
  20. enum eNacinStudiranja { REDOVAN, DL };
  21. enum eRazred { PRVI = 1, DRUGI, TRECI, CETVRTI };
  22.  
  23. struct Datum
  24. {
  25.     int _dan, _mjesec, _godina;
  26.     void Unos(int d, int m, int g) { _dan = d; _mjesec = m; _godina = g; }
  27.     void Ispis() { cout << _dan << "/" << _mjesec << "/" << _godina << endl; }
  28.     bool provjera(Datum datum)
  29.     {
  30.         if (datum._godina > _godina)
  31.             return false;
  32.         else if (datum._godina == _godina && datum._mjesec > _mjesec)
  33.             return false;
  34.         else if (datum._mjesec == _mjesec && datum._dan > _dan)
  35.             return false;
  36.         else return true;
  37.     }
  38. };
  39.  
  40. const Datum rokZaPrijavu = { 5, 7, 2017 };
  41.  
  42. char * errVecDodan = "Istoimeni predmet se moze dodati najvise dva puta!";
  43. char * errProsaoRok = "Zao nam je. Rok za prijavu je vec prosao!";
  44. char * uspjesnoDodan = "Predmet uspjesno dodan!";
  45.  
  46. struct Predmet
  47. {
  48.     char * _naziv;
  49.     int * _ocjena;
  50.     Datum _datumUnosa;
  51.     void Unos(char * naziv, int ocjena, Datum datumUnosa)
  52.     {
  53.         int vel = strlen(naziv) + 1;
  54.         _naziv = new char[vel];
  55.         strcpy_s(_naziv, vel, naziv);
  56.         _ocjena = new int(ocjena);
  57.         _datumUnosa.Unos(datumUnosa._dan, datumUnosa._mjesec, datumUnosa._godina);
  58.     }
  59.     void Dealociraj()
  60.     {
  61.         delete[] _naziv; _naziv = nullptr;
  62.         delete _ocjena; _ocjena = nullptr;
  63.     }
  64.  
  65.     void Ispis()
  66.     {
  67.         cout << _naziv << " (" << *_ocjena << ") "; _datumUnosa.Ispis();
  68.     }
  69.     void PromijeniOcjenu(int ocjena) { *_ocjena = ocjena; }
  70.    
  71. };
  72.  
  73. struct Uspjeh
  74. {
  75.     eRazred  _razred;
  76.     bool _najboljiUcenik; // ako je kandidat u tom razredu proglasen najboljim ucenikom
  77.     shared_ptr<Predmet> * _predmeti;
  78.     int _brojPredmeta;
  79.     void Unos(eRazred razred, bool najboljiUcenik)
  80.     {
  81.         _razred = razred;
  82.         _najboljiUcenik = najboljiUcenik;
  83.         _predmeti = nullptr;
  84.         _brojPredmeta = 0;
  85.     }
  86.     void Dealociraj()
  87.     {
  88.         delete[] _predmeti; _predmeti = nullptr;
  89.     }
  90.     void Ispis()
  91.     {
  92.         cout << crt << "Razred -> " << _razred << "Najbolji -> " << _najboljiUcenik << crt;
  93.         for (size_t i = 0; i < _brojPredmeta; i++)
  94.             _predmeti[i]->Ispis();
  95.     }
  96.     void dodajPredmet(Predmet predmet)
  97.     {
  98.         shared_ptr<Predmet> * temp = new shared_ptr<Predmet>[_brojPredmeta + 1];
  99.         for (int i = 0; i < _brojPredmeta; i++)
  100.         {
  101.             temp[i] = make_shared<Predmet>();
  102.             temp[i]->Unos(_predmeti[i]->_naziv, *_predmeti[i]->_ocjena, _predmeti[i]->_datumUnosa);
  103.         }
  104.         temp[_brojPredmeta] = make_shared<Predmet>();
  105.         temp[_brojPredmeta]->Unos(predmet._naziv, *predmet._ocjena, predmet._datumUnosa);
  106.         for (int i = 0; i < _brojPredmeta; i++)
  107.         {
  108.             _predmeti[i]->Dealociraj();
  109.         }
  110.         delete[] _predmeti;
  111.         _predmeti = temp;
  112.         _brojPredmeta++;
  113.     }
  114. };
  115.  
  116. struct Kandidat
  117. {
  118.     eNacinStudiranja _nacinStudiranja;
  119.     char * _imePrezime;
  120.     Uspjeh * _uspjeh[4];
  121.  
  122.     void Unos(eNacinStudiranja nacinStudiranja, char * imePrezime)
  123.     {
  124.         int vel = strlen(imePrezime) + 1;
  125.         _imePrezime = new char[vel];
  126.         strcpy_s(_imePrezime, vel, imePrezime);
  127.         _nacinStudiranja = nacinStudiranja;
  128.         for (size_t i = 0; i < 4; i++)
  129.             _uspjeh[i] = nullptr;
  130.     }
  131.     void Dealociraj()
  132.     {
  133.         delete[] _imePrezime; _imePrezime = nullptr;
  134.         for (size_t i = 0; i < 4; i++)
  135.         {
  136.             if(_uspjeh[i]!=nullptr)
  137.             _uspjeh[i]->Dealociraj();
  138.             delete _uspjeh[i];
  139.         }
  140.     }
  141.     void Ispis()
  142.     {
  143.         cout << crt << _imePrezime << " " << _nacinStudiranja;
  144.         for (size_t i = 0; i < 4; i++)
  145.         {
  146.             if (_uspjeh[i] != nullptr)
  147.             _uspjeh[i]->Ispis();
  148.         }
  149.     }
  150.     /*
  151.     uspjeh (tokom srednjoskolskog obrazovanja) se dodaje za svaki predmet na nivou razreda.
  152.     prilikom dodavanja onemoguciti:
  153.     - istoimeni predmet se moze dodati samo dva puta, bez obzira sto se dodaje na razlicitim godinama,
  154.     - dodavanje predmeta nakon dozvoljenog roka za prijavu (rokZaPrijavu).
  155.     razredi (predmeti ili uspjeh) ne moraju biti dodavani sortiranim redoslijedom
  156.     (npr. prvo se moze dodati uspjeh za II razred, pa onda za I razred i sl.).
  157.     Funkcija vraca neku od predefinisanih poruka u zavisnosti od (ne)uspjesnost izvrsenja
  158.     */
  159.     bool DodajPredmet(eRazred razred, Predmet predmet)
  160.     {
  161.         int brojacIsoimenih = 0;
  162.         if (_uspjeh[razred - 1] == nullptr)
  163.         {
  164.             _uspjeh[razred - 1] = new Uspjeh;
  165.             _uspjeh[razred - 1]->Unos(razred, true);
  166.         }
  167.         for (int i = 0; i < 4; i++)
  168.         {
  169.             if (_uspjeh[i] != nullptr)
  170.             {
  171.                 for (int j = 0; j < _uspjeh[i]->_brojPredmeta; j++)
  172.                 {
  173.                     if (strcmp(_uspjeh[i]->_predmeti[j]->_naziv, predmet._naziv) == 0)
  174.                     {
  175.                         brojacIsoimenih++;
  176.                     }
  177.                 }
  178.             }
  179.         }
  180.         if (brojacIsoimenih >= 2)
  181.         {
  182.             cout << errVecDodan << crt;
  183.             return false;
  184.         }
  185.         else if (predmet._datumUnosa.provjera(rokZaPrijavu))
  186.         {
  187.             cout << errProsaoRok << crt;
  188.             return false;
  189.         }
  190.         else
  191.         {
  192.             _uspjeh[razred - 1]->dodajPredmet(predmet);
  193.             cout << uspjesnoDodan;
  194.             return true;
  195.         }
  196.        
  197.     }
  198. };
  199.  
  200. void main() {
  201.     Datum datum19062017, datum20062017, datum30062017, datum05072017;
  202.     datum19062017.Unos(19, 6, 2017);
  203.     datum20062017.Unos(20, 6, 2017);
  204.     datum30062017.Unos(30, 6, 2017);
  205.     datum05072017.Unos(5, 7, 2017);
  206.  
  207.     Predmet Matematika, Fizika, Hemija, Engleski;
  208.     //2 - ocjena na predmetu; datum - datum evidentiranja uspjeha na predmetu jer postoji krajnji rok za evidentiranje
  209.     Matematika.Unos("Matematika", 2, datum19062017);
  210.     Fizika.Unos("Fizika", 5, datum20062017);
  211.     Hemija.Unos("Hemija", 2, datum20062017);
  212.     Engleski.Unos("Engleski", 5, datum05072017);
  213.  
  214.     int brojKandidata = 2;
  215.  
  216.     Kandidat * prijave2017 = new Kandidat[brojKandidata];
  217.     prijave2017[0].Unos(DL, "Jasmin Azemovic");
  218.     prijave2017[1].Unos(REDOVAN, "Indira Hamulic");
  219.    
  220.     if (prijave2017[0].DodajPredmet(DRUGI, Engleski)) //ne bi trebao dodati jer je prosao postavljeni rok
  221.         //za dodavanje predmeta
  222.         cout << "Predmet uspjesno dodan!" << crt;
  223.     if (prijave2017[0].DodajPredmet(DRUGI, Matematika))
  224.         cout << "Predmet uspjesno dodan!" << crt;
  225.     if (prijave2017[0].DodajPredmet(PRVI, Fizika))
  226.         cout << "Predmet uspjesno dodan!" << crt;
  227.     if (prijave2017[0].DodajPredmet(PRVI, Hemija))
  228.         cout << "Predmet uspjesno dodan!" << crt;
  229.  
  230.     Matematika.PromijeniOcjenu(5);
  231.     Hemija.PromijeniOcjenu(3);
  232.  
  233.     if (prijave2017[1].DodajPredmet(PRVI, Matematika))
  234.         cout << "Predmet uspjesno dodan!" << crt;
  235.     if (prijave2017[1].DodajPredmet(DRUGI, Matematika))
  236.         cout << "Predmet uspjesno dodan!" << crt;
  237.     if (prijave2017[1].DodajPredmet(TRECI, Matematika))//ne bi trebalo ponovo dodati Matematiku!
  238.         cout << "Predmet uspjesno dodan!" << crt;
  239.     if (prijave2017[1].DodajPredmet(TRECI, Hemija))
  240.         cout << "Predmet uspjesno dodan!" << crt;
  241.     if (prijave2017[1].DodajPredmet(DRUGI, Engleski))
  242.         cout << "Predmet uspjesno dodan!" << crt;
  243.  
  244.     /*
  245.     koristeci Lambda izraz kreirati funkciju koja ce vratiti uspjeh kandidata koji je ostvario najveci
  246.     prosjek (na nivou razreda, a ne ukupni prosjek).funkcija prima parametre tipa eNacinStudiranja
  247.     (pretrazuje samo kandidate za Redovan ili DL nacin studiranja) i bool kojim se omogucava pretraga samo
  248.     onih razreda na kojim su kandidati bili najbolji ucenici (ako se funkciji proslijedi vrijednost true,
  249.     ona ce uzeti u obzir samo one razrede kada su kandidati oznaceni kao najbolji). ukoliko vise kandidata
  250.     ima isti prosjek funkcija vraca uspjeh (najboljeg razreda) prvog pronadjenog kandidata
  251.     */
  252.     auto najboljiUspjeh = [prijave2017, brojKandidata](eNacinStudiranja nacin, bool najdbolji)
  253.     {
  254.         Uspjeh * pokazivac = nullptr;
  255.         float najbolji = 0;
  256.         int indexKandidata = 0;
  257.         int indexUspjeha = 0;
  258.  
  259.         for (int i = 0; i < brojKandidata; i++)
  260.         {
  261.             if (prijave2017[i]._nacinStudiranja != nacin)
  262.                 continue;
  263.  
  264.             for (int j = 0; j < 4; j++)
  265.             {
  266.                 if (prijave2017[i]._uspjeh[j] != nullptr)
  267.                 {
  268.                     if (prijave2017[i]._uspjeh[j]->_najboljiUcenik != najbolji)
  269.                         continue;
  270.  
  271.                     float prosjek = 0;
  272.                     for (int k = 0; k < prijave2017[i]._uspjeh[j]->_brojPredmeta; k++)
  273.                     {
  274.                         prosjek += *prijave2017[i]._uspjeh[j]->_predmeti[k]->_ocjena;
  275.                     }
  276.                     najbolji = najbolji / prijave2017[i]._uspjeh[j]->_brojPredmeta;
  277.                     if (prosjek == najbolji)
  278.                         break;
  279.                     if (prosjek > najbolji)
  280.                     {
  281.                         najbolji = prosjek;
  282.                         indexKandidata = i;
  283.                         indexUspjeha = j;
  284.                     }
  285.                 }
  286.                
  287.             }
  288.         }
  289.         pokazivac = prijave2017[indexKandidata]._uspjeh[indexUspjeha];
  290.         return pokazivac;
  291.     };
  292.     Uspjeh * najbolji = najboljiUspjeh(DL, true);
  293.     najbolji->Ispis();
  294.  
  295.     /*
  296.     napisati rekurzivnu funkciju koja ce vratiti pokazivac na kandidata sa najvecim prosjekom u razredu koji je proslijedjen kao parametar. ukoliko je vise kandidata ostvarilo isti prosjek, funkcija treba da vrati posljednje pronadjenog kandidata. u slucaju da niti jedan kandidat nije evidentirao uspjeh u trazenom razredu, funkcija vraca nullptr. u nastavku je prikazan primjer poziva rekurzivne funkcije, a ostale parametre dodajte po potrebi. */
  297.     //Kandidat * kandidatSaNajboljimProsjekom = rekNajboljiProsjek(prijave2017, brojKandidata, DRUGI);
  298.  
  299.     for (size_t i = 0; i < brojKandidata; i++)
  300.     {
  301.         prijave2017[i].Ispis();
  302.         prijave2017[i].Dealociraj();
  303.     }
  304.     system("pause>0");
  305. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement