Advertisement
limun11

predefinisane poruke-uspjeh

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