Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- using namespace std;
- 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 {
- //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(char *brRacuna, Datum d) {
- strcpy_s(_brojRacuna, strlen(brRacuna) + 1, brRacuna);
- _datumKreiranja = d;
- _brojArtikala = 0;
- }
- //2. Dealociraj
- void Dealociraj()
- {
- for (int i = 0; i < _brojArtikala; i++)
- _artikli[i].Dealociraj();
- delete[]_artikli; delete[]_kolicine;
- _artikli = nullptr; _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 &p, int kolicina)
- {
- for (int i = 0; i < _brojArtikala; i++)
- if (strcmp(_artikli[i]._naziv, p._naziv) == 0) {
- _kolicine[i] += kolicina; return;
- }
- if (_brojArtikala == 0) {
- _artikli = new Artikal(p);
- _kolicine = new int(kolicina);
- _brojArtikala++;
- }
- else {
- Artikal *temp = new Artikal[_brojArtikala + 1];
- int *tempp = new int[_brojArtikala + 1];
- for (int i = 0; i < _brojArtikala; i++) {
- temp[i] = _artikli[i];
- tempp[i] = _kolicine[i];
- }
- temp[_brojArtikala] = p;
- tempp[_brojArtikala] = kolicina;
- _brojArtikala++;
- delete[]_artikli;
- _artikli = new Artikal[_brojArtikala];
- delete[]_kolicine;
- _kolicine = new int[_brojArtikala];
- _artikli = temp;
- _kolicine = tempp;
- }
- }
- /*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()
- {
- char temp[15];
- strcpy_s(temp, strlen(_brojRacuna) + 1, _brojRacuna);
- strncat_s(temp, sizeof(temp), ".txt", sizeof(".txt"));
- char *nazivFajla = new char[strlen(temp) + 1];
- strcpy_s(nazivFajla, strlen(temp) + 1, temp);
- ofstream upis(nazivFajla); ifstream ispis(nazivFajla);
- float UkupnaCijena = 0;
- if (upis.fail())
- cout << "Greska pri otvaranju fajla!" << endl;
- else {
- upis << crt + 1 << "FIT STORE : " << _brojRacuna << crt << crt + 1;
- for (int i = 0; i < _brojArtikala; i++)
- {
- UkupnaCijena += _artikli[i]._cijena * _kolicine[i];
- upis << "Naziv Artikla : " << _artikli[i]._naziv << endl;
- upis << "Kolicina : " << _kolicine[i] << endl;
- upis << "Cijena Artikla : " << _artikli[i]._cijena << endl;
- upis << "Ukupna cijena : " << _artikli[i]._cijena * _kolicine[i] << crt;
- }
- upis << "Ukupna Cijena svih Artikala : " << UkupnaCijena << crt;
- upis.close();
- }
- if (ispis.fail())
- cout << "Greska pri otvaranju fajla!" << endl;
- else {
- char znak;
- while (ispis.get(znak))
- cout << znak;
- ispis.close();
- }
- delete[]nazivFajla; nazivFajla = nullptr;
- }
- /*void sortNaziv() {
- // Bubble sort / Exchange sort
- int zamjena, max = _brojArtikala-1;
- do {
- zamjena = 1;
- for (int i = 0; i < max; i++)
- if (strcmp(_artikli[i]._naziv, _artikli[i +1]._naziv) > 0){
- swap(_artikli[i], _artikli[i + 1]);
- swap(_kolicine[i], _kolicine[i + 1]);
- zamjena = 0;
- }
- max = max - 1;
- } while (max>1 && zamjena == 0);
- }*/
- void sortNaziv()
- {
- //Selection SORT - Sortiranje Izborom
- int lokacija;
- for (int i = 0; i < _brojArtikala - 1; i++) {
- lokacija = i;
- for (int j = i + 1; j < _brojArtikala; j++) {
- if (strcmp(_artikli[j]._naziv, _artikli[lokacija]._naziv) < 0)
- lokacija = j;
- } if (strcmp(_artikli[i]._naziv, _artikli[lokacija]._naziv) > 0) {
- swap(_artikli[i], _artikli[lokacija]);
- swap(_kolicine[i], _kolicine[lokacija]);
- }
- }
- }
- void sortNaziv(int lijevi, int desni) {
- // QUICK SORT - recursive sorting
- int i = lijevi, j = desni;
- char *sidro = _artikli[(lijevi + desni) / 2]._naziv;
- while (i <= j) {
- while (strcmp(_artikli[i]._naziv, sidro) < 0)
- i++;
- while (strcmp(sidro, _artikli[j]._naziv) < 0)
- j--;
- if (i <= j) {
- swap(_artikli[i], _artikli[j]);
- swap(_kolicine[i], _kolicine[j]);
- i++;
- j--;
- }
- }
- if (lijevi < j)
- sortNaziv(lijevi, j);
- if (i < desni)
- sortNaziv(i, desni);
- }
- /*void sortNaziv() {
- int brojac;
- for(int e = 0; e < _brojArtikala; e++) {
- brojac = 0;
- for (int i = 1; i < _brojArtikala; i++) {
- for (int j = 0; j < strlen(_artikli[i]._naziv)+1; j++) {
- if (_artikli[i]._naziv[j] < _artikli[i-1]._naziv[j]) {
- brojac++;
- swap(_artikli[i], _artikli[i-1]);
- swap(_kolicine[i], _kolicine[i-1]);
- j = strlen(_artikli[i]._naziv)+1;
- } else if (_artikli[i]._naziv[j] > _artikli[i-1]._naziv[j])
- j = strlen(_artikli[i]._naziv) +1;
- }
- }
- if (brojac == 0)
- e = _brojArtikala;
- }
- }*/
- /*5. BinarnaPretraga - koristeci binarnu pretragu, na osnovu naziva, pronalazi i vraca
- pokazivac na artikal.Ukoliko trazeni artikal ne postoji funkcija vraca nullptr.*/
- Artikal *BinarnaPretraga(char *naziv) {
- sortNaziv(0, _brojArtikala - 1);
- //sortNaziv();.
- int prvi = 0, zadnji = _brojArtikala, srednji;
- while (prvi <= zadnji) {
- srednji = (prvi + zadnji) / 2;
- if (strcmp(naziv, _artikli[srednji]._naziv) == 0) {
- return &_artikli[srednji];
- }
- else if (strcmp(naziv, _artikli[srednji]._naziv) < 0)
- zadnji = srednji - 1;
- else if (strcmp(naziv, _artikli[srednji]._naziv) > 0)
- prvi = srednji + 1;
- }
- return nullptr;
- }
- };
- //1. PronadjiNajskupljiArtikal - rekurzivna funkcija koja vraca pokazivac na artikal sa najvecom ukupnom cijenom (cijena*kolicina)
- Artikal *PronadjiNajskupljiArtikal(Racun &p, int brArtikala, float &maxCijena, int &indeks) {
- if (brArtikala < 0)
- return &p._artikli[indeks];
- else {
- if ((p._artikli[brArtikala]._cijena * p._kolicine[brArtikala]) > maxCijena) {
- maxCijena = (p._artikli[brArtikala]._cijena * p._kolicine[brArtikala]);
- indeks = brArtikala;
- return PronadjiNajskupljiArtikal(p, brArtikala - 1, maxCijena, indeks);
- }
- else return PronadjiNajskupljiArtikal(p, brArtikala - 1, maxCijena, indeks);
- }
- }
- //2. GenerisiSljedeciBrojRacuna - generise i vraca naredni broj racuna
- int brRacuna = 1;
- char *GenerisiSljedeciBrojRacuna() {
- char *temp = new char[10];
- strcpy_s(temp, strlen("RB0000000") + 1, "RB0000000");
- int brojac = 0, kopija = brRacuna;
- do { kopija /= 10; brojac++; } while (kopija);
- _itoa_s(brRacuna, temp + (9 - brojac), sizeof(temp), 10);
- brRacuna++;
- return temp;
- }
- 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.23F);
- cokolada.Unos("Cokolada", 1.23F);
- sok.Unos("Cappy", 2.10F);
- 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 << "\nBinarnom pretragom pronadjen artikal -> ";
- p1->Ispis(); cout << "\n\n";
- racun.Ispis();
- float maxCijena = 0; int indeks = 0;
- Artikal * p2 = PronadjiNajskupljiArtikal(racun, racun._brojArtikala - 1, maxCijena, indeks);
- cout << "\nRekurzivno pronadjen najskuplji artikal -> ";
- p2->Ispis();
- cout << endl;
- //dealocirati zauzetu memoriju
- racun.Dealociraj();
- danas.Dealociraj();
- system("pause>0");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement