Advertisement
Nedzla

2.parc

Sep 21st, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.05 KB | None | 0 0
  1. #include"stdafx.h"
  2.  
  3. #include<iostream>
  4.  
  5. #include <memory>
  6.  
  7. using namespace std;
  8.  
  9. /*
  10. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEÆE BODOVATI
  11.  
  12. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  13.  
  14. 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.
  15. NE PREDAVATI .TXT ILI .CPP FAJLOVE
  16.  
  17. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  18.  
  19. 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)
  20.  
  21. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAÐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  22. */
  23. //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
  24. #pragma warning(disable:4996)
  25.  
  26. const char *crt = "\n-------------------------------------------\n";
  27.  
  28. enum eNacinStudiranja { REDOVAN, DL };
  29.  
  30. enum eRazred { PRVI = 1, DRUGI, TRECI, CETVRTI };
  31.  
  32. struct Datum {
  33.     int _dan, _mjesec, _godina;
  34.     void Unos(int d, int m, int g)
  35.     {
  36.         _dan = d; _mjesec = m; _godina = g;
  37.     }
  38.     void Ispis() {
  39.         cout << _dan << "/" << _mjesec << "/" << _godina << endl;
  40.     }
  41. };
  42.  
  43. const Datum rokZaPrijavu = { 5, 7, 2017 };
  44.  
  45. const char * errVecDodan = "Istoimeni predmet se moze dodati najvise dva puta!";
  46.  
  47. const char * errProsaoRok = "Zao nam je. Rok za prijavu je vec prosao!";
  48.  
  49. const char * uspjesnoDodan = "Predmet uspjesno dodan!";
  50.  
  51. struct Predmet {
  52.     char * _naziv;
  53.     int * _ocjena;
  54.     Datum _datumUnosa;
  55.     void Unos(const char * naziv, int ocjena, Datum datumUnosa)
  56.     {
  57.         int vel = strlen(naziv) + 1;
  58.         _naziv = new char[vel];
  59.         strcpy_s(_naziv, vel, naziv);
  60.         _ocjena = new int(ocjena);
  61.         _datumUnosa.Unos(datumUnosa._dan, datumUnosa._mjesec, datumUnosa._godina);
  62.     }
  63.     void Dealociraj() {
  64.         delete[] _naziv; _naziv = nullptr;
  65.         delete _ocjena; _ocjena = nullptr;
  66.     }
  67.     void Ispis() {
  68.         cout << _naziv << " (" << *_ocjena << ") ";
  69.         _datumUnosa.Ispis();
  70.     }
  71.     void PromijeniOcjenu(int ocjena)
  72.     {
  73.         *_ocjena = ocjena;
  74.     }
  75. };
  76.  
  77. struct Uspjeh {
  78.     eRazred  _razred;
  79.     bool _najboljiUcenik; // ako je kandidat u tom razredu proglasen najboljim ucenikom
  80.     shared_ptr<Predmet> * _predmeti;
  81.     int _brojPredmeta;
  82.     void Unos(eRazred razred, bool najboljiUcenik)
  83.     {
  84.         _razred = razred;
  85.         _najboljiUcenik = najboljiUcenik;
  86.         _predmeti = nullptr;
  87.         _brojPredmeta = 0;
  88.     }
  89.     void Dealociraj() {
  90.         for (size_t i = 0; i < _brojPredmeta; i++)
  91.             _predmeti[i]->Dealociraj();
  92.         delete[] _predmeti; _predmeti = nullptr;
  93.     }
  94.     void Ispis() {
  95.         cout << crt << "Razred -> " << _razred << "Najbolji -> " << _najboljiUcenik << crt;
  96.         for (size_t i = 0; i < _brojPredmeta; i++)
  97.             _predmeti[i]->Ispis();
  98.     }
  99.     void DodajPredmet(Predmet p) {
  100.         shared_ptr<Predmet> *temp = new shared_ptr<Predmet>[_brojPredmeta + 1];
  101.         for (size_t i = 0; i < _brojPredmeta; i++)
  102.         {
  103.             temp[i] = make_shared<Predmet>();
  104.             temp[i]->Unos(_predmeti[i]->_naziv, *_predmeti[i]->_ocjena, _predmeti[i]->_datumUnosa);
  105.             _predmeti[i]->Dealociraj();
  106.         }
  107.         if (_predmeti != nullptr)
  108.             delete[] _predmeti;
  109.         temp[_brojPredmeta] = make_shared<Predmet>();
  110.         temp[_brojPredmeta]->Unos(p._naziv, *p._ocjena, p._datumUnosa);
  111.         _predmeti = temp;
  112.         _brojPredmeta++;
  113.     }
  114. };
  115.  
  116. struct Kandidat {
  117.  
  118.     eNacinStudiranja _nacinStudiranja;
  119.  
  120.     char * _imePrezime;
  121.  
  122.     Uspjeh * _uspjeh[4];
  123.  
  124.  
  125.     void Unos(eNacinStudiranja nacinStudiranja,const char * imePrezime)
  126.     {
  127.  
  128.         int vel = strlen(imePrezime) + 1;
  129.  
  130.         _imePrezime = new char[vel];
  131.  
  132.         strcpy_s(_imePrezime, vel, imePrezime);
  133.  
  134.         _nacinStudiranja = nacinStudiranja;
  135.  
  136.         for (size_t i = 0; i < 4; i++)
  137.  
  138.             _uspjeh[i] = nullptr;
  139.  
  140.     }
  141.  
  142.     void Dealociraj() {
  143.  
  144.         delete[] _imePrezime;
  145.         _imePrezime = nullptr;
  146.  
  147.         for (size_t i = 0; i < 4; i++) {
  148.  
  149.             if (_uspjeh[i] != nullptr) {
  150.  
  151.                 _uspjeh[i]->Dealociraj();
  152.  
  153.                 delete _uspjeh[i];
  154.  
  155.             }
  156.  
  157.         }
  158.  
  159.     }
  160.  
  161.     void Ispis() {
  162.  
  163.         cout << crt << _imePrezime << " " << _nacinStudiranja;
  164.  
  165.         for (size_t i = 0; i < 4; i++)
  166.  
  167.             if (_uspjeh[i] != nullptr)
  168.  
  169.                 _uspjeh[i]->Ispis();
  170.  
  171.     }
  172.  
  173.     // funckija za proglasavanje u kojem je razredu ucenik ostvario najbolji uspjeh
  174.  
  175.     void ProglasiNajboljeg() {
  176.  
  177.         // postavljanje svim razredima na false
  178.  
  179.         for (size_t i = 0; i < 4; i++)
  180.  
  181.             if (_uspjeh[i] != nullptr)
  182.  
  183.                 _uspjeh[i]->_najboljiUcenik = false;
  184.  
  185.  
  186.         float trenutni_uspjeh = 0;
  187.  
  188.         float naj_uspjeh = 0;
  189.  
  190.         Uspjeh *najUspjehPok = nullptr; // pokazivac na najbolji uspjeh preko koga cemo modifikovat vrijednost
  191.  
  192.         for (size_t i = 0; i < 4; i++)
  193.  
  194.         {
  195.  
  196.             trenutni_uspjeh = 0;
  197.  
  198.             if (_uspjeh[i] != nullptr)
  199.             {
  200.  
  201.  
  202.                 for (size_t j = 0; j < _uspjeh[i]->_brojPredmeta; j++)
  203.  
  204.                 {
  205.  
  206.                     trenutni_uspjeh = trenutni_uspjeh + *_uspjeh[i]->_predmeti[j]->_ocjena;
  207.  
  208.                 }
  209.  
  210.                 trenutni_uspjeh = trenutni_uspjeh / _uspjeh[i]->_brojPredmeta;
  211.  
  212.                 if (trenutni_uspjeh > naj_uspjeh) {
  213.  
  214.                     naj_uspjeh = trenutni_uspjeh;
  215.  
  216.                     najUspjehPok = _uspjeh[i];
  217.  
  218.                 }
  219.  
  220.  
  221.             }
  222.  
  223.         }
  224.  
  225.         // postavljanje _najboljiUcenik na true
  226.  
  227.         najUspjehPok->_najboljiUcenik = true;
  228.  
  229.     }
  230.  
  231.     // funkcija koja vraca broj dana na osnovu proslijedjenog datuma
  232.  
  233.     int VratiDane(Datum d) {
  234.  
  235.         return d._dan + d._mjesec * 30 + d._godina * 365;
  236.  
  237.     }
  238.  
  239.     // funkcija za dodavanje predmeta
  240.  
  241.     bool DodajPredmet(eRazred razred, Predmet p) {
  242.  
  243.         int brojac_predemta = 0;
  244.  
  245.         // brojanje koliko imamo dodani predmeta ovog naziva
  246.  
  247.         for (size_t i = 0; i < 4; i++)
  248.  
  249.         {
  250.  
  251.             if (_uspjeh[i] != nullptr) {
  252.  
  253.                 for (size_t j = 0; j < _uspjeh[i]->_brojPredmeta; j++)
  254.  
  255.                 {
  256.  
  257.                     if (strcmp(_uspjeh[i]->_predmeti[j]->_naziv, p._naziv) == 0)
  258.  
  259.                         brojac_predemta++;
  260.  
  261.                 }
  262.  
  263.             }
  264.  
  265.         }
  266.  
  267.         // u slucaju da imamo 2 predmeta sa ovim nazivom
  268.  
  269.         // onemogucavamo unos ovog predmeta ponovo
  270.  
  271.         if (brojac_predemta >= 2) return false;
  272.  
  273.         // u slucaju da je rok za prijavu istekao onemogucavamo unos
  274.  
  275.         // OBJASNJENJE USLOVA -> ->
  276.  
  277.         //Ako neki datum ima vise dana u odnosu na rok za prijavu znaci da je taj datum poslije roka za prijavu
  278.  
  279.         // sto znaci da je prosao
  280.  
  281.         // Primjer -> ->
  282.  
  283.         // rok za prijavu je 5.7.2017
  284.  
  285.         // a datum koji primamo je 6.7.2017 <- <- <- ovaj datum ima vise dana u odnosu na rok za prijavu sto znaci da je "istekao"
  286.  
  287.         if (VratiDane(p._datumUnosa) >= VratiDane(rokZaPrijavu)) return false;
  288.  
  289.         // ukoliko se ni jedan od uslova ne ispuni znaci da mozemo dodati predmet
  290.  
  291.         // provjera da li je uspjeh vec alociran u slucaju da jest nece se izvrsiti ponovna alokacija
  292.  
  293.         // u slucaju da nije vrsi se alokacija pa se dodaje predmet
  294.  
  295.         if (_uspjeh[(int)razred - 1] == nullptr)
  296.         {
  297.  
  298.             _uspjeh[(int)razred - 1] = new Uspjeh;
  299.  
  300.             // u pocetku stavljamo da je najbolji false
  301.  
  302.             _uspjeh[(int)razred - 1]->Unos(razred, false);
  303.  
  304.         }
  305.  
  306.         // dodavanje predmeta
  307.  
  308.         _uspjeh[(int)razred - 1]->DodajPredmet(p);
  309.  
  310.         // funkcija za proglasavanje u kojem se razredu nalazi najbolji ucenik
  311.  
  312.         ProglasiNajboljeg();
  313.  
  314.  
  315.         return true;
  316.  
  317.     }
  318.  
  319. };
  320.  
  321.  
  322.  
  323. Kandidat *rekNajboljiProsjek(Kandidat *kandidati, int brojKandidata, eRazred razred, Kandidat *najboljiKandidat = nullptr, float prosjekNajboljegKandidata = 0)
  324. {
  325.  
  326.     if (brojKandidata - 1 <= 0)
  327.  
  328.         return najboljiKandidat;
  329.  
  330.     if (kandidati[brojKandidata - 1]._uspjeh[(int)razred - 1] == nullptr)
  331.  
  332.         return rekNajboljiProsjek(kandidati, brojKandidata - 1, razred, najboljiKandidat, prosjekNajboljegKandidata);
  333.  
  334.     // racunanje prosjeka
  335.     float prosjek = 0;
  336.  
  337.     for (size_t i = 0; i < kandidati[brojKandidata - 1]._uspjeh[(int)razred - 1]->_brojPredmeta; i++)
  338.  
  339.     {
  340.  
  341.         prosjek = prosjek + *kandidati[brojKandidata - 1]._uspjeh[(int)razred - 1]->_predmeti[i]->_ocjena;
  342.  
  343.     }
  344.  
  345.     prosjek = prosjek / kandidati[brojKandidata - 1]._uspjeh[(int)razred - 1]->_brojPredmeta;
  346.  
  347.     if (najboljiKandidat == nullptr)
  348.  
  349.         return rekNajboljiProsjek(kandidati, brojKandidata - 1, razred, &kandidati[brojKandidata - 1], prosjek);
  350.  
  351.     if (prosjek>prosjekNajboljegKandidata)
  352.  
  353.         return rekNajboljiProsjek(kandidati, brojKandidata - 1, razred, &kandidati[brojKandidata - 1], prosjek);
  354.  
  355.     return rekNajboljiProsjek(kandidati, brojKandidata - 1, razred, najboljiKandidat, prosjekNajboljegKandidata);
  356.  
  357.  
  358. }
  359.  
  360.  
  361.  
  362. void main()
  363. {
  364.  
  365.     Datum datum19062017, datum20062017, datum30062017, datum05072017;
  366.  
  367.     datum19062017.Unos(19, 6, 2017);
  368.  
  369.     datum20062017.Unos(20, 6, 2017);
  370.  
  371.     datum30062017.Unos(30, 6, 2017);
  372.  
  373.     datum05072017.Unos(5, 7, 2017);
  374.  
  375.  
  376.     Predmet Matematika, Fizika, Hemija, Engleski;
  377.  
  378.     //2 - ocjena na predmetu; datum - datum evidentiranja uspjeha na predmetu jer postoji krajnji rok za evidentiranje
  379.  
  380.     Matematika.Unos("Matematika", 2, datum19062017);
  381.  
  382.     Fizika.Unos("Fizika", 5, datum20062017);
  383.  
  384.     Hemija.Unos("Hemija", 2, datum20062017);
  385.  
  386.     Engleski.Unos("Engleski", 5, datum05072017);
  387.  
  388.  
  389.     int brojKandidata = 2;
  390.  
  391.  
  392.     Kandidat * prijave2017 = new Kandidat[brojKandidata];
  393.  
  394.     prijave2017[0].Unos(DL, "Jasmin Azemovic");
  395.  
  396.     prijave2017[1].Unos(REDOVAN, "Indira Hamulic");
  397.  
  398.     /*
  399.  
  400.     uspjeh (tokom srednjoskolskog obrazovanja) se dodaje za svaki predmet na nivou razreda. prilikom dodavanja onemoguciti:
  401.     - istoimeni predmet se moze dodati samo
  402.     dva puta, bez obzira sto se dodaje na razlicitim godinama,
  403.     - dodavanje predmeta nakon dozvoljenog roka za prijavu (rokZaPrijavu).
  404.     razredi (predmeti ili uspjeh)
  405.     ne moraju biti dodavani sortiranim redoslijedom (npr. prvo se moze dodati uspjeh za II razred, pa onda za I razred i sl.). Funkcija vraca neku od predefinisanih
  406.     poruka u zavisnosti od (ne)uspjesnost izvrsenja
  407.     */
  408.  
  409.  
  410.     if (prijave2017[0].DodajPredmet(DRUGI, Engleski))
  411.         //ne bi trebao dodati jer je prosao postavljeni rok za dodavanje predmeta
  412.  
  413.         cout << "Predmet uspjesno dodan!" << crt;
  414.  
  415.     if (prijave2017[0].DodajPredmet(DRUGI, Matematika))
  416.  
  417.         cout << "Predmet uspjesno dodan!" << crt;
  418.  
  419.     if (prijave2017[0].DodajPredmet(PRVI, Fizika))
  420.  
  421.         cout << "Predmet uspjesno dodan!" << crt;
  422.  
  423.     if (prijave2017[0].DodajPredmet(PRVI, Hemija))
  424.  
  425.         cout << "Predmet uspjesno dodan!" << crt;
  426.  
  427.  
  428.     Matematika.PromijeniOcjenu(5);
  429.  
  430.     Hemija.PromijeniOcjenu(3);
  431.  
  432.  
  433.     if (prijave2017[1].DodajPredmet(PRVI, Matematika))
  434.  
  435.         cout << "Predmet uspjesno dodan!" << crt;
  436.  
  437.     if (prijave2017[1].DodajPredmet(DRUGI, Matematika))
  438.  
  439.         cout << "Predmet uspjesno dodan!" << crt;
  440.  
  441.     if (prijave2017[1].DodajPredmet(TRECI, Matematika))//ne bi trebalo ponovo dodati Matematiku!
  442.  
  443.         cout << "Predmet uspjesno dodan!" << crt;
  444.  
  445.     if (prijave2017[1].DodajPredmet(TRECI, Hemija))
  446.  
  447.         cout << "Predmet uspjesno dodan!" << crt;
  448.  
  449.     if (prijave2017[1].DodajPredmet(DRUGI, Engleski))
  450.  
  451.         cout << "Predmet uspjesno dodan!" << crt;
  452.  
  453.  
  454.  
  455.     /*
  456.     koristeci Lambda izraz kreirati funkciju koja ce vratiti uspjeh kandidata koji je ostvario najveci prosjek (na nivou razreda, a ne ukupni prosjek).
  457.     funkcija prima parametre tipa eNacinStudiranja (pretrazuje samo kandidate za Redovan ili DL nacin studiranja) i bool kojim se omogucava pretraga samo
  458.     onih razreda na kojim su kandidati bili najbolji ucenici (ako se funkciji proslijedi vrijednost true, ona ce uzeti u obzir samo one razrede kada su kandidati
  459.     oznaceni kao najbolji). ukoliko vise kandidata ima isti prosjek funkcija vraca uspjeh (najboljeg razreda) prvog pronadjenog kandidata
  460.     */
  461.  
  462.     auto najboljiUspjeh = [prijave2017, brojKandidata](eNacinStudiranja nacin, bool najbolji)
  463.     {
  464.  
  465.  
  466.         float trenutniProsjek = 0;
  467.  
  468.         float najboljiProsjek = 0;
  469.  
  470.         Uspjeh *najboljiUspjeh = nullptr;
  471.  
  472.  
  473.         for (size_t i = 0; i < brojKandidata; i++)
  474.  
  475.         {
  476.  
  477.             if (prijave2017[i]._nacinStudiranja == nacin) { // provjera za nacin studiranja koji je proslijedjen
  478.  
  479.                 for (size_t j = 0; j < 4; j++)
  480.  
  481.                 {
  482.  
  483.                     trenutniProsjek = 0;
  484.  
  485.                     if (prijave2017[i]._uspjeh[j] != nullptr && prijave2017[i]._uspjeh[j]->_najboljiUcenik == najbolji)
  486.                     { // provjera samo za one razrede u kojima je kandidat proglasen najboljim
  487.  
  488.                         for (size_t k = 0; k < prijave2017[i]._uspjeh[j]->_brojPredmeta; k++)
  489.  
  490.                         {
  491.  
  492.                             trenutniProsjek = trenutniProsjek + *prijave2017[i]._uspjeh[j]->_predmeti[k]->_ocjena;
  493.  
  494.                         }
  495.  
  496.                         trenutniProsjek = trenutniProsjek / prijave2017[i]._uspjeh[j]->_brojPredmeta;
  497.  
  498.                         if (trenutniProsjek > najboljiProsjek) {
  499.  
  500.                             najboljiProsjek = trenutniProsjek;
  501.  
  502.                             najboljiUspjeh = prijave2017[i]._uspjeh[j];
  503.  
  504.                         }
  505.  
  506.                     }
  507.  
  508.                 }
  509.  
  510.             }
  511.  
  512.         }
  513.  
  514.  
  515.         return najboljiUspjeh;
  516.  
  517.     };
  518.  
  519.  
  520.     Uspjeh * najbolji = najboljiUspjeh(DL, true);
  521.  
  522.     najbolji->Ispis();
  523.  
  524.  
  525.  
  526.     /*
  527.     napisati rekurzivnu funkciju koja ce vratiti pokazivac na kandidata sa najvecim prosjekom u razredu koji je proslijedjen kao parametar. ukoliko je vise
  528.     kandidata ostvarilo isti prosjek, funkcija treba da vrati posljednje pronadjenog kandidata. u slucaju da niti jedan kandidat nije evidentirao uspjeh u trazenom
  529.     razredu, funkcija vraca nullptr. u nastavku je prikazan primjer poziva rekurzivne funkcije, a ostale parametre dodajte po potrebi. */
  530.  
  531.     Kandidat * kandidatSaNajboljimProsjekom = rekNajboljiProsjek(prijave2017, brojKandidata, DRUGI);
  532.  
  533.  
  534.     for (size_t i = 0; i < brojKandidata; i++)
  535.  
  536.     {
  537.  
  538.         prijave2017[i].Ispis();
  539.  
  540.         prijave2017[i].Dealociraj();
  541.  
  542.     }
  543.  
  544.     system("pause>0");
  545. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement