Advertisement
limun11

Grupa b - KONACNA (niz karaktera...)

Jul 6th, 2017
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.65 KB | None | 0 0
  1. #include <iostream>
  2. #include <memory>
  3. #include <functional>
  4. using namespace std;
  5. /*
  6. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE BODOVATI
  7. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  8. 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
  9. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  10. 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)
  11. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  12. */
  13. //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
  14. #pragma warning(disable:4996)
  15.  
  16. char *crt = "\n-------------------------------------------\n";
  17.  
  18. enum eNacinStudiranja { REDOVAN, DL };
  19. enum eRazred { PRVI = 1, DRUGI, TRECI, CETVRTI };
  20.  
  21.  
  22. struct DatumVrijeme
  23. {
  24.     int *_dan, *_mjesec, *_godina, *_sati, *_minuti;
  25.     void Unos(int dan = 1, int mjesec = 1, int godina = 2000, int sati = 0, int minuti = 0)
  26.     {
  27.         _dan = new int(dan);
  28.         _mjesec = new int(mjesec);
  29.         _godina = new int(godina);
  30.         _sati = new int(sati);
  31.         _minuti = new int(minuti);
  32.     }
  33.     void Dealociraj()
  34.     {
  35.         delete _dan; _dan = nullptr;
  36.         delete _mjesec; _mjesec = nullptr;
  37.         delete _godina; _godina = nullptr;
  38.         delete _sati; _sati = nullptr;
  39.         delete _minuti; _minuti = nullptr;
  40.     }
  41.     void Ispis()
  42.     {
  43.         cout << *_dan << "." << *_mjesec << "." << *_godina << " " << *_sati << ":" << *_minuti << endl;
  44.     }
  45.     char * GetDatumKaoNizKaraktera()
  46.     {
  47.         //kreirati funkciju GetDatumKaoNizKaraktera() koja vraca vrijednosti atributa strukture datum kao niz karaktera
  48.         char dan[3], mjesec[3], godina[5], sati[3], minuta[3];
  49.         _itoa(*_dan, dan, 10);
  50.         _itoa(*_mjesec, mjesec, 10);
  51.         _itoa(*_godina, godina, 10);
  52.         _itoa(*_sati, sati, 10);
  53.         _itoa(*_minuti, minuta, 10);
  54.  
  55.         int size = strlen(dan)+1 + strlen(mjesec)+1 + strlen(godina)+1 + strlen(sati)+1 + strlen(minuta)+1;
  56.         char * niz = new char[size];
  57.  
  58.         strcpy_s(niz, size, dan);
  59.         strcat_s(niz, size, ".");
  60.         strcat_s(niz, size, mjesec);
  61.         strcat_s(niz, size, ".");
  62.         strcat_s(niz, size, godina);
  63.         strcat_s(niz, size, " ");
  64.         strcat_s(niz, size, sati);
  65.         strcat_s(niz, size, ":");
  66.         strcat_s(niz, size, minuta);
  67.  
  68.         return niz;
  69.  
  70.     }
  71.     bool provjera(DatumVrijeme datum)
  72.     {
  73.         if (*datum._godina >* _godina)
  74.             return false;
  75.         else if (*datum._godina == *_godina && *datum._mjesec > *_mjesec)
  76.             return false;
  77.         else if (*datum._mjesec == *_mjesec && *datum._dan > *_dan)
  78.             return false;
  79.         else if (*datum._dan == *_dan && *datum._sati > *_sati)
  80.             return false;
  81.         else if (*datum._sati == *_sati && *datum._minuti >* _minuti)
  82.             return false;
  83.         else return true;
  84.     }
  85. };
  86.  
  87. const DatumVrijeme rokZaPrijavu = { new int(5), new int(7), new int(2017), new int(12), new int(30) };
  88.  
  89.  
  90. struct Predmet
  91. {
  92.     char * _naziv;
  93.     int _ocjena;
  94.     DatumVrijeme * _datumUnosa;
  95.     void Unos(char * naziv, int ocjena, DatumVrijeme datumUnosa) {
  96.         int vel = strlen(naziv) + 1;
  97.         _naziv = new char[vel];
  98.         strcpy_s(_naziv, vel, naziv);
  99.         _ocjena = ocjena;
  100.         _datumUnosa = new DatumVrijeme;
  101.         _datumUnosa->Unos(*datumUnosa._dan, *datumUnosa._mjesec, *datumUnosa._godina, *datumUnosa._sati, *datumUnosa._minuti);
  102.     }
  103.     void Dealociraj()
  104.     {
  105.         delete[] _naziv; _naziv = nullptr;
  106.         _datumUnosa->Dealociraj(); delete _datumUnosa; _datumUnosa = nullptr;
  107.     }
  108.  
  109.     void Ispis()
  110.     {
  111.         //kreirati funkciju GetDatumKaoNizKaraktera() koja vraca vrijednosti atributa strukture datum kao niz karaktera
  112.         cout << _naziv << " (" << _ocjena << ") " << _datumUnosa->GetDatumKaoNizKaraktera() << endl;
  113.     }
  114. };
  115.  
  116. struct Uspjeh
  117. {
  118.     eRazred _razred;
  119.     Predmet * _predmeti;
  120.     int _brojPredmeta;
  121.     void Unos(eRazred razred)
  122.     {
  123.         _razred = razred;
  124.         _predmeti = nullptr;
  125.         _brojPredmeta = 0;
  126.     }
  127.     void Dealociraj()
  128.     {
  129.         for (size_t i = 0; i < _brojPredmeta; i++)
  130.             _predmeti[i].Dealociraj();
  131.         delete[] _predmeti; _predmeti = nullptr;
  132.     }
  133.  
  134.     void Ispis()
  135.     {
  136.         cout << crt << "Razred -> " << _razred << crt;
  137.         for (size_t i = 0; i < _brojPredmeta; i++)
  138.             _predmeti[i].Ispis();
  139.     }
  140.     void dodajPredmet(Predmet  predmet)
  141.     {
  142.         Predmet * temp= new Predmet[_brojPredmeta + 1];
  143.         for (int i = 0; i < _brojPredmeta; i++)
  144.         {
  145.             temp[i].Unos(_predmeti[i]._naziv, _predmeti[i]._ocjena, *_predmeti[i]._datumUnosa);
  146.         }
  147.         temp[_brojPredmeta].Unos(predmet._naziv, predmet._ocjena, *predmet._datumUnosa);
  148.         for (int i = 0; i < _brojPredmeta; i++)
  149.         {
  150.             _predmeti[i].Dealociraj();
  151.         }
  152.         delete[] _predmeti;
  153.         _predmeti = temp;
  154.         _brojPredmeta++;
  155.     }
  156. };
  157.  
  158. struct Kandidat
  159. {
  160.     eNacinStudiranja _nacinStudiranja;
  161.     char * _imePrezime;
  162.     shared_ptr<Uspjeh> _uspjeh[4];
  163.  
  164.     void Unos(eNacinStudiranja nacinStudiranja, char * imePrezime)
  165.     {
  166.         int vel = strlen(imePrezime) + 1;
  167.         _imePrezime = new char[vel];
  168.         strcpy_s(_imePrezime, vel, imePrezime);
  169.         _nacinStudiranja = nacinStudiranja;
  170.         for (size_t i = 0; i < 4; i++)
  171.         {
  172.             if (_uspjeh[i] == nullptr)
  173.                 continue;
  174.             _uspjeh[i] = nullptr;
  175.         }
  176.     }
  177.     void Dealociraj()
  178.     {
  179.         delete[] _imePrezime; _imePrezime = nullptr;
  180.         for (size_t i = 0; i < 4; i++)
  181.         {
  182.             if(_uspjeh[i]!=nullptr)
  183.             _uspjeh[i]->Dealociraj();
  184.         }
  185.     }
  186.     void Ispis()
  187.     {
  188.         cout << crt << _imePrezime << " " << _nacinStudiranja;
  189.         for (size_t i = 0; i < 4; i++)
  190.         {
  191.             if(_uspjeh[i]!=nullptr)
  192.             _uspjeh[i]->Ispis();
  193.         }
  194.     }
  195.     /*
  196.     uspjeh (tokom srednjoskolskog obrazovanja) se dodaje za svaki predmet na nivou razreda.
  197.     prilikom dodavanja onemoguciti:
  198.     - dodavanje predmeta za razrede koji nisu definisani enumeracijom,
  199.     - dodavanje istoimenih predmeta na nivou jednog razreda,
  200.     - dodavanje predmeta nakon dozvoljenog roka za prijavu (rokZaPrijavu).
  201.     razredi (predmeti ili uspjeh) ne moraju biti dodavani sortiranim redoslijedom
  202.     (npr. prvo se moze dodati uspjeh za II razred, pa onda za I razred i sl.).
  203.     Funkcija vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja
  204.     */
  205.     bool DodajPredmet(eRazred razred, Predmet predmet)
  206.     {
  207.         if (razred != PRVI && razred != DRUGI && razred != TRECI && razred != CETVRTI)
  208.         {
  209.             cout << "Razred nije definisan enumeracijom... " << endl;
  210.             return false;
  211.         }
  212.         if (_uspjeh[razred - 1] != nullptr)
  213.         {
  214.             for (int i = 0; i < _uspjeh[razred - 1]->_brojPredmeta; i++)
  215.             {
  216.                 if (strcmp(_uspjeh[razred - 1]->_predmeti[i]._naziv, predmet._naziv) == 0)
  217.                 {
  218.                     cout << "Isti predmet ne moze biti dodan! " << crt;
  219.                     return false;
  220.                 }
  221.             }
  222.         }
  223.         if (predmet._datumUnosa->provjera(rokZaPrijavu))
  224.         {
  225.             cout << "Prosao rok prijave... " << crt;
  226.             return false;
  227.         }
  228.         for (int i = 0; i < 4; i++)
  229.         {
  230.             if (_uspjeh[i] == nullptr) //trazimo prvi slobodan uspjeh gdje nema nista koji je prazan pa cemo ga puniti
  231.             {
  232.                 _uspjeh[i] = make_shared<Uspjeh>();
  233.                 _uspjeh[i]->Unos(razred);
  234.                 _uspjeh[i]->dodajPredmet(predmet);
  235.                 return true;
  236.             }
  237.         }
  238.     }
  239. };
  240.  
  241. void main()
  242. {
  243.     DatumVrijeme datum19062017_1015, datum20062017_1115, datum30062017_1215, datum05072017_1231;
  244.     datum19062017_1015.Unos(19, 6, 2017, 10, 15);
  245.     datum20062017_1115.Unos(20, 6, 2017, 11, 15);
  246.     datum30062017_1215.Unos(30, 6, 2017, 12, 15);
  247.     datum05072017_1231.Unos(5, 7, 2017, 12, 31);
  248.  
  249.     cout << datum19062017_1015.GetDatumKaoNizKaraktera() << endl;//9.6.2017 10:15
  250.  
  251.     Predmet Matematika, Fizika, Hemija, Engleski;
  252.     //2 - ocjena na predmetu; datum - datum evidentiranja uspjeha na predmetu jer postoji krajnji rok za evidentiranje
  253.     Matematika.Unos("Matematika", 2, datum19062017_1015);
  254.     Fizika.Unos("Fizika", 5, datum20062017_1115);
  255.     Hemija.Unos("Hemija", 2, datum20062017_1115);
  256.     Engleski.Unos("Engleski", 5, datum05072017_1231);
  257.  
  258.     int brojKandidata = 2;
  259.  
  260.     Kandidat * prijave2017 = new Kandidat[brojKandidata];
  261.     prijave2017[0].Unos(DL, "Jasmin Azemovic");
  262.     prijave2017[1].Unos(REDOVAN, "Indira Hamulic");
  263.  
  264.    
  265.     if (prijave2017[0].DodajPredmet(DRUGI, Engleski))//ne bi trebao dodati jer je prosao postavljeni rok za dodavanje predmeta
  266.         cout << "Predmet uspjesno dodan!" << crt;
  267.     if (prijave2017[0].DodajPredmet(DRUGI, Matematika))
  268.         cout << "Predmet uspjesno dodan!" << crt;
  269.     if (prijave2017[0].DodajPredmet(PRVI, Fizika))
  270.         cout << "Predmet uspjesno dodan!" << crt;
  271.     if (prijave2017[0].DodajPredmet(PRVI, Hemija))
  272.         cout << "Predmet uspjesno dodan!" << crt;
  273.  
  274.     Matematika._ocjena = 5;
  275.     Hemija._ocjena = 3;
  276.  
  277.     if (prijave2017[1].DodajPredmet(PRVI, Matematika))
  278.         cout << "Predmet uspjesno dodan!" << crt;
  279.     if (prijave2017[1].DodajPredmet(PRVI, Matematika))//ne bi trebalo ponovo dodati Matematiku!
  280.         cout << "Predmet uspjesno dodan!" << crt;
  281.     if (prijave2017[1].DodajPredmet(TRECI, Hemija))
  282.         cout << "Predmet uspjesno dodan!" << crt;
  283.     if (prijave2017[1].DodajPredmet(DRUGI, Engleski))
  284.         cout << "Predmet uspjesno dodan!" << crt;
  285.  
  286.     /*
  287.     koristeci Lambda izraz kreirati funkciju koja ce vratiti uspjeh kandidata koji je ostvario najveci prosjek
  288.     (na nivou razreda, a ne ukupni prosjek). ukoliko vise kandidata ima isti prosjek funkcija vraca uspjeh (najboljeg razreda)
  289.     prvog pronadjenog kandidata
  290.     */
  291.     auto najboljiUspjeh = [prijave2017, brojKandidata]()->shared_ptr<Uspjeh>
  292.     {
  293.         float najveciProsjek = 0;//informacija o najvecem prosjeku
  294.         int indexKandidata = 0;//index kandidata koji ima taj nejveci prosjek
  295.         int indexUspjeha = 0; //index uspjeha unutar tog kandidata
  296.         for (int i = 0; i < brojKandidata; i++) //prolazimo kroz sve kandidate
  297.         {
  298.             for (int j = 0; j < 4; j++) // svaki kandidat ima 4 uspjeha
  299.             {
  300.                 if (prijave2017[i]._uspjeh[j] != nullptr) //uspjeh pokazuje na nešto, odnosno nije nullptr
  301.                 {
  302.                     float prosjek = 0;
  303.                     for (int k = 0; k < prijave2017[i]._uspjeh[j]->_brojPredmeta; k++) //prosjek=suma ocjena / broj predmeta
  304.                     {
  305.                         //1. suma ocjena:
  306.                         prosjek += prijave2017[i]._uspjeh[j]->_predmeti[k]._ocjena;
  307.                         //2. prosjek=sabrane ocjene/broj predmeta
  308.                         prosjek = prosjek / prijave2017[i]._uspjeh[j]->_brojPredmeta;
  309.  
  310.                         if (prosjek == najveciProsjek)// ako neko ranije vec ima najveci prosjek break jer prvi koji ga ima nam
  311.                             //treba ostati ascuvan
  312.                             break;
  313.  
  314.                         if (prosjek > najveciProsjek) // ako je novi prosjek veci od prethodnog najveceg
  315.                         {
  316.                             najveciProsjek = prosjek; //najveci prethodni prosjek postaje novi najveci prosjek
  317.                             indexKandidata = i; //cuvamo index kandidata koji ima taj nejaveci prosjek
  318.                             indexUspjeha = j; // cuvamo index uspjeha u pronadjenom kandidatu
  319.                         }
  320.                     }
  321.                 }
  322.             }
  323.         }
  324.         if (najveciProsjek == 0)
  325.             return nullptr; // ako nismo nista nasli prosjek ostaje na nuli, tj vracamo nullptr
  326.         shared_ptr<Uspjeh>pokazivac = prijave2017[indexKandidata]._uspjeh[indexUspjeha];
  327.         return pokazivac;
  328.     };
  329.     cout << "Najbolji uspjeh: ";
  330.     shared_ptr<Uspjeh> najbolji = najboljiUspjeh();
  331.     najbolji->Ispis();
  332.     /*
  333.     napisati rekurzivnu funkciju koja ce vratiti pokazivac na kandidata sa najvecom ocjenom na predmetu koji je proslijedjen kao parametar. ukoliko je vise kandidata ostvarilo istu ocjenu, funkcija treba da vrati onog kandidata koji je prvi evidentirao tu ocjenu (ako je isto vrijeme evidentiranja, onda funkcija vraca kandidata koji je prvi u nizu).  u slucaju da niti jedan kandidat nije evidentirao trazeni predmet funkcija vraca nullptr. u nastavku je prikazan primjer poziva rekurzivne funkcije, a ostale parametre dodajte po potrebi.
  334.     */
  335.     //Kandidat * kandidatSaNajboljomOcjenom = rekNajboljaOcjena(prijave2017, brojKandidata, "Matematika");
  336.  
  337.     for (size_t i = 0; i < brojKandidata; i++)
  338.     {
  339.         prijave2017[i].Ispis();
  340.         prijave2017[i].Dealociraj();
  341.     }
  342.     delete[] prijave2017;
  343.     prijave2017 = nullptr;
  344.  
  345.     system("pause>0");
  346. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement