Advertisement
limun11

Predmeti - Konacna

Jun 9th, 2017
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.79 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
  5. #pragma warning(disable:4996)
  6.  
  7. enum enumPredmeti { Matematika, Historija, Geografia, Hemija, Biologija, Engleski };
  8. char * predmetiChar[] = { "Matematika", "Historija", "Geografia", "Hemija", "Biologija", "Engleski" };
  9. enum enumRazredi { I, II, III, IV };
  10. char * razrediChar[] = { "I", "II", "III", "IV" };
  11. char *crt = "\n--------------------------------------------\n";
  12.  
  13. struct Datum
  14. {
  15.     int * _dan, *_mjesec, *_godina;
  16.     void Unos(int d, int m, int g)
  17.     {
  18.         _dan = new int(d);
  19.         _mjesec = new int(m);
  20.         _godina = new int(g);
  21.     }
  22.     void Ispis()
  23.     {
  24.         cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl;
  25.     }
  26.     void Dealociraj()
  27.     {
  28.         delete _dan; _dan = nullptr;
  29.         delete _mjesec;  _mjesec = nullptr;
  30.         delete _godina; _godina = nullptr;
  31.     }
  32.  
  33.     bool ProvjeraDatuma(Datum datum)
  34.     {
  35.         if (*datum._godina != *_godina)
  36.         {
  37.             return true;
  38.         }
  39.         else if (*datum._godina == *_godina && *datum._mjesec != *_mjesec)
  40.         {
  41.             return true;
  42.         }
  43.         else if (*datum._godina == *_godina && *datum._mjesec == *_mjesec &&* datum._dan != *_dan)
  44.         {
  45.             return true;
  46.         }
  47.         else return false;
  48.     }
  49.  
  50.     bool ProvjeraDatuma15Dana(Datum datum)
  51.     {
  52.         if (*datum._godina > *_godina)
  53.             return true;
  54.         else if (*datum._godina == *_godina &&* datum._mjesec >* _mjesec)
  55.             return true;
  56.         else if (*datum._mjesec == *_mjesec && *datum._dan - *_dan > 15)
  57.             return true;
  58.         else return false;
  59.     }
  60.     bool provjeraODDO(Datum datum)
  61.     {
  62.         if (*datum._godina < *_godina)
  63.             return true;
  64.         else if (*datum._godina == *_godina && *datum._mjesec < *_mjesec)
  65.             return true;
  66.         else if (*datum._mjesec == *_mjesec && *datum._dan < *_dan)
  67.             return true;
  68.         else return false;
  69.     }
  70. };
  71.  
  72. struct Kurs
  73. {
  74.     enumPredmeti _predmet;
  75.     enumRazredi _razredi;
  76.     Datum * _pocetak;
  77.     Datum * _kraj;
  78.     char * _imePredavaca;
  79.  
  80.     bool _aktivan; //kurs je aktivan
  81.  
  82.     void Unos(enumPredmeti predmet, enumRazredi razred, Datum pocetak, Datum kraj, char * imePredavaca)
  83.     {
  84.         _predmet = predmet;
  85.         _razredi = razred;
  86.         _pocetak = new Datum;
  87.         _pocetak->Unos(*pocetak._dan, *pocetak._mjesec, *pocetak._godina);
  88.         _kraj = new Datum;
  89.         _kraj->Unos(*kraj._dan, *kraj._mjesec, *kraj._godina);
  90.         /*int size = strlen(imePredavaca) + 1;
  91.         imePredavaca = new char[size];
  92.         strcpy_s(imePredavaca, size, _imePredavaca);*/
  93.         int size = strlen(imePredavaca) + 1;
  94.         _imePredavaca = new char[size];
  95.         strcpy_s(_imePredavaca, size, imePredavaca);
  96.     }
  97.     void Ispis()
  98.     {
  99.         cout << crt;
  100.         cout << "Predmet: " << predmetiChar[_predmet] << endl;
  101.         cout << "Razred: " << razrediChar[_razredi] << endl;
  102.         cout << "Datum pocetka: ";
  103.         _pocetak->Ispis();
  104.         cout << "Datum kraja: ";
  105.         _kraj->Ispis();
  106.         cout << "Ime predavaca: " << _imePredavaca << endl;
  107.     }
  108.     void Dealociraj()
  109.     {
  110.         delete[] _imePredavaca; _imePredavaca = nullptr;
  111.         _pocetak->Dealociraj(); delete[] _pocetak; _pocetak = nullptr;
  112.         _kraj->Dealociraj(); delete[] _kraj; _kraj = nullptr;
  113.     }
  114. };
  115. struct Polaznik
  116. {
  117.     Datum * _datumRodjenja;
  118.     char * _imePrezime;
  119.  
  120.     void Unos(Datum datumRodjenja, char * imePrezime)
  121.     {
  122.         int size = strlen(imePrezime) + 1;
  123.         _imePrezime = new char[size];
  124.         strcpy_s(_imePrezime, size, imePrezime);
  125.         _datumRodjenja = new Datum;
  126.         _datumRodjenja->Unos(*datumRodjenja._dan, *datumRodjenja._mjesec, *datumRodjenja._godina);
  127.     }
  128.     void Dealociraj()
  129.     {
  130.         delete[] _imePrezime; _imePrezime = nullptr;
  131.         _datumRodjenja->Dealociraj(); delete[] _datumRodjenja; _datumRodjenja = nullptr;
  132.     }
  133.     void Ispis()
  134.     {
  135.         cout << crt;
  136.         cout << "Ime i prezime polaznika: " << _imePrezime << endl;
  137.         cout << "Datum rodjenja polaznika: ";
  138.         _datumRodjenja->Ispis();
  139.     }
  140. };
  141. struct Polaganja
  142. {
  143.     Polaznik * _polaznik;
  144.     Kurs * _kurs;
  145.     Datum * _datumPolaganja;
  146.     int _ocjena; //ocjene su u rasponu od 1 do 5
  147.  
  148.     void Unos(Polaznik polaznik, Kurs kurs, Datum datum, int ocjena)
  149.     {
  150.         _polaznik = new Polaznik;
  151.         _polaznik->Unos(*polaznik._datumRodjenja, polaznik._imePrezime);
  152.         _kurs = new Kurs;
  153.         _kurs->Unos(kurs._predmet, kurs._razredi, *kurs._pocetak, *kurs._kraj, kurs._imePredavaca);
  154.         _datumPolaganja = new Datum;
  155.         _datumPolaganja->Unos(*datum._dan, *datum._mjesec, *datum._godina);
  156.         _ocjena = ocjena;
  157.     }
  158.  
  159.     void Ispis()
  160.     {
  161.         cout << "-- Polaznik -- ";
  162.         _polaznik->Ispis();
  163.         cout << "-- Kurs -- ";
  164.         _kurs->Ispis();
  165.         cout << "Datum polaganja: ";
  166.         _datumPolaganja->Ispis();
  167.         cout << "Ocjena: " << _ocjena << endl;
  168.         //3 predstavlja ostvareni uspjeh / ocjenu,
  169.         //a uspjesno polozenim se smatra svaki kurs na kome je polaznik ostvario ocjenu veću od 1
  170.         if (_ocjena > 1)
  171.             cout << "Uspjesno polozeno! " << endl;
  172.         else
  173.             cout << "Nije polozeno! " << endl;
  174.     }
  175.  
  176.     void Dealociraj()
  177.     {
  178.         _polaznik->Dealociraj(); delete[]_polaznik; _polaznik = nullptr;
  179.         _kurs->Dealociraj(); delete[] _kurs; _kurs = nullptr;
  180.         _datumPolaganja->Dealociraj(); delete[] _datumPolaganja; _datumPolaganja = nullptr;
  181.     }
  182. };
  183.  
  184. struct EdukacijskiCentar
  185. {
  186.     char * _nazivCentra;
  187.     Kurs * _kursevi[50];//JEDAN EDUKACIJSKI CENTAR MOZE NUDITI NAJVISE 50 KURSEVA
  188.     int _trenutnoKurseva;
  189.     Polaganja * _polaganja;
  190.     int _trenutnoPolaganja;
  191.  
  192.     void Unos(char * nazivCentra)
  193.     {
  194.         int size = strlen(nazivCentra) + 1;
  195.         _nazivCentra = new char[size];
  196.         strcpy_s(_nazivCentra, size, nazivCentra);
  197.  
  198.         _trenutnoKurseva = 0;
  199.         _trenutnoPolaganja = 0;
  200.     }
  201.  
  202.     bool DodajKurs(Kurs kurs)
  203.     {
  204.         //jedan edukacijski centar moze nuditi vise istih kurseva (npr. Matematika),
  205.         //ali se oni moraju realizovati u razlictim periodima (pocetak-kraj) tj. ne smiju se preklapati
  206.         //novi kurs istog tipa (npr. Matematika) se mora realizovati nakon prethodno dodanog
  207.         //npr. ako prethodni kurs Matematika traje 01.03.2016 - 01.04.2016, onda se novi kurs Matematika moze dodati jedino ako pocinje nakon 01.04.2016
  208.         if (_trenutnoKurseva > 50)
  209.             return false;
  210.         if (_trenutnoKurseva == 0)
  211.         {
  212.             _kursevi[_trenutnoKurseva] = new Kurs;
  213.             _kursevi[_trenutnoKurseva]->Unos(kurs._predmet, kurs._razredi, *kurs._pocetak, *kurs._kraj, kurs._imePredavaca);
  214.             _trenutnoKurseva++;
  215.             return true;
  216.         }
  217.         else if (_trenutnoKurseva > 0)
  218.         {
  219.             for (int i = 0; i < _trenutnoKurseva; i++)
  220.             {
  221.                 if (_kursevi[i]->_predmet == kurs._predmet && _kursevi[i]->_kraj->ProvjeraDatuma(*kurs._pocetak) == false);
  222.                 return false;
  223.             }
  224.         }
  225.     }
  226.  
  227.     bool DodajPolaganje(Polaganja polaganje)
  228.     {
  229.         //nije moguce dodati polaganje onog kursa koji nije evidentiran (registrovan, ponudjen) u tom edukacijskom centru
  230.         //kurseve je moguce najkasnije 15 dana od dana zavrsetka (kraja) posljednje dodanog kursa
  231.         //jedan polaznik moze vise puta polagati isti kurs, ali nova ocjena mora biti veca od prethodne ocjene na tom istom kursu
  232.         if (_trenutnoPolaganja == 0)
  233.         {
  234.             _polaganja = new Polaganja;
  235.             _polaganja->Unos(*polaganje._polaznik, *polaganje._kurs, *polaganje._datumPolaganja, polaganje._ocjena);
  236.             _trenutnoPolaganja++;
  237.             return true;
  238.         }
  239.         if (polaganje._kurs->_aktivan == false)
  240.             return false;
  241.         for (int i = 0; i < _trenutnoPolaganja; i++)
  242.         {
  243.             if (strcmp(_polaganja[i]._polaznik->_imePrezime, polaganje._polaznik->_imePrezime) == 0 && _polaganja[i]._ocjena < polaganje._ocjena)
  244.             {
  245.                 _polaganja[i]._ocjena = polaganje._ocjena;
  246.                 return true;
  247.             }
  248.             else if (_polaganja[i]._datumPolaganja->ProvjeraDatuma15Dana(*polaganje._datumPolaganja) == false)
  249.                 return false;
  250.         }
  251.  
  252.         Polaganja * temp = new Polaganja[_trenutnoPolaganja + 1];
  253.         for (int i = 0; i < _trenutnoPolaganja; i++)
  254.         {
  255.             temp[i].Unos(*_polaganja[i]._polaznik, *_polaganja[i]._kurs, *_polaganja[i]._datumPolaganja, _polaganja[i]._ocjena);
  256.         }
  257.         temp[_trenutnoPolaganja].Unos(*polaganje._polaznik, *polaganje._kurs, *polaganje._datumPolaganja, polaganje._ocjena);
  258.         for (int i = 0; i < _trenutnoPolaganja; i++)
  259.         {
  260.             _polaganja[i].Dealociraj();
  261.         }
  262.         delete[] _polaganja;
  263.         _polaganja = temp;
  264.         _trenutnoPolaganja++;
  265.         return true;
  266.     }
  267.  
  268.     Polaganja * PolaganjaByDatumIRazred(Datum OD, Datum DO, enumRazredi razred, int &brojPolaganja)
  269.     {
  270.         //PolaganjaByDatumIRazred - funkcija vraca niz uspjesnih polaganja koja su realizovana u periodu OD - DO,
  271.         //a odnose se na bilo koji predmet u definisanom razredu (npr. II)
  272.         for (int i = 0; i < _trenutnoPolaganja; i++)
  273.         {
  274.             if ((OD.provjeraODDO(*_polaganja[i]._kurs->_pocetak) == false && DO.provjeraODDO(*_polaganja[i]._kurs->_kraj) == true)
  275.                 || _polaganja[i]._kurs->_razredi == razred)
  276.             {
  277.                 brojPolaganja++;
  278.             }
  279.         }
  280.         Polaganja * niz = new Polaganja[brojPolaganja + 1];
  281.         for (int i = 0; i < brojPolaganja; i++)
  282.         {
  283.             niz[i].Unos(*_polaganja[i]._polaznik, *_polaganja[i]._kurs, *_polaganja[i]._datumPolaganja, _polaganja[i]._ocjena);
  284.         }
  285.         return niz;
  286.     }
  287.  
  288.     void sortNiz()
  289.     {
  290.         for (int i = 0; i < _trenutnoKurseva; i++)
  291.         {
  292.             for (int j = 1; j < _trenutnoKurseva; j++)
  293.             {
  294.                 if (_kursevi[j]->_predmet < _kursevi[j - 1]->_predmet)
  295.                     swap(_kursevi[j], _kursevi[j - 1]);
  296.             }
  297.         }
  298.     }
  299.     void Ispis()
  300.     {
  301.         //ispisuje sve informacije o edukacijskom centru. prije ispisa sortirati sve kurseve
  302.         sortNiz();
  303.         cout << "Naziv centra: " << _nazivCentra << endl;
  304.         cout << "-- Kursevi --";
  305.         for (int i = 0; i < _trenutnoKurseva; i++)
  306.         {
  307.             _kursevi[i]->Ispis();
  308.         }
  309.         cout << "-- Polaganja -- " << endl;
  310.         for (int i = 0; i < _trenutnoPolaganja; i++)
  311.         {
  312.             _polaganja[i].Ispis();
  313.         }
  314.     }
  315.     void Dealociraj()
  316.     {
  317.         delete[] _nazivCentra; _nazivCentra = nullptr;
  318.         for (int i = 0; i < _trenutnoKurseva; i++)
  319.         {
  320.             _kursevi[i]->Dealociraj();
  321.             delete[] _kursevi[i]; _kursevi[i] = nullptr;
  322.         }
  323.         delete[] _polaganja; _polaganja = nullptr;
  324.     }
  325. };
  326.  
  327. void main() {
  328.  
  329.     /*
  330.     1. BROJ I TIPOVI PARAMETARA MORAJU BITI IDENTICNI ONIMA U TESTNOM CODE-U (OSIM UKOLIKO IMATE OPRAVDANU POTREBU ZA MODIFIKACIJOM). U SUPROTNOM SE RAD NEĆE BODOVATI
  331.     2. KREIRAJTE .DOC FAJL SA VAŠIM BROJEM INDEKSA ( NPR. IB130030.DOC BEZ IMENA I PREZIMENA), TE NA KRAJU ISPITA U NJEGA KOPIRAJTE RJEŠENJA VAŠIH ZADATAKA.
  332.     NE PREDAVATI .TXT ILI .CPP FAJLOVE. TAKOĐER, UKLONITE SVE DIJELOVE CODE-A KOJI NISU IMPLEMENTIRANI
  333.     3. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  334.     4. 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)
  335.     5. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  336.     */
  337.  
  338.     Datum datum1, datum2, datum3, datum4, datum5, datum6;
  339.     datum1.Unos(26, 11, 2015);
  340.     datum2.Unos(29, 5, 2016);
  341.     datum3.Unos(5, 6, 2016);
  342.     datum4.Unos(15, 8, 2016);
  343.     datum5.Unos(13, 7, 2016);
  344.     datum6.Unos(22, 9, 2016);
  345.  
  346.     Kurs matematika, hemija, biologija, engleski;
  347.     matematika.Unos(Matematika, III, datum1, datum2, "Nina Bijedic");
  348.     hemija.Unos(Hemija, III, datum2, datum3, "Murat Praso");
  349.     biologija.Unos(Biologija, IV, datum3, datum4, "Jasmin Azemovic");
  350.     engleski.Unos(Engleski, II, datum3, datum4, "Iris Memic");
  351.  
  352.     Datum rodjenje1, rodjenje2;
  353.     rodjenje1.Unos(22, 8, 1982);
  354.     rodjenje2.Unos(23, 3, 1977);
  355.     Polaznik denis, zanin, indira;
  356.     denis.Unos(rodjenje1, "Denis Music");
  357.     zanin.Unos(rodjenje2, "Zanin Vejzovic");
  358.  
  359.  
  360.     Polaganja denisMatematika, zaninHemija, denisBiologija;
  361.     denisMatematika.Unos(denis, matematika, datum5, 3);//3 predstavlja ostvareni uspjeh/ocjenu,
  362.                                                        //a uspjesno polozenim se smatra svaki kurs na kome je polaznik ostvario ocjenu veću od 1
  363.     zaninHemija.Unos(zanin, hemija, datum6, 93);
  364.  
  365.     EdukacijskiCentar mostar;
  366.     mostar.Unos("ECM - Edukacijski Center Mostar");
  367.     //jedan edukacijski centar moze nuditi vise istih kurseva (npr. Matematika), ali se oni moraju realizovati u razlictim periodima (pocetak-kraj) tj. ne smiju se preklapati
  368.     //novi kurs istog tipa (npr. Matematika) se mora realizovati nakon prethodno dodanog npr. ako prethodni kurs Matematika traje 01.03.2016 - 01.04.2016, onda se novi kurs Matematika moze dodati jedino ako pocinje nakon 01.04.2016
  369.     if (mostar.DodajKurs(matematika)) {
  370.         cout << crt << "KURS USPJESNO REGISTROVAN" << crt;
  371.         matematika.Ispis();
  372.         cout << crt;
  373.     }
  374.     //nije moguce dodati polaganje onog kursa koji nije evidentiran (registrovan, ponudjen) u tom edukacijskom centru
  375.     //kurseve je moguce najkasnije 15 dana od dana zavrsetka (kraja) posljednje dodanog kursa
  376.     //jedan polaznik moze vise puta polagati isti kurs, ali nova ocjena mora biti veca od prethodne ocjene na tom istom kursu
  377.     if (mostar.DodajPolaganje(denisMatematika)) {
  378.         cout << crt << "POLAGANJE EVIDENTIRANO" << crt;
  379.         denisMatematika.Ispis();
  380.     }
  381.     Datum OD, DO;
  382.     int brojPolaganja = 0;
  383.     OD.Unos(1, 6, 2016);
  384.     DO.Unos(1, 8, 2016);
  385.     //PolaganjaByDatumIRazred - funkcija vraca niz uspjesnih polaganja koja su realizovana u periodu OD - DO, a odnose se na bilo koji predmet u definisanom razredu (npr. II)
  386.  
  387.     Polaganja * polaganjaByDatumiRazred = mostar.PolaganjaByDatumIRazred(OD, DO, II, brojPolaganja);
  388.     cout << "U periodu od ";
  389.     OD.Ispis();
  390.     cout << " do ";
  391.     DO.Ispis();
  392.     cout << " uspjesno je polozeno " << brojPolaganja << " predmeta --->>> ";
  393.     for (size_t i = 0; i < brojPolaganja; i++)
  394.         polaganjaByDatumiRazred[i].Ispis();
  395.  
  396.     //PretragaRekurzivno - rekurzivna funkcija koja pronalazi prosjecni uspjeh koji su polaznici tokom godine (npr.2016) ostvarili na odredjenom kursu (npr. Matematika)
  397.     //cout << "Prosjecan uspjeh na kursu iz predmeta Matematika u 2016 godini je " << PretragaRekurzivno(/*potrebni parametri*/) << endl;
  398.  
  399.     //ispisuje sve informacije o edukacijskom centru. prije ispisa sortirati sve kurseve
  400.     mostar.Ispis();
  401.  
  402.     //izvrsiti potrebne dealokacije
  403.     datum1.Dealociraj(); datum2.Dealociraj(); datum3.Dealociraj(); datum4.Dealociraj(); datum5.Dealociraj(); datum6.Dealociraj();
  404.     matematika.Dealociraj(); hemija.Dealociraj(); biologija.Dealociraj(); engleski.Dealociraj();
  405.     rodjenje1.Dealociraj(); rodjenje2.Dealociraj();
  406.     mostar.Dealociraj();
  407.     OD.Dealociraj(); DO.Dealociraj();
  408.     system("pause");
  409. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement