Advertisement
EnsarMeskovic

[PRII] Racun/Artikli v1

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