Advertisement
limun11

ARTIKLI - konacna

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