limun11

GOTOVO :: Artikli

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