Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- using namespace std;
- const char * crt = "\n----------------------------------------------------\n";
- struct Datum
- {
- int * _dan, *_mjesec, *_godina;
- void Unos(int d, int m, int g)
- {
- _dan = new int(d);
- _mjesec = new int(m);
- _godina = new int(g);
- }
- void Ispis() { cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl; }
- void Dealociraj() {
- delete _dan; delete _mjesec; delete _godina;
- _dan = _mjesec = _godina = nullptr;
- }
- };
- struct Artikal
- {
- char * _naziv;
- float _cijena;
- void Unos(const char * naziv, float cijena)
- {
- int vel = strlen(naziv) + 1;
- _naziv = new char[vel];
- strcpy_s(_naziv, vel, naziv);
- _cijena = cijena;
- }
- void Dealociraj() { delete[]_naziv; _naziv = nullptr; }
- void Ispis() { cout << _naziv << " " << _cijena << " KM"; }
- };
- struct Racun
- {
- //format broja racuna: 006005491
- //osigurati automatsko generisanje broja racuna pocevsi od 000000001
- char _brojRacuna[10];
- Datum _datumKreiranja;
- Artikal * _artikli;
- int * _kolicine;//cuva informaciju o kolicini svakog artikla na racunu
- int _brojArtikala;
- //Potpisi funkcija trebaju odgovarati onima u main-u
- //1. Unos
- void Unos(const char * racun, Datum datum)
- {
- strcpy_s(_brojRacuna, 10, racun);
- _datumKreiranja.Unos(*datum._dan, *datum._mjesec, *datum._godina);
- _artikli = nullptr;
- _kolicine = nullptr;
- _brojArtikala = 0;
- }
- //2. Dealociraj
- void Dealociraj()
- {
- for (int i = 0; i < _brojArtikala; i++)
- {
- _artikli[i].Dealociraj();
- }
- delete[] _artikli; _artikli = nullptr;
- delete[] _kolicine; _kolicine = nullptr;
- }
- //3. DodajArtikal - dodaje novi artikal u listu artikala zajedno sa njegovom kolicinom.
- //Onemoguciti ponavljanje artikala na nacin da se uvecava samo kolicina ukoliko
- // korisnik vise puta pokusa dodati isti artikal.
- void DodajArtikal(Artikal artikal, int kolicina)
- {
- //provjere
- for (int i = 0; i < _brojArtikala; i++)
- {
- if (strcmp(_artikli[i]._naziv, artikal._naziv) == 0)
- {
- _kolicine[i] += kolicina;
- return;
- }
- }
- Artikal * temp = new Artikal[_brojArtikala + 1];
- int * tempKolicine = new int[_brojArtikala + 1];
- for (int i = 0; i < _brojArtikala; i++)
- {
- temp[i].Unos(_artikli[i]._naziv, _artikli[i]._cijena);
- tempKolicine[i] = _kolicine[i];
- }
- temp[_brojArtikala].Unos(artikal._naziv, artikal._cijena);
- tempKolicine[_brojArtikala] = kolicina;
- for (int i = 0; i < _brojArtikala; i++)
- {
- _artikli[i].Dealociraj();
- }
- delete[] _artikli;
- delete[] _kolicine;
- _artikli = temp;
- _kolicine = tempKolicine;
- _brojArtikala++;
- }
- // //4. Ispis - ispisuje racun u formatu prikazanom na slici (nije obavezno da bude
- // identican, ali je svakako pozeljno).Prilikom svakog ispisa, racun
- // je potrebno spasiti u tekstualni fajl sa istim nazivom kao i broj racuna.
- void Ispis()
- {
- float sumaIspisa = 0;
- float ukupno = 0;
- cout << "Racun: " << _brojRacuna << endl;
- cout << "Datum kreiranja: ";
- _datumKreiranja.Ispis();
- cout << crt;
- cout << "Broj artikala na racunu: " << _brojArtikala << endl;
- cout << "Artikli na racunu: " << endl;
- for (int i = 0; i < _brojArtikala; i++)
- {
- cout << i + 1 << ": " << _artikli[i]._naziv << " \tcijena: " << _artikli[i]._cijena << " \tkolicina: " << _kolicine[i] << " \tukupno: " << _artikli[i]._cijena * _kolicine[i] << endl;
- ukupno = _artikli[i]._cijena * _kolicine[i];
- sumaIspisa += ukupno;
- }
- cout << crt;
- cout << "Ukupan iznos: " << sumaIspisa;
- cout << crt;
- char nazivFajla[20];
- strcpy_s(nazivFajla, _brojRacuna);
- strcat_s(nazivFajla, ".txt");
- ofstream upis(nazivFajla);
- float sumaIspisa1 = 0;
- float ukupno1 = 0;
- upis << "Racun: " << _brojRacuna << endl;
- upis << "Datum kreiranja: " << *_datumKreiranja._dan << "." << *_datumKreiranja._mjesec << "." << *_datumKreiranja._godina << endl;
- upis << crt;
- upis << "Broj artikala na racunu: " << _brojArtikala << endl;
- upis << "Artikli na racunu: " << endl;
- for (int i = 0; i < _brojArtikala; i++)
- {
- upis << i + 1 << ": " << _artikli[i]._naziv << " \tcijena: " << _artikli[i]._cijena << " \tkolicina: " << _kolicine[i] << " \tukupno: " << _artikli[i]._cijena * _kolicine[i] << endl;
- ukupno1 = _artikli[i]._cijena * _kolicine[i];
- sumaIspisa1 += ukupno1;
- }
- upis << crt;
- upis << "Ukupan iznos: " << sumaIspisa1;
- upis << crt;
- if (upis.fail())
- cout << "Greska prilikom pohrane racuna. " << endl;
- else
- cout << "Racun pohranjen: " << nazivFajla << endl;
- upis.close();
- }
- // //5. BinarnaPretraga - koristeci binarnu pretragu, na osnovu naziva, pronalazi i vraca
- // pokazivac na artikal.Ukoliko trazeni artikal ne postoji funkcija vraca nullptr.
- void sortNiz()
- {
- int minI;
- for (int i = 0; i < _brojArtikala; i++)
- {
- minI = i;
- for (int j = i + 1; j < _brojArtikala; j++)
- {
- if (strcmp(_artikli[j]._naziv, _artikli[minI]._naziv) < 0)
- minI = j;
- }
- swap(_artikli[minI]._naziv, _artikli[i]._naziv);
- swap(_artikli[minI]._cijena, _artikli[i]._cijena);
- swap(_kolicine[minI], _kolicine[i]);
- }
- }
- Artikal * BinarnaPretraga(const char * naziv)
- {
- sortNiz();
- int srednji;
- int zadnji = _brojArtikala;
- for (int i = 0; i < zadnji; i++)
- {
- srednji = (i + zadnji) / 2;
- if (strcmp(_artikli[srednji]._naziv, naziv) > 0)
- {
- i = -1;
- zadnji = srednji;
- }
- else if (strcmp(_artikli[srednji]._naziv, naziv) < 0)
- {
- i = srednji;
- }
- else
- {
- return &_artikli[srednji];
- }
- }
- return nullptr;
- }
- };
- //1. PronadjiNajskupljiArtikal - rekurzivna funkcija koja vraca pokazivac na artikal sa najvecom ukupnom cijenom (cijena*kolicina)
- Artikal * PronadjiNajskupljiArtikal(int &i, int&MaxCijena, int & indeks, Racun racun)
- {
- Artikal * rezultat;
- float ukupnaCijena = 0;
- if (racun._brojArtikala == i)
- {
- if (MaxCijena == 0)
- {
- return nullptr;
- }
- else
- {
- rezultat = &racun._artikli[indeks];
- return rezultat;
- }
- }
- else
- {
- ukupnaCijena = racun._artikli[i]._cijena*racun._kolicine[i];
- if (MaxCijena < ukupnaCijena)
- {
- MaxCijena = ukupnaCijena;
- indeks = i;
- }
- }
- i++;
- return PronadjiNajskupljiArtikal(i, MaxCijena, indeks, racun);
- }
- //2. GenerisiSljedeciBrojRacuna - generise i vraca naredni broj racuna
- int BrojRacuna = 6005491;
- const char * GenerisiSljedeciBrojRacuna()
- {
- char* niz = new char[10];
- strcpy_s(niz, strlen("RN0000000") + 1, "RN0000000");
- int brojac = 0;
- int brojRacuna = BrojRacuna;
- while (brojRacuna > 0)
- {
- brojRacuna = brojRacuna / 10;
- brojac++;
- }
- _itoa_s(BrojRacuna, &niz[9 - brojac], strlen(niz) + 1, 10);
- BrojRacuna++;
- return niz;
- }
- void main()
- {
- //za eventualne nejasnoce analizirati testni program i ispise na slici
- Datum danas; danas.Unos(13, 6, 2016);
- Artikal cigarete, cokolada, sok;
- cigarete.Unos("Cigarete", 2.23);
- cokolada.Unos("Cokolada", 1.23);
- sok.Unos("Cappy", 2.10);
- Racun racun;
- racun.Unos(GenerisiSljedeciBrojRacuna(), danas);
- racun.DodajArtikal(cokolada, 5);
- racun.DodajArtikal(sok, 10);
- racun.DodajArtikal(cigarete, 2);
- racun.DodajArtikal(cigarete, 5);
- racun.Ispis();
- Artikal * p1 = racun.BinarnaPretraga("Cokolada");
- cout << "Binarnom pretragom pronadjen artikal -> ";
- if (p1 != nullptr)
- {
- p1->Ispis();
- }
- racun.Ispis();
- int i = 0, MaxCijena = 0, indeks = 0;
- Artikal * p2 = PronadjiNajskupljiArtikal(i, MaxCijena, indeks, racun);
- cout << "Rekurzivno pronadjen najskuplji artikal -> ";
- if (p2 != nullptr)
- {
- p2->Ispis();
- cout << endl;
- }
- //dealocirati zauzetu memoriju
- danas.Dealociraj();
- cigarete.Dealociraj(); cokolada.Dealociraj(); sok.Dealociraj();
- racun.Dealociraj();
- system("PAUSE");
- }
Add Comment
Please, Sign In to add comment