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 *brojRacuna, Datum dat)
- {
- int velicina = strlen(brojRacuna) + 1;
- strcpy_s(_brojRacuna, velicina, brojRacuna);
- _datumKreiranja = dat;
- _brojArtikala = 0;
- }
- //2. Dealociraj
- void Dealociraj()
- {
- for (int i = 0; i < _brojArtikala; i++)
- _artikli[i].Dealociraj();
- 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 art, int kol)
- {
- if (_brojArtikala == 0) //nema artikla nikako tek ga sad dodajem
- {
- _artikli = new Artikal;
- _artikli->Unos(art._naziv, art._cijena);
- _kolicine = new int(kol);
- _brojArtikala++;
- cout << "Artikal je uspjesno dodan!";
- }
- else
- {
- if (_brojArtikala > 0)//artikal je već tu i ponovno se dodaje - to onemoguci
- {
- bool ArtikalPronadjen = false;
- int lokacija = 0;
- for (int i = 0; i < _brojArtikala; i++)
- {
- if (strcmp(art._naziv, _artikli[i]._naziv) == 0 || art._cijena, _artikli[i]._cijena)
- //zasto izjednacujemo s 0?
- {
- ArtikalPronadjen = true;
- lokacija = i; //da li on ovdje cuva lokaciju pronadjenog artikla?
- cout << "Isti artikl je pronadjen!";
- break;
- }
- //?? proci kroz ovaj dio još jednom
- if (ArtikalPronadjen == true)
- {
- _kolicine[lokacija] = _kolicine[lokacija] + kol;
- return;
- }
- else //takav artikl nije pronadjen, te zato dodaj novi artikal
- {
- Artikal *artTemp = new Artikal[_brojArtikala];
- for (int i = 0; i < _brojArtikala; i++)
- artTemp[i].Unos(_artikli[i]._naziv, _artikli[i]._cijena);
- delete _artikli; //alociran bio u prvom if-u
- _artikli = new Artikal[_brojArtikala + 1]; //?? zasto +1, zašto se ponovno alovira
- for (int i = 0; i < _brojArtikala; i++)
- _artikli[i].Unos(artTemp[i]._naziv, artTemp[i]._cijena);
- int *kolTemp = new int[_brojArtikala + 1]; //privremena vrijednost //?? opet zasto +1, zašto se ponovno alocira
- for (int i = 0; i < _brojArtikala; i++)
- kolTemp[i] = _kolicine[i];
- delete _kolicine; //alocirane u prvom if-u
- _kolicine = new int[_brojArtikala + 1]; ////?? opet zasto +1, zašto se ponovno alocira
- for (int i = 0; i < _brojArtikala; i++)
- _kolicine[i] = kolTemp[i];
- _artikli[_brojArtikala].Unos(art._naziv, art._cijena);
- _kolicine[_brojArtikala] = kol;
- _brojArtikala++;
- cout << "Artikal uspjesno dodan.";
- }
- }
- }
- }
- }
- //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 suma = 0;
- cout << crt << _brojRacuna << crt;
- for (int i = 0; i < _brojArtikala; i++)
- {
- cout << "Naziv artikla: " << _artikli[i]._naziv << endl;
- cout << "Kolicina artikala: " << _kolicine[i] << endl;
- cout << "Cijena artikla: " << _artikli[i]._cijena << endl;
- cout << "Ukupna cijena artikla: " << (_artikli[i]._cijena)*(_kolicine[i]) << endl;
- suma = suma + (_artikli[i]._cijena)*(_kolicine[i]);
- }
- cout << crt << "Ukupan iznos je: " << suma << crt;
- }
- //5. BinarnaPretraga - koristeci binarnu pretragu, na osnovu naziva, pronalazi i vraca
- //pokazivac na artikal.Ukoliko trazeni artikal ne postoji funkcija vraca nullptr.
- void SortiraniNiz()
- {
- for (int i = 0; i < _brojArtikala; i++)
- {
- for (int j = 0; j < _brojArtikala; j++)
- {
- if (strcmp(_artikli[j]._naziv, _artikli[j - 1]._naziv) < 0)
- {
- swap(_artikli[j], _artikli[j - 1]);
- swap(_kolicine[j], _kolicine[j - 1]);
- }
- }
- }
- }
- Artikal * BinarnaPretraga(char *pretraga )
- {
- SortiraniNiz();
- int prvi = 0;
- int zadnji = _brojArtikala;
- int srednji;
- while (prvi <= zadnji)
- {
- srednji = (prvi + zadnji) / 2;
- if (strcmp(pretraga, _artikli[srednji]._naziv) == 0)
- return & _artikli[srednji];
- // return &_artikli[srednji];
- if (strcmp(pretraga, _artikli[srednji]._naziv) < 0)
- zadnji = srednji - 1;
- if (strcmp(pretraga, _artikli[srednji]._naziv) < 0)
- prvi = srednji + 1;
- }
- return NULL;
- }
- //Prilikom svakog ispisa, racun je potrebno spasiti u tekstualni fajl sa istim nazivom kao i broj racuna.
- void ispisiTxt()
- {
- char NazivFajla[20];
- strcpy_s(NazivFajla, _brojRacuna);
- strcpy_s(NazivFajla, ".txt");
- ofstream Fajl(NazivFajla, ios::ate);
- Fajl << crt << "Broj racuna: " << _brojRacuna << crt;
- Fajl << "Datum: ";
- Fajl << *_datumKreiranja._dan << "." <<* _datumKreiranja._mjesec << "." <<* _datumKreiranja._godina << crt;
- //zasto s pokazivacima?
- float suma = 0;
- for (int i = 0; i < _brojArtikala; i++)
- {
- Fajl << "Naziv artikla: " << _artikli[i]._naziv << endl;
- Fajl << "Kolicina artikala: " << _kolicine[i] << endl;
- Fajl << "Cijena artikla: " << _artikli[i]._cijena << endl;
- Fajl << "Ukupna cijena artikla: " << (_artikli[i]._cijena)*(_kolicine[i]) << endl;
- suma = suma + (_artikli[i]._cijena)*(_kolicine[i]);
- }
- cout << crt << "Ukupan iznos je: " << suma << crt;
- Fajl.close();
- cout << "Uspjesno upisano u fajl: " << NazivFajla << endl;
- }
- };
- //1. PronadjiNajskupljiArtikal - rekurzivna funkcija koja vraca pokazivac na artikal sa najvecom ukupnom cijenom (cijena*kolicina)
- //2. GenerisiSljedeciBrojRacuna - generise i vraca naredni broj racuna
- float BrojRacuna = 6621166;
- char *GenerisiSljedeciBrojRacuna()
- {
- //format broja racuna: 006005491
- //osigurati automatsko generisanje broja racuna pocevsi od 000000001
- char *temp = new char[10];
- strcpy_s(temp, strlen("RN0000000") + 1, "RN0000000");
- int brojac = 0;
- int brojRacuna = BrojRacuna;
- while (brojRacuna > 0)
- {
- brojRacuna = brojRacuna / 10;
- brojac++;
- }
- _itoa_s(BrojRacuna, &temp[9 - brojac], strlen(temp) + 1, 10); //jos jednom ponoviti gdje sta u sta
- BrojRacuna++;
- 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.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();
- // maknuti komentar ima greska:*** Artikal * p1 = racun.BinarnaPretraga("Cokolada");
- cout << "Binarnom pretragom pronadjen artikal -> ";
- // maknuti komentar ima greska:*** p1->Ispis(); //šta je p1?
- racun.Ispis();
- //rekurzija:
- //Artikal * p2 = PronadjiNajskupljiArtikal(/*potrebni parametri*/);
- cout << "Rekurzivno pronadjen najskuplji artikal -> ";
- // maknuti komentar ima greska:*** p2->Ispis();//šta je p2?
- cout << endl;
- //dealocirati zauzetu memoriju
- danas.Dealociraj(); //zašto smo dealocirali ova dva parametra?
- racun.Dealociraj();
- system("PAUSE");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement