Advertisement
limun11

Artikli

Jun 24th, 2018
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.36 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <fstream>
  4. using namespace std;
  5.  
  6. const char * crt = "\n----------------------------------------------------\n";
  7. struct Datum {
  8.     int * _dan, *_mjesec, *_godina;
  9.  
  10.     void Unos(int d, int m, int g) {
  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(const 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.     //Potpisi funkcija trebaju odgovarati onima u main-u
  42.     //1. Unos
  43.     void Unos(const char * brojRacuna, Datum datum)
  44.     {
  45.         strcpy_s(_brojRacuna, 10, brojRacuna);
  46.         _datumKreiranja.Unos(*datum._dan, *datum._mjesec, *datum._godina);
  47.         _artikli = nullptr;
  48.         _kolicine = nullptr;
  49.         _brojArtikala = 0;
  50.     }
  51.     //2. Dealociraj
  52.     void Dealociraj()
  53.     {
  54.         _datumKreiranja.Dealociraj();
  55.         for (int i = 0; i < _brojArtikala; i++)
  56.         {
  57.             _artikli[i].Dealociraj();
  58.         }
  59.         delete[] _artikli; _artikli = nullptr;
  60.         delete[] _kolicine; _kolicine = nullptr;
  61.     }
  62.     //3. DodajArtikal - dodaje novi artikal u listu artikala zajedno sa njegovom kolicinom.
  63.     //Onemoguciti ponavljanje artikala na nacin da se uvecava samo kolicina ukoliko
  64.     //korisnik vise puta pokusa dodati isti artikal.
  65.     void DodajArtikal(Artikal & artikal, int kolicina)
  66.     {
  67.         for (int i = 0; i < _brojArtikala; i++)
  68.         {
  69.             if (strcmp(_artikli[i]._naziv, artikal._naziv) == 0)
  70.             {
  71.                 _kolicine[i] += kolicina;
  72.                 cout << "Isti aritkal: " << _brojArtikala << " vec postoji. Uvecat cu mu prethodnu kolicinu: " << _kolicine[i] << endl;
  73.                 return;
  74.             }
  75.         }
  76.         Artikal * temp = new Artikal[_brojArtikala + 1];
  77.         int * tempKol = new int[_brojArtikala + 1];
  78.         for (int i = 0; i < _brojArtikala; i++)
  79.         {
  80.             temp[i].Unos(_artikli[i]._naziv, _artikli[i]._cijena);
  81.             tempKol[i] = _kolicine[i];
  82.         }
  83.         temp[_brojArtikala].Unos(artikal._naziv, artikal._cijena);
  84.         tempKol[_brojArtikala] = kolicina;
  85.         for (int i = 0; i < _brojArtikala; i++)
  86.         {
  87.             _artikli[i].Dealociraj();
  88.         }
  89.         delete[] _artikli;
  90.         delete[] _kolicine;
  91.  
  92.         _artikli = temp;
  93.         _kolicine = tempKol;
  94.         _brojArtikala++;
  95.         cout << "Artikal br. " << _brojArtikala << " dodan." << endl;
  96.         return;
  97.     }
  98.     //  //4. Ispis - ispisuje racun u formatu prikazanom na slici (nije obavezno da bude
  99.     //  identican, ali je svakako pozeljno).Prilikom svakog ispisa, racun
  100.     //  je potrebno spasiti u tekstualni fajl sa istim nazivom kao i broj racuna.
  101.     void Ispis()
  102.     {
  103.         float sumaIspisa = 0;
  104.         float ukupno = 0;
  105.         cout << "Racun: " << _brojRacuna << endl;
  106.         cout << "Datum kreiranja: ";
  107.         _datumKreiranja.Ispis();
  108.         cout << crt;
  109.         cout << "Broj artikala na racunu: " << _brojArtikala << endl;
  110.         cout << "Artikli na racunu: " << endl;
  111.         for (int i = 0; i < _brojArtikala; i++)
  112.         {
  113.             cout << i + 1 << ": " << _artikli[i]._naziv << " \tcijena: " << _artikli[i]._cijena << " \tkolicina: " << _kolicine[i] << " \tukupno: " << _artikli[i]._cijena * _kolicine[i] << endl;
  114.             ukupno = _artikli[i]._cijena * _kolicine[i];
  115.             sumaIspisa += ukupno;
  116.         }
  117.         cout << crt;
  118.         cout << "Ukupan iznos: " << sumaIspisa;
  119.         cout << crt;
  120.  
  121.        
  122.         char nazivFajla[20];
  123.         strcpy_s(nazivFajla, _brojRacuna);
  124.         strcat_s(nazivFajla, ".txt");
  125.         ofstream upis(nazivFajla);
  126.         float sumaIspisa1 = 0;
  127.         float ukupno1 = 0;
  128.         upis << "Racun: " << _brojRacuna << endl;
  129.         upis << "Datum kreiranja: " << *_datumKreiranja._dan << "." << *_datumKreiranja._mjesec << "." << *_datumKreiranja._godina << endl;
  130.         upis << crt;
  131.         upis << "Broj artikala na racunu: " << _brojArtikala << endl;
  132.         upis << "Artikli na racunu: " << endl;
  133.         for (int i = 0; i < _brojArtikala; i++)
  134.         {
  135.             upis << i + 1 << ": " << _artikli[i]._naziv << " \tcijena: " << _artikli[i]._cijena << " \tkolicina: " << _kolicine[i] << " \tukupno: " << _artikli[i]._cijena * _kolicine[i] << endl;
  136.             ukupno1 = _artikli[i]._cijena * _kolicine[i];
  137.             sumaIspisa1 += ukupno1;
  138.         }
  139.         upis << crt;
  140.         upis << "Ukupan iznos: " << sumaIspisa1;
  141.         upis << crt;
  142.  
  143.         if (upis.fail())
  144.             cout << "Greska prilikom upisa u fajl: " << nazivFajla << endl;
  145.         else
  146.             cout << "Uspjeno upisano u fajl: " << nazivFajla << endl;
  147.     }
  148.     //  //5. BinarnaPretraga - koristeci binarnu pretragu, na osnovu naziva, pronalazi i vraca
  149.     //  pokazivac na artikal.Ukoliko trazeni artikal ne postoji funkcija vraca nullptr.
  150.     void sortNiz()
  151.     {
  152.         int minI;
  153.         for (int i = 0; i < _brojArtikala; i++)
  154.         {
  155.             minI = i;
  156.             for (int j = i + 1; j < _brojArtikala; j++)
  157.             {
  158.                 if (strcmp(_artikli[j]._naziv, _artikli[minI]._naziv) < 0)
  159.                     minI = j;
  160.             }
  161.             swap(_artikli[minI]._naziv, _artikli[i]._naziv);
  162.             swap(_artikli[minI]._cijena, _artikli[i]._cijena);
  163.         }
  164.     }
  165.  
  166.     Artikal * BinarnaPretraga(const char * naziv)
  167.     {
  168.         sortNiz();
  169.         int srednji;
  170.         int zadnji = _brojArtikala;
  171.         for (int i = 0; i < zadnji; i++)
  172.         {
  173.             srednji = (i + zadnji) / 2;
  174.  
  175.             if (strcmp(_artikli[srednji]._naziv, naziv) > 0)
  176.             {
  177.                 i = -1;
  178.                 zadnji = srednji;
  179.             }
  180.             else if (strcmp(_artikli[srednji]._naziv, naziv) < 0)
  181.             {
  182.                 i = srednji;
  183.             }
  184.             else
  185.             {
  186.                 return &_artikli[srednji];
  187.             }
  188.         }
  189.         return nullptr;
  190.     }
  191. };
  192. //1. PronadjiNajskupljiArtikal - rekurzivna funkcija koja vraca pokazivac na artikal sa najvecom ukupnom cijenom (cijena*kolicina)
  193. //2. GenerisiSljedeciBrojRacuna - generise i vraca naredni broj racuna
  194. //format broja racuna: 006005491
  195. //osigurati automatsko generisanje broja racuna pocevsi od 000000001
  196. int BrojRacuna = 6005491;
  197. const char * GenerisiSljedeciBrojRacuna()
  198. {
  199.     char* niz = new char[10];
  200.  
  201.     strcpy_s(niz, strlen("RN0000000") + 1, "RN0000000");
  202.     int brojac = 0;
  203.  
  204.     int brojRacuna = BrojRacuna;
  205.     while (brojRacuna>0)
  206.     {
  207.         brojRacuna = brojRacuna / 10;
  208.         brojac++;
  209.     }
  210.     _itoa_s(BrojRacuna, &niz[9 - brojac], strlen(niz) + 1, 10);
  211.  
  212.     BrojRacuna++;
  213.     return niz;
  214. }
  215. Artikal * PronadjiNajskupljiArtikal(/*potrebni parametri*/)
  216. {
  217.     Artikal * novi = nullptr;
  218.     return novi;
  219. }
  220.  
  221. void main() {
  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.  
  229.     Racun racun;
  230.     racun.Unos(GenerisiSljedeciBrojRacuna(), danas);
  231.     racun.DodajArtikal(cokolada, 5);
  232.     racun.DodajArtikal(sok, 10);
  233.     racun.DodajArtikal(cigarete, 2);
  234.     racun.DodajArtikal(cigarete, 5);
  235.     racun.Ispis();
  236.     Artikal * p1 = racun.BinarnaPretraga("Cokolada");
  237.     cout << "Binarnom pretragom pronadjen artikal -> ";
  238.     p1->Ispis();
  239.     racun.Ispis();
  240.  
  241.     cout << endl;
  242.  
  243.     Artikal * p2 = PronadjiNajskupljiArtikal(/*potrebni parametri*/);
  244.     cout << "Rekurzivno pronadjen najskuplji artikal -> ";
  245.     //p2->Ispis();
  246.  
  247.     cout << endl;
  248.     //dealocirati zauzetu memoriju
  249.     p1->Dealociraj();
  250.     racun.Dealociraj();
  251.     sok.Dealociraj();  cokolada.Dealociraj(); cigarete.Dealociraj();
  252.     danas.Dealociraj();
  253.    
  254.     system("PAUSE");
  255. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement