limun11

Artikli-END

Aug 29th, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.68 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. const char * crt = "\n----------------------------------------------------\n";
  6.  
  7. struct Datum
  8. {
  9.     int * _dan, *_mjesec, *_godina;
  10.     void Unos(int d, int m, int g)
  11.     {
  12.         _dan = new int(d);
  13.         _mjesec = new int(m);
  14.         _godina = new int(g);
  15.     }
  16.     void Ispis() { cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl; }
  17.     void Dealociraj() {
  18.         delete _dan; delete _mjesec; delete _godina;
  19.         _dan = _mjesec = _godina = nullptr;
  20.     }
  21. };
  22. struct Artikal
  23. {
  24.     char * _naziv;
  25.     float _cijena;
  26.  
  27.     void Unos(const char * naziv, float cijena)
  28.     {
  29.         int vel = strlen(naziv) + 1;
  30.         _naziv = new char[vel];
  31.         strcpy_s(_naziv, vel, naziv);
  32.         _cijena = cijena;
  33.     }
  34.     void Dealociraj() { delete[]_naziv; _naziv = nullptr; }
  35.     void Ispis() { cout << _naziv << " " << _cijena << " KM"; }
  36. };
  37. struct Racun
  38. {
  39.     //format broja racuna: 006005491
  40.     //osigurati automatsko generisanje broja racuna pocevsi od 000000001
  41.     char _brojRacuna[10];
  42.     Datum _datumKreiranja;
  43.     Artikal * _artikli;
  44.     int * _kolicine;//cuva informaciju o kolicini svakog artikla na racunu
  45.     int _brojArtikala;
  46.     //Potpisi funkcija trebaju odgovarati onima u main-u
  47.     //1. Unos
  48.     void Unos(const char * racun, Datum datum)
  49.     {
  50.         strcpy_s(_brojRacuna, 10, racun);
  51.         _datumKreiranja.Unos(*datum._dan, *datum._mjesec, *datum._godina);
  52.         _artikli = nullptr;
  53.         _kolicine = nullptr;
  54.         _brojArtikala = 0;
  55.     }
  56.     //2. Dealociraj
  57.     void Dealociraj()
  58.     {
  59.         for (int i = 0; i < _brojArtikala; i++)
  60.         {
  61.             _artikli[i].Dealociraj();
  62.         }
  63.         delete[] _artikli; _artikli = nullptr;
  64.         delete[] _kolicine; _kolicine = nullptr;
  65.     }
  66.     //3. DodajArtikal - dodaje novi artikal u listu artikala zajedno sa njegovom kolicinom.
  67.     //Onemoguciti ponavljanje artikala na nacin da se uvecava samo kolicina ukoliko
  68.     //  korisnik vise puta pokusa dodati isti artikal.
  69.     void DodajArtikal(Artikal artikal, int kolicina)
  70.     {
  71.         //provjere
  72.         for (int i = 0; i < _brojArtikala; i++)
  73.         {
  74.             if (strcmp(_artikli[i]._naziv, artikal._naziv) == 0)
  75.             {
  76.                 _kolicine[i] += kolicina;
  77.                 return;
  78.             }
  79.         }
  80.  
  81.         Artikal * temp = new Artikal[_brojArtikala + 1];
  82.         int * tempKolicine = new int[_brojArtikala + 1];
  83.         for (int i = 0; i < _brojArtikala; i++)
  84.         {
  85.             temp[i].Unos(_artikli[i]._naziv, _artikli[i]._cijena);
  86.             tempKolicine[i] = _kolicine[i];
  87.         }
  88.         temp[_brojArtikala].Unos(artikal._naziv, artikal._cijena);
  89.         tempKolicine[_brojArtikala] = kolicina;
  90.         for (int i = 0; i < _brojArtikala; i++)
  91.         {
  92.             _artikli[i].Dealociraj();
  93.         }
  94.         delete[]  _artikli;
  95.         delete[] _kolicine;
  96.         _artikli = temp;
  97.         _kolicine = tempKolicine;
  98.         _brojArtikala++;
  99.     }
  100.     //  //4. Ispis - ispisuje racun u formatu prikazanom na slici (nije obavezno da bude
  101.     //  identican, ali je svakako pozeljno).Prilikom svakog ispisa, racun
  102.     //  je potrebno spasiti u tekstualni fajl sa istim nazivom kao i broj racuna.
  103.     void Ispis()
  104.     {
  105.         float sumaIspisa = 0;
  106.         float ukupno = 0;
  107.         cout << "Racun: " << _brojRacuna << endl;
  108.         cout << "Datum kreiranja: ";
  109.         _datumKreiranja.Ispis();
  110.         cout << crt;
  111.         cout << "Broj artikala na racunu: " << _brojArtikala << endl;
  112.         cout << "Artikli na racunu: " << endl;
  113.         for (int i = 0; i < _brojArtikala; i++)
  114.         {
  115.             cout << i + 1 << ": " << _artikli[i]._naziv << " \tcijena: " << _artikli[i]._cijena << " \tkolicina: " << _kolicine[i] << " \tukupno: " << _artikli[i]._cijena * _kolicine[i] << endl;
  116.             ukupno = _artikli[i]._cijena * _kolicine[i];
  117.             sumaIspisa += ukupno;
  118.         }
  119.         cout << crt;
  120.         cout << "Ukupan iznos: " << sumaIspisa;
  121.         cout << crt;
  122.  
  123.         char nazivFajla[20];
  124.         strcpy_s(nazivFajla, _brojRacuna);
  125.         strcat_s(nazivFajla, ".txt");
  126.         ofstream upis(nazivFajla);
  127.         float sumaIspisa1 = 0;
  128.         float ukupno1 = 0;
  129.         upis << "Racun: " << _brojRacuna << endl;
  130.         upis << "Datum kreiranja: " << *_datumKreiranja._dan << "." << *_datumKreiranja._mjesec << "." << *_datumKreiranja._godina << endl;
  131.         upis << crt;
  132.         upis << "Broj artikala na racunu: " << _brojArtikala << endl;
  133.         upis << "Artikli na racunu: " << endl;
  134.         for (int i = 0; i < _brojArtikala; i++)
  135.         {
  136.             upis << i + 1 << ": " << _artikli[i]._naziv << " \tcijena: " << _artikli[i]._cijena << " \tkolicina: " << _kolicine[i] << " \tukupno: " << _artikli[i]._cijena * _kolicine[i] << endl;
  137.             ukupno1 = _artikli[i]._cijena * _kolicine[i];
  138.             sumaIspisa1 += ukupno1;
  139.         }
  140.         upis << crt;
  141.         upis << "Ukupan iznos: " << sumaIspisa1;
  142.         upis << crt;
  143.  
  144.         if (upis.fail())
  145.             cout << "Greska prilikom pohrane racuna. " << endl;
  146.         else
  147.             cout << "Racun pohranjen: " << nazivFajla << endl;
  148.  
  149.  
  150.         upis.close();
  151.  
  152.     }
  153.     //  //5. BinarnaPretraga - koristeci binarnu pretragu, na osnovu naziva, pronalazi i vraca
  154.     //  pokazivac na artikal.Ukoliko trazeni artikal ne postoji funkcija vraca nullptr.
  155.     void sortNiz()
  156.     {
  157.         int minI;
  158.         for (int i = 0; i < _brojArtikala; i++)
  159.         {
  160.             minI = i;
  161.             for (int j = i + 1; j < _brojArtikala; j++)
  162.             {
  163.                 if (strcmp(_artikli[j]._naziv, _artikli[minI]._naziv) < 0)
  164.                     minI = j;
  165.             }
  166.             swap(_artikli[minI]._naziv, _artikli[i]._naziv);
  167.             swap(_artikli[minI]._cijena, _artikli[i]._cijena);
  168.             swap(_kolicine[minI], _kolicine[i]);
  169.         }
  170.     }
  171.  
  172.     Artikal * BinarnaPretraga(const char * naziv)
  173.     {
  174.         sortNiz();
  175.         int srednji;
  176.         int zadnji = _brojArtikala;
  177.         for (int i = 0; i < zadnji; i++)
  178.         {
  179.             srednji = (i + zadnji) / 2;
  180.  
  181.             if (strcmp(_artikli[srednji]._naziv, naziv) > 0)
  182.             {
  183.                 i = -1;
  184.                 zadnji = srednji;
  185.             }
  186.             else if (strcmp(_artikli[srednji]._naziv, naziv) < 0)
  187.             {
  188.                 i = srednji;
  189.             }
  190.             else
  191.             {
  192.                 return &_artikli[srednji];
  193.             }
  194.         }
  195.         return nullptr;
  196.     }
  197. };
  198. //1. PronadjiNajskupljiArtikal - rekurzivna funkcija koja vraca pokazivac na artikal sa najvecom ukupnom cijenom (cijena*kolicina)
  199. Artikal * PronadjiNajskupljiArtikal(int &i, int&MaxCijena, int & indeks, Racun racun)
  200. {
  201.     Artikal * rezultat;
  202.     float ukupnaCijena = 0;
  203.     if (racun._brojArtikala == i)
  204.     {
  205.         if (MaxCijena == 0)
  206.         {
  207.             return nullptr;
  208.         }
  209.         else
  210.         {
  211.             rezultat = &racun._artikli[indeks];
  212.             return rezultat;
  213.         }
  214.     }
  215.     else
  216.     {
  217.         ukupnaCijena = racun._artikli[i]._cijena*racun._kolicine[i];
  218.         if (MaxCijena < ukupnaCijena)
  219.         {
  220.             MaxCijena = ukupnaCijena;
  221.             indeks = i;
  222.         }
  223.     }
  224.     i++;
  225.     return PronadjiNajskupljiArtikal(i, MaxCijena, indeks, racun);
  226. }
  227. //2. GenerisiSljedeciBrojRacuna - generise i vraca naredni broj racuna
  228. int BrojRacuna = 6005491;
  229. const char * GenerisiSljedeciBrojRacuna()
  230. {
  231.     char* niz = new char[10];
  232.  
  233.     strcpy_s(niz, strlen("RN0000000") + 1, "RN0000000");
  234.     int brojac = 0;
  235.  
  236.     int brojRacuna = BrojRacuna;
  237.     while (brojRacuna > 0)
  238.     {
  239.         brojRacuna = brojRacuna / 10;
  240.         brojac++;
  241.     }
  242.     _itoa_s(BrojRacuna, &niz[9 - brojac], strlen(niz) + 1, 10);
  243.  
  244.     BrojRacuna++;
  245.     return niz;
  246. }
  247.  
  248. void main()
  249. {
  250.     //za eventualne nejasnoce analizirati testni program i ispise na slici
  251.     Datum danas; danas.Unos(13, 6, 2016);
  252.     Artikal cigarete, cokolada, sok;
  253.     cigarete.Unos("Cigarete", 2.23);
  254.     cokolada.Unos("Cokolada", 1.23);
  255.     sok.Unos("Cappy", 2.10);
  256.     Racun racun;
  257.     racun.Unos(GenerisiSljedeciBrojRacuna(), danas);
  258.  
  259.     racun.DodajArtikal(cokolada, 5);
  260.     racun.DodajArtikal(sok, 10);
  261.     racun.DodajArtikal(cigarete, 2);
  262.     racun.DodajArtikal(cigarete, 5);
  263.  
  264.     racun.Ispis();
  265.  
  266.     Artikal * p1 = racun.BinarnaPretraga("Cokolada");
  267.     cout << "Binarnom pretragom pronadjen artikal -> ";
  268.     if (p1 != nullptr)
  269.     {
  270.         p1->Ispis();
  271.     }
  272.     racun.Ispis();
  273.  
  274.     int i = 0, MaxCijena = 0, indeks = 0;
  275.     Artikal * p2 = PronadjiNajskupljiArtikal(i, MaxCijena, indeks, racun);
  276.     cout << "Rekurzivno pronadjen najskuplji artikal -> ";
  277.     if (p2 != nullptr)
  278.     {
  279.         p2->Ispis();
  280.         cout << endl;
  281.     }
  282.     //dealocirati zauzetu memoriju
  283.     danas.Dealociraj();
  284.     cigarete.Dealociraj(); cokolada.Dealociraj(); sok.Dealociraj();
  285.     racun.Dealociraj();
  286.  
  287.     system("PAUSE");
  288. }
Add Comment
Please, Sign In to add comment