Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2017
499
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.60 KB | None | 0 0
  1. #include <iostream>
  2. #include <regex>
  3. #include <thread>
  4. #include <string>
  5. #include <sstream>
  6. #include <vector>
  7. #include <algorithm>
  8. #include <math.h>
  9. using namespace std;
  10. //1.    ZADATAK
  11. //a.Koristeæi primjere pojasniti operatore reinterpret_cast i static_cast.
  12. //b.Koristeæi primjere pojasniti razliku izmeðu tipova list i vector.
  13. //
  14. //
  15. //2.    ZADATAK
  16. //
  17. char *crt = "\n-------------------------------------------\n";
  18. enum eRazred { PRVI = 1, DRUGI, TRECI, CETVRTI };
  19.  
  20. template<class T1, class T2>
  21. class Kolekcija {
  22.     T1 * _elementi1;
  23.     T2 * _elementi2;
  24.     int * _trenutno;
  25. public:
  26.     Kolekcija()
  27.     {
  28.         _elementi1 = nullptr;
  29.         _elementi2 = nullptr;
  30.         _trenutno = new int(0);
  31.     }
  32.     ~Kolekcija()
  33.     {
  34.         delete[]_elementi1; _elementi1 = nullptr;
  35.         delete[]_elementi2; _elementi2 = nullptr;
  36.         delete _trenutno; _trenutno = nullptr;
  37.     }
  38.     Kolekcija(const Kolekcija &obj) {
  39.         _trenutno = new int(*obj._trenutno);
  40.         _elementi1 = new T1[*_trenutno];
  41.         _elementi2 = new T2[*_trenutno];
  42.         for (int i = 0; i < *_trenutno; i++)
  43.         {
  44.             _elementi1[i] = obj._elementi1[i];
  45.             _elementi2[i] = obj._elementi2[i];
  46.         }
  47.     }
  48.     Kolekcija & operator=(const Kolekcija & obj) {
  49.         if (this != &obj) {
  50.             delete[]_elementi1; _elementi1 = nullptr;
  51.             delete[]_elementi2; _elementi2 = nullptr;
  52.             delete _trenutno;
  53.             _trenutno = new int(*obj._trenutno);
  54.             _elementi1 = new T1[*_trenutno];
  55.             _elementi2 = new T2[*_trenutno];
  56.             for (int i = 0; i < *_trenutno; i++)
  57.             {
  58.                 _elementi1[i] = obj._elementi1[i];
  59.                 _elementi2[i] = obj._elementi2[i];
  60.             }
  61.         }
  62.         return *this;
  63.     }
  64.     void AddElement(T1 e1, T2 e2) {
  65.         T1 * temp1 = new T1[(*_trenutno) + 1];
  66.         T2 * temp2 = new T2[(*_trenutno) + 1];
  67.         for (int i = 0; i < *_trenutno; i++)
  68.         {
  69.             temp1[i] = _elementi1[i];
  70.             temp2[i] = _elementi2[i];
  71.         }
  72.         delete[]_elementi1; delete[]_elementi2;
  73.         _elementi1 = nullptr; _elementi2 = nullptr;
  74.         temp1[*_trenutno] = e1;
  75.         temp2[*_trenutno] = e2;
  76.         _elementi1 = temp1;
  77.         _elementi2 = temp2;
  78.         (*_trenutno)++;
  79.     }
  80.     void SortOpadajuciByT2() {
  81.         int lok;
  82.         cout << "Sortiranje." << endl;
  83.         for (int i = 0; i < *_trenutno - 1; i++)
  84.         {
  85.             lok = i;
  86.             for (int j = i + 1; j < *_trenutno; j++)
  87.                 if (_elementi2[j] > _elementi2[lok]) {
  88.                     swap(_elementi2[j], _elementi2[lok]);
  89.                     swap(_elementi1[j], _elementi1[lok]);
  90.                     /*temp2 = _elementi2[j];
  91.                     _elementi2[j] = _elementi2[lok];
  92.                     _elementi2[lok] = temp2;
  93.                     temp = _elementi1[j];
  94.                     _elementi1[j] = _elementi1[lok];
  95.                     _elementi1[lok] = temp;*/
  96.                 }
  97.         }
  98.     }
  99.     T1& getElement1(int lokacija) { return _elementi1[lokacija]; }
  100.     T2& getElement2(int lokacija) { return _elementi2[lokacija]; }
  101.     int getTrenutno() { return *_trenutno; }
  102.     friend ostream& operator<< (ostream &COUT, Kolekcija &obj) {
  103.         for (size_t i = 0; i < *obj._trenutno; i++)
  104.             COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  105.         return COUT;
  106.     }
  107. };
  108.  
  109. class DatumVrijeme {
  110.     int *_dan, *_mjesec, *_godina, *_sati, *_minuti;
  111. public:
  112.     DatumVrijeme(int dan = 1, int mjesec = 1, int godina = 2000, int sati = 0, int minuti = 0) {
  113.         _dan = new int(dan);
  114.         _mjesec = new int(mjesec);
  115.         _godina = new int(godina);
  116.         _sati = new int(sati);
  117.         _minuti = new int(minuti);
  118.     }
  119.     ~DatumVrijeme() {
  120.         delete _dan; _dan = nullptr;
  121.         delete _mjesec; _mjesec = nullptr;
  122.         delete _godina; _godina = nullptr;
  123.         delete _sati; _sati = nullptr;
  124.         delete _minuti; _minuti = nullptr;
  125.     }
  126.  
  127.     DatumVrijeme(const DatumVrijeme & obj) {
  128.         _dan = new int(*obj._dan);
  129.         _mjesec = new int(*obj._mjesec);
  130.         _godina = new int(*obj._godina);
  131.         _sati = new int(*obj._sati);
  132.         _minuti = new int(*obj._minuti);
  133.     }
  134.     DatumVrijeme & operator=(const DatumVrijeme & obj) {
  135.         if (this != &obj) {
  136.             delete _dan; _dan = nullptr;
  137.             delete _mjesec; _mjesec = nullptr;
  138.             delete _godina; _godina = nullptr;
  139.             delete _sati; _sati = nullptr;
  140.             delete _minuti; _minuti = nullptr;
  141.             _dan = new int(*obj._dan);
  142.             _mjesec = new int(*obj._mjesec);
  143.             _godina = new int(*obj._godina);
  144.             _sati = new int(*obj._sati);
  145.             _minuti = new int(*obj._minuti);
  146.         }
  147.         return *this;
  148.     }
  149.     string ToCharArray() {
  150.         stringstream obj;
  151.         obj << to_string(*_dan) + "." + to_string(*_mjesec) + "." + to_string(*_godina) + " " + to_string(*_sati) + ":" + to_string(*_minuti);
  152.         return obj.str();
  153.     }
  154.     friend ostream& operator<< (ostream &COUT, DatumVrijeme &obj) {
  155.         COUT << *obj._dan << "." << *obj._mjesec << "." << *obj._godina << " " << *obj._sati << ":" << *obj._minuti << endl;
  156.         return COUT;
  157.     }
  158. };
  159.  
  160. class Predmet {
  161.     char * _naziv;
  162.     int _ocjena;
  163.     string _napomena;
  164. public:
  165.     Predmet(char * naziv, int ocjena, string napomena = "") {
  166.         int vel = strlen(naziv) + 1;
  167.         _naziv = new char[vel];
  168.         strcpy_s(_naziv, vel, naziv);
  169.         _ocjena = ocjena;
  170.         _napomena = napomena;
  171.     }
  172.     Predmet(Predmet &o) {//Dodao sam k.kopije jer treba :D
  173.         int vel = strlen(o._naziv) + 1;
  174.         _naziv = new char[vel];
  175.         strcpy_s(_naziv, vel, o._naziv);
  176.         _ocjena = o._ocjena;
  177.         _napomena = o._napomena;
  178.     }
  179.     ~Predmet() {
  180.         delete[] _naziv; _naziv = nullptr;
  181.     }
  182.     friend ostream& operator<< (ostream &COUT, Predmet &obj) {
  183.         COUT << obj._naziv << " (" << obj._ocjena << ") " << obj._napomena << endl;
  184.         return COUT;
  185.     }
  186.     bool Isti(char * naziv) {
  187.         if (strcmp(_naziv, naziv) == 0)
  188.             return true;
  189.         return false;
  190.     }
  191.     char * GetNaziv() { return _naziv; }
  192.     string GetNapomena() { return _napomena; }
  193.     void DodajNapomenu(string napomena) {
  194.         _napomena += " " + napomena;
  195.     }
  196. };
  197. struct Uspjeh {
  198.     eRazred  _razred;
  199.     //datumvrijeme se odnosi na vrijeme evidentiranja predmeta tj. uspjeha
  200.     Kolekcija<Predmet*, DatumVrijeme> * _predmeti;
  201. public:
  202.     Uspjeh(eRazred razred) {
  203.         _razred = razred;
  204.         _predmeti = new Kolekcija<Predmet*, DatumVrijeme>();
  205.     }
  206.     ~Uspjeh() {
  207.         delete _predmeti; _predmeti = nullptr;
  208.     }
  209.  
  210.     Kolekcija<Predmet*, DatumVrijeme> * GetPredmeti() { return _predmeti; }
  211.     eRazred GetRazred() { return _razred; }
  212.     friend ostream& operator<< (ostream &COUT, const Uspjeh &obj) {
  213.         COUT << obj._razred << *obj._predmeti << endl;
  214.         return COUT;
  215.     }
  216. };
  217.  
  218. class Kandidat {
  219.     char * _imePrezime;
  220.     string _emailAdresa;
  221.     string _brojTelefona;
  222.     vector<Uspjeh *> _uspjeh;
  223. public:
  224.     Kandidat(char * imePrezime, string emailAdresa, string brojTelefona) {
  225.         int vel = strlen(imePrezime) + 1;
  226.         _imePrezime = new char[vel];
  227.         strcpy_s(_imePrezime, vel, imePrezime);
  228.         _emailAdresa = emailAdresa;
  229.         _brojTelefona = brojTelefona;
  230.     }
  231.     ~Kandidat() {
  232.         delete[] _imePrezime; _imePrezime = nullptr;
  233.         for (size_t i = 0; i < _uspjeh.size(); i++) {
  234.             delete _uspjeh[i];
  235.             _uspjeh[i] = nullptr;
  236.         }
  237.     }
  238.     /*
  239.     uspjeh (tokom srednjoskolskog obrazovanja) se dodaje za svaki predmet na nivou razreda.
  240.     tom prilikom onemoguciti:
  241.     - dodavanje vise od 6 predmeta za jedan razred
  242.     - dodavanje istoimenih predmeta na nivou jednog razreda,
  243.     - dodavanje vise predmeta u kratkom vremenskom periodu (na nivou jednog razreda, razmak izmedju dodavanja pojedinih predmeta
  244.     mora biti najmanje minut).
  245.     razredi (predmeti ili uspjeh) ne moraju biti dodavani sortiranim redoslijedom
  246.     (npr. prvo se moze dodati uspjeh za II razred, pa onda za I razred i sl.). Funkcija vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja
  247.     */
  248.     bool AddPredmet(eRazred razred, Predmet predmet, DatumVrijeme datum) {
  249.         for (int i = 0; i < _uspjeh.size(); i++)
  250.         {
  251.             if (_uspjeh[i]->GetRazred() == razred) {
  252.                 if (_uspjeh[i]->_predmeti->getTrenutno() == 6)
  253.                     return false;
  254.                 else
  255.                 {
  256.                     _uspjeh[i]->_predmeti->AddElement(new Predmet(predmet), datum);
  257.                     return true;
  258.                 }
  259.             }
  260.         }
  261.         Uspjeh * novi = new Uspjeh(razred);
  262.         novi->_predmeti->AddElement(new Predmet(predmet), datum);
  263.         _uspjeh.push_back(novi);
  264.         return true;
  265.     }
  266.  
  267.     friend ostream& operator<< (ostream &COUT, Kandidat &obj) {
  268.         COUT << obj._imePrezime << " " << obj._emailAdresa << " " << obj._brojTelefona << endl;
  269.         for (size_t i = 0; i < obj._uspjeh.size(); i++)
  270.             COUT << *obj._uspjeh[i] << endl;
  271.         return COUT;
  272.     }
  273.     vector<Uspjeh *> GetUspjeh() { return _uspjeh; }
  274. };
  275.  
  276. void main() {
  277.     /****************************************************************************
  278.     1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  279.     2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ÆE BITI OZNACENO KAO "RE"
  280.     3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEÈILO GUBLJENJE URAÐENOG ZADATKA
  281.     4. PROGRAMSKI CODE SE TAKOÐER NALAZI U FAJLU CODE.TXT
  282.     5. NAZIVI FUNKCIJA, TE BROJ I TIP PARAMETARA MORAJU BITI IDENTIÈNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U, OSIM U SLUÈAJU DA POSTOJI ADEKVATAN RAZLOG ZA NJIHOVU MODIFIKACIJU. OSTALE, POMOÆNE FUNKCIJE MOŽETE IMENOVATI I DODAVATI PO ŽELJI.
  283.     6. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAÈENO.
  284.     ****************************************************************************/
  285.  
  286.     DatumVrijeme temp,
  287.         datum19062017_1015(19, 6, 2017, 10, 15),
  288.         datum20062017_1115(20, 6, 2017, 11, 15),
  289.         datum30062017_1215(30, 6, 2017, 12, 15),
  290.         datum05072017_1231(5, 7, 2017, 12, 31),
  291.         datum20062017_1115_Copy(datum20062017_1115);
  292.     //funkcija ToCharArray vraca datum i vrijeme kao char *. konverziju izvrsiti koristeci stringstream objekat.
  293.     cout << datum19062017_1015.ToCharArray() << endl;//treba ispisati: 19.6.2017 10:15
  294.     temp = datum05072017_1231;
  295.     cout << temp.ToCharArray() << endl;//treba ispisati: 5.7.2017 12:31
  296.     cout << datum20062017_1115_Copy.ToCharArray() << endl;//treba ispisati: 20.6.2017 11:15
  297.  
  298.     const int kolekcijaTestSize = 10;
  299.     Kolekcija<int, int> kolekcija1;
  300.     for (size_t i = 0; i < kolekcijaTestSize; i++)
  301.         kolekcija1.AddElement(i + 1, i * i);
  302.     cout << kolekcija1 << endl;
  303.  
  304.     Kolekcija<int, int> kolekcija2 = kolekcija1;
  305.     cout << kolekcija2 << crt;
  306.     Kolekcija<int, int> kolekcija3;
  307.     kolekcija3 = kolekcija1;
  308.     kolekcija3.SortOpadajuciByT2(); //sortira sve clanove na osnovu vrijednosti drugog para (T2) od najvece prema najmanjoj vrijednosti
  309.     cout << kolekcija3 << crt;
  310.  
  311.     //napomena se moze dodati i prilikom kreiranja objekta
  312.     Predmet Matematika("Matematika", 5, "Ucesce na takmicenju"),
  313.         Fizika("Fizika", 5),
  314.         Hemija("Hemija", 2),
  315.         Engleski("Engleski", 5);
  316.     Fizika.DodajNapomenu("Pohvala za ostvareni uspjeh");
  317.     cout << Matematika << endl;
  318.  
  319.     Kandidat jasmin("Jasmin Azemovic", "jasmin@gmail.com", "033 281 172");
  320.     Kandidat adel("Adel Handzic", "adel@edu.fit.ba", "033 281 170");
  321.  
  322.     /*
  323.     uspjeh (tokom srednjoskolskog obrazovanja) se dodaje za svaki predmet na nivou razreda.
  324.     tom prilikom onemoguciti:
  325.     - dodavanje vise od 6 predmeta za jedan razred
  326.     - dodavanje istoimenih predmeta na nivou jednog razreda,
  327.     - dodavanje vise predmeta u kratkom vremenskom periodu (na nivou jednog razreda, razmak izmedju dodavanja pojedinih predmeta
  328.     mora biti najmanje minut).
  329.     razredi (predmeti ili uspjeh) ne moraju biti dodavani sortiranim redoslijedom
  330.     (npr. prvo se moze dodati uspjeh za II razred, pa onda za I razred i sl.). Funkcija vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja
  331.     */
  332.     if (jasmin.AddPredmet(DRUGI, Fizika, datum20062017_1115))
  333.         cout << "Predmet uspjesno dodan!" << crt;
  334.     if (jasmin.AddPredmet(DRUGI, Hemija, datum30062017_1215))
  335.         cout << "Predmet uspjesno dodan!" << crt;
  336.     if (jasmin.AddPredmet(PRVI, Engleski, datum19062017_1015))
  337.         cout << "Predmet uspjesno dodan!" << crt;
  338.     if (jasmin.AddPredmet(PRVI, Matematika, datum20062017_1115))
  339.         cout << "Predmet uspjesno dodan!" << crt;
  340.     //ne treba dodati Matematiku jer je vec dodana u prvom razredu
  341.     if (jasmin.AddPredmet(PRVI, Matematika, datum05072017_1231))
  342.         cout << "Predmet uspjesno dodan!" << crt;
  343.     //ne treba dodati Fiziku jer nije prosao minut od dodavanja posljednjeg predmeta
  344.     if (jasmin.AddPredmet(PRVI, Fizika, datum05072017_1231))
  345.         cout << "Predmet uspjesno dodan!" << crt;
  346.     ///*pretpostavka je da na nivou jednog razreda kandidati imaju 6 predmeta. upravo zbog toga, nakon evidentiranja 6
  347.     //predmeta na nivou jednog razreda kandidatu se salje mail sa porukom: "evidentirali ste uspjeh za X razred".
  348.     //ukoliko je prosjek na nivou tog razreda veci od 4.5
  349.     //kandidatu se salje SMS sa porukom: "svaka cast za uspjeh 4.X". slanje poruka i emailova implemenitrati koristeci  zasebne thread-ove. */
  350.  
  351.     ////vraca broj ponavljanja odredjene rijeci u napomenama
  352.     //cout << "Rijec takmicenje se pojavljuje " << jasmin.BrojPonavljanjaRijeci("takmicenju") << " puta." << endl;
  353.  
  354.     ////vraca niz predmeta koji su evidentiranih u periodu izmedju vrijednosti proslijedjenih parametara
  355.     //vector<Predmet> jasminUspjeh = jasmin(DatumVrijeme(18, 06, 2017, 10, 15), DatumVrijeme(21, 06, 2017, 10, 10));
  356.     //for each (Predmet u in jasminUspjeh)
  357.     //{
  358.     //  cout << u << endl;
  359.     //}
  360.  
  361.     //Uspjeh * u = jasmin[PRVI];//vraca uspjeh kandidata ostvaren u prvom razredu
  362.  
  363.  
  364.     system("pause");
  365. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement