Advertisement
limun11

Artikli ispitni

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