Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- using namespace std;
- int brojRacuna = 1;
- char * crt = "----------------------------------------------------\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;
- double _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" << endl; }
- };
- 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
- //2. Dealociraj
- //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.
- //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.
- //5. BinarnaPretraga - koristeci binarnu pretragu, na osnovu naziva, pronalazi i vraca
- //pokazivac na artikal.Ukoliko trazeni artikal ne postoji funkcija vraca nullptr.
- void Unos(char * brojRacuna, Datum datumKreiranja)
- {
- int vel = strlen(brojRacuna) + 1;
- strcpy_s(_brojRacuna, vel, brojRacuna);
- _datumKreiranja.Unos(*datumKreiranja._dan, *datumKreiranja._mjesec, *datumKreiranja._godina);
- _artikli = nullptr;
- _kolicine = nullptr;
- _brojArtikala = 0;
- }
- void Dealociraj()
- {
- for (int i = 0; i < _brojArtikala; i++)
- _artikli[i].Dealociraj();
- delete[] _artikli; _artikli = nullptr;
- delete[] _kolicine; _kolicine = nullptr;
- }
- void DodajArtikal(Artikal artikal, int kolicna)
- {
- for (int i = 0; i < _brojArtikala; i++)
- {
- if (strcmp(artikal._naziv, _artikli[i]._naziv) == 0)
- {
- cout << "Artikal vec postoji na listi." << endl;
- return;
- }
- }
- Artikal * tempArtikli = new Artikal[_brojArtikala + 1];
- int * tempKolicina = new int[_brojArtikala + 1];
- for (int i = 0; i < _brojArtikala; i++)
- {
- tempArtikli[i].Unos(_artikli[i]._naziv, _artikli[i]._cijena);
- _artikli[i].Dealociraj();
- tempKolicina[i] = _kolicine[i];
- }
- delete[] _artikli; _artikli = nullptr;
- delete[] _kolicine; _kolicine = nullptr;
- _artikli = tempArtikli;
- _artikli[_brojArtikala].Unos(artikal._naziv, artikal._cijena);
- _kolicine = tempKolicina;
- _kolicine[_brojArtikala++] = kolicna;
- }
- void Ispis()
- {
- fstream fout;
- cout << "Broj racuna: " << _brojRacuna << endl;
- cout << "Datum kreiranja: "; _datumKreiranja.Ispis();
- cout << crt;
- for (int i = 0; i < _brojArtikala; i++)
- {
- _artikli[i].Ispis();
- cout << "Kolicina: " << _kolicine[i] << endl;
- char naziv[15];
- strcpy_s(naziv, 10, _brojRacuna);
- strcat_s(naziv, 15, ".txt");
- fout.open(naziv, ios::app);
- if (fout.is_open())
- {
- fout << "Broj racuna: " << _brojRacuna << endl;
- fout << "Datum kreiranja: " << *_datumKreiranja._dan << "/" << *_datumKreiranja._mjesec << "/" << *_datumKreiranja._godina << endl;
- fout << "Kolicina: " << _kolicine[i] << endl;
- fout << crt;
- fout << _artikli[i]._naziv << " " << _artikli[i]._cijena << " KM" << endl;
- fout << crt;
- }
- }
- fout.close();
- cout << crt;
- }
- Artikal * BinarnaPretraga(char * naziv)
- {
- Artikal * temp = new Artikal[_brojArtikala + 1];
- temp[0].Unos("0", 0);
- for (int i = 1; i <= _brojArtikala; i++)
- temp[i].Unos(_artikli[i - 1]._naziv, _artikli[i]._cijena);
- int N = _brojArtikala;
- int prekidac = 0;
- do
- {
- prekidac = 1;
- for (int i = 0; i < N; i++)
- {
- if (strcmp(temp[i]._naziv, temp[i + 1]._naziv) > 0)
- {
- Artikal spremi;
- spremi.Unos(temp[i]._naziv, temp[i]._cijena);
- temp[i].Unos(temp[i + 1]._naziv, temp[i + 1]._cijena);
- temp[i + 1].Unos(spremi._naziv, spremi._cijena);
- prekidac = 0;
- }
- }
- N = N - 1;
- } while (N > 1 && prekidac == 0);
- int prvi = 1, zadnji = _brojArtikala, srednji;
- bool nadjen = false;
- while (nadjen == false && prvi <= zadnji)
- {
- srednji = (prvi + zadnji) / 2;
- if (strcmp(naziv, temp[srednji]._naziv) < 0) zadnji = srednji - 1;
- if (strcmp(naziv, temp[srednji]._naziv) == 0) { nadjen = true; return &temp[srednji]; }
- if (strcmp(naziv, temp[srednji]._naziv) > 0) prvi = srednji + 1;
- }
- }
- };
- //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()
- {
- char broj[3];
- char * temp = new char[10];
- strcpy_s(temp, 10, "00000000");
- _itoa_s(brojRacuna, broj, 3, 10);
- strcat_s(temp, 10, broj);
- brojRacuna++;
- return temp;
- }
- Artikal * PronadjiNajskupljiArtikal(Racun racun, int brojArtikala, Artikal * max)
- {
- if (brojArtikala == 0)
- return max;
- else if (racun._artikli[brojArtikala]._cijena < racun._artikli[brojArtikala - 1]._cijena)
- {
- max = &racun._artikli[brojArtikala - 1];
- PronadjiNajskupljiArtikal(racun, --brojArtikala, max);
- }
- else
- PronadjiNajskupljiArtikal(racun, --brojArtikala, max);
- }
- 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 -> ";
- p1->Ispis();
- racun.Ispis();
- Artikal * p2 = PronadjiNajskupljiArtikal(racun, racun._brojArtikala, &racun._artikli[0]);
- cout << "Rekurzivno pronadjen najskuplji artikal -> ";
- p2->Ispis();
- cout << endl;
- //dealocirati zauzetu memoriju
- racun.Dealociraj();
- system("PAUSE>0");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement