Advertisement
wiuu23

PR2-Ispit-Artikli(binarnaPretraga,bubbleSort,Unos)...

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