Advertisement
wiuu23

PR2-Ispit-Artikli

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