Advertisement
Guest User

kkk

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