Advertisement
Guest User

Untitled

a guest
Aug 25th, 2016
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.86 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <iomanip>
  4. using namespace std;
  5.  
  6. int BROJ_RACUNA = 0;
  7.  
  8. char * crt = "\n----------------------------------------------------\n";
  9. struct Datum {
  10.     int * _dan, *_mjesec, *_godina;
  11.     void Unos(int d, int m, int g) {
  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.     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. struct Racun {
  35.    
  36.     char _brojRacuna[10];
  37.     Datum _datumKreiranja;
  38.     Artikal * _artikli;
  39.     int * _kolicine;//cuva informaciju o kolicini svakog artikla na racunu
  40.     int _brojArtikala;
  41.     void Unos(char * BrojRacuna, Datum datum)
  42.     {
  43.         strcpy(_brojRacuna, BrojRacuna);
  44.         _datumKreiranja.Unos(*datum._dan, *datum._mjesec, *datum._godina);
  45.         _brojArtikala = 0;
  46.         _kolicine = nullptr;
  47.     }
  48.    
  49.     void Dealociraj()
  50.     {
  51.         _datumKreiranja.Dealociraj();
  52.         delete[] _artikli;
  53.     }
  54.     void DodajArtikal(Artikal noviArtikal, int kolicina)
  55.     {
  56.         for (int i = 0; i < _brojArtikala; i++)
  57.         {
  58.             if (strcmp(noviArtikal._naziv, _artikli[i]._naziv) == 0)
  59.             {
  60.                 _kolicine[i] += kolicina;
  61.                 return;
  62.             }
  63.         }
  64.  
  65.  
  66.         Artikal * temp = new Artikal[_brojArtikala + 1];
  67.             for (int i = 0; i < _brojArtikala; i++)
  68.             {
  69.                 temp[i].Unos(_artikli[i]._naziv, _artikli[i]._cijena);             
  70.             }
  71.  
  72.             _artikli = temp;
  73.  
  74.             _artikli[_brojArtikala].Unos(noviArtikal._naziv, noviArtikal._cijena);
  75.  
  76.  
  77.  
  78.             int * temp2 = new int[_brojArtikala + 1];
  79.             for (int i = 0; i < _brojArtikala; i++)
  80.             {
  81.                 temp2[i] = _kolicine[i];
  82.             }
  83.  
  84.             _kolicine = temp2;
  85.  
  86.             _kolicine[_brojArtikala] = kolicina;
  87.  
  88.  
  89.             _brojArtikala++;
  90.  
  91.     }
  92.     void Ispis()
  93.     {
  94.         double ukupno = 0;
  95.         cout << "Broj racuna: " << _brojRacuna << setw(10);
  96.         _datumKreiranja.Ispis();
  97.         cout << crt << endl;
  98.         for (int i = 0; i < _brojArtikala; i++)
  99.         {
  100.            
  101.             _artikli[i].Ispis();
  102.             cout << "  x" << _kolicine[i] << " = " << _artikli[i]._cijena * _kolicine[i] << endl;
  103.             ukupno += (_artikli[i]._cijena * _kolicine[i]);
  104.         }
  105.  
  106.         cout << "Ukupno: " << ukupno << endl << crt << endl;
  107.     }
  108.     Artikal * BinarnaPretraga(char * naziv)
  109.     {
  110.         int prvi = 0, srednji = 0, zadnji = _brojArtikala - 1;
  111.  
  112.         bool nadjen = false;
  113.         while (nadjen == false && prvi <= zadnji)
  114.         {
  115.             srednji = (prvi + zadnji) / 2;
  116.             if (strcmp(naziv, _artikli[srednji]._naziv) < 0)
  117.                 zadnji = srednji - 1;
  118.             if (strcmp(naziv, _artikli[srednji]._naziv) == 0)
  119.                 nadjen = true;
  120.             if (strcmp(naziv, _artikli[srednji]._naziv) > 0)
  121.                 prvi = srednji + 1;
  122.         }
  123.    
  124.         if (nadjen == true)
  125.             return &_artikli[srednji];
  126.            
  127.     }
  128. };
  129. //1. PronadjiNajskupljiArtikal - rekurzivna funkcija koja vraca pokazivac na artikal sa najvecom ukupnom cijenom (cijena*kolicina)
  130. //2. GenerisiSljedeciBrojRacuna - generise i vraca naredni broj racuna
  131.  
  132. char * GenerisiSljedeciBrojRacuna()
  133. {
  134.     BROJ_RACUNA++;
  135.     int _brojRacuna = BROJ_RACUNA, brojCifara = 0, brojNula = 0;
  136.     do
  137.     {
  138.         _brojRacuna /= 10;
  139.         brojCifara++;
  140.     } while (_brojRacuna != 0);
  141.  
  142.     brojNula = 10 - brojCifara;
  143.  
  144.     char * povratni = new char[10];
  145.     strncpy(povratni, "0000000000", brojNula);
  146.     povratni[brojNula] = '\0';
  147.  
  148.     char * temp = new char[brojCifara];
  149.  
  150.     _itoa(BROJ_RACUNA, temp, 10);
  151.     strcat(povratni, temp);
  152.  
  153.     return povratni;
  154. }
  155. Artikal * PronadjiNajskupljiArtikal(Artikal * artikal, Racun racun, double max, int pozicija, int brojac)
  156. {
  157.     if (brojac < 0)
  158.         return &artikal[pozicija];
  159.  
  160.     if (artikal[brojac]._cijena * racun._kolicine[brojac] > max)
  161.     {
  162.         max = artikal[brojac]._cijena * racun._kolicine[brojac];
  163.         pozicija = brojac;
  164.     }
  165.  
  166.     PronadjiNajskupljiArtikal(artikal, racun, max, pozicija, brojac - 1);
  167.  
  168. }
  169.  
  170. void main() {
  171.     //za eventualne nejasnoce analizirati testni program i ispise na slici
  172.     Datum danas; danas.Unos(13, 6, 2016);
  173.     Artikal cigarete, cokolada, sok;
  174.     cigarete.Unos("Cigarete", 2.23);
  175.     cokolada.Unos("Cokolada", 1.23);
  176.     sok.Unos("Cappy", 2.10);
  177.     Racun racun, racun2;
  178.     racun.Unos(GenerisiSljedeciBrojRacuna(), danas);
  179.     racun.DodajArtikal(cokolada, 5);
  180.     racun.DodajArtikal(sok, 10);
  181.     racun.DodajArtikal(cigarete, 2);
  182.     racun.DodajArtikal(cigarete, 5);  
  183.     racun.Ispis();
  184.  
  185.     Artikal * p1 = racun.BinarnaPretraga("Cokolada");
  186.     cout << "Binarnom pretragom pronadjen artikal -> ";
  187.     p1->Ispis();
  188.     racun.Ispis();  
  189.     Artikal * p2 = PronadjiNajskupljiArtikal(racun._artikli, racun, 0, 0, racun._brojArtikala);
  190.     cout << "Rekurzivno pronadjen najskuplji artikal -> ";
  191.     p2->Ispis();
  192.     cout << endl;
  193.     //dealocirati zauzetu memoriju
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement