Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <iomanip>
- using namespace std;
- int BROJ_RACUNA = 0;
- 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(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 {
- char _brojRacuna[10];
- Datum _datumKreiranja;
- Artikal * _artikli;
- int * _kolicine;//cuva informaciju o kolicini svakog artikla na racunu
- int _brojArtikala;
- void Unos(char * BrojRacuna, Datum datum)
- {
- strcpy(_brojRacuna, BrojRacuna);
- _datumKreiranja.Unos(*datum._dan, *datum._mjesec, *datum._godina);
- _brojArtikala = 0;
- _kolicine = nullptr;
- }
- void Dealociraj()
- {
- _datumKreiranja.Dealociraj();
- delete[] _artikli;
- }
- void DodajArtikal(Artikal noviArtikal, int kolicina)
- {
- for (int i = 0; i < _brojArtikala; i++)
- {
- if (strcmp(noviArtikal._naziv, _artikli[i]._naziv) == 0)
- {
- _kolicine[i] += kolicina;
- return;
- }
- }
- Artikal * temp = new Artikal[_brojArtikala + 1];
- for (int i = 0; i < _brojArtikala; i++)
- {
- temp[i].Unos(_artikli[i]._naziv, _artikli[i]._cijena);
- }
- _artikli = temp;
- _artikli[_brojArtikala].Unos(noviArtikal._naziv, noviArtikal._cijena);
- int * temp2 = new int[_brojArtikala + 1];
- for (int i = 0; i < _brojArtikala; i++)
- {
- temp2[i] = _kolicine[i];
- }
- _kolicine = temp2;
- _kolicine[_brojArtikala] = kolicina;
- _brojArtikala++;
- }
- void Ispis()
- {
- double ukupno = 0;
- cout << "Broj racuna: " << _brojRacuna << setw(10);
- _datumKreiranja.Ispis();
- cout << crt << endl;
- for (int i = 0; i < _brojArtikala; i++)
- {
- _artikli[i].Ispis();
- cout << " x" << _kolicine[i] << " = " << _artikli[i]._cijena * _kolicine[i] << endl;
- ukupno += (_artikli[i]._cijena * _kolicine[i]);
- }
- cout << "Ukupno: " << ukupno << endl << crt << endl;
- }
- Artikal * BinarnaPretraga(char * naziv)
- {
- int prvi = 0, srednji = 0, zadnji = _brojArtikala - 1;
- bool nadjen = false;
- while (nadjen == false && prvi <= zadnji)
- {
- srednji = (prvi + zadnji) / 2;
- if (strcmp(naziv, _artikli[srednji]._naziv) < 0)
- zadnji = srednji - 1;
- if (strcmp(naziv, _artikli[srednji]._naziv) == 0)
- nadjen = true;
- if (strcmp(naziv, _artikli[srednji]._naziv) > 0)
- prvi = srednji + 1;
- }
- if (nadjen == true)
- return &_artikli[srednji];
- }
- };
- //1. PronadjiNajskupljiArtikal - rekurzivna funkcija koja vraca pokazivac na artikal sa najvecom ukupnom cijenom (cijena*kolicina)
- //2. GenerisiSljedeciBrojRacuna - generise i vraca naredni broj racuna
- char * GenerisiSljedeciBrojRacuna()
- {
- BROJ_RACUNA++;
- int _brojRacuna = BROJ_RACUNA, brojCifara = 0, brojNula = 0;
- do
- {
- _brojRacuna /= 10;
- brojCifara++;
- } while (_brojRacuna != 0);
- brojNula = 10 - brojCifara;
- char * povratni = new char[10];
- strncpy(povratni, "0000000000", brojNula);
- povratni[brojNula] = '\0';
- char * temp = new char[brojCifara];
- _itoa(BROJ_RACUNA, temp, 10);
- strcat(povratni, temp);
- return povratni;
- }
- Artikal * PronadjiNajskupljiArtikal(Artikal * artikal, Racun racun, double max, int pozicija, int brojac)
- {
- if (brojac < 0)
- return &artikal[pozicija];
- if (artikal[brojac]._cijena * racun._kolicine[brojac] > max)
- {
- max = artikal[brojac]._cijena * racun._kolicine[brojac];
- pozicija = brojac;
- }
- PronadjiNajskupljiArtikal(artikal, racun, max, pozicija, brojac - 1);
- }
- 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, racun2;
- 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 -> ";
- p1->Ispis();
- racun.Ispis();
- Artikal * p2 = PronadjiNajskupljiArtikal(racun._artikli, racun, 0, 0, racun._brojArtikala);
- cout << "Rekurzivno pronadjen najskuplji artikal -> ";
- p2->Ispis();
- cout << endl;
- //dealocirati zauzetu memoriju
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement