Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #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 {
- 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 * brojRacuna, Datum datum)
- {
- strcpy_s(_brojRacuna, 10, brojRacuna);
- _datumKreiranja.Unos(*datum._dan, *datum._mjesec, *datum._godina);
- _artikli = nullptr;
- _kolicine = nullptr;
- _brojArtikala = 0;
- }
- //2. Dealociraj
- void Dealociraj()
- {
- _datumKreiranja.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)
- {
- for (int i = 0; i < _brojArtikala; i++)
- {
- if (strcmp(_artikli[i]._naziv, artikal._naziv) == 0)
- {
- _kolicine[i] += kolicina;
- cout << "Isti aritkal: " << _brojArtikala << " vec postoji. Uvecat cu mu prethodnu kolicinu: " << _kolicine[i] << endl;
- return;
- }
- }
- Artikal * temp = new Artikal[_brojArtikala + 1];
- int * tempKol = new int[_brojArtikala + 1];
- for (int i = 0; i < _brojArtikala; i++)
- {
- temp[i].Unos(_artikli[i]._naziv, _artikli[i]._cijena);
- tempKol[i] = _kolicine[i];
- }
- temp[_brojArtikala].Unos(artikal._naziv, artikal._cijena);
- tempKol[_brojArtikala] = kolicina;
- for (int i = 0; i < _brojArtikala; i++)
- {
- _artikli[i].Dealociraj();
- }
- delete[] _artikli;
- delete[] _kolicine;
- _artikli = temp;
- _kolicine = tempKol;
- _brojArtikala++;
- cout << "Artikal br. " << _brojArtikala << " dodan." << endl;
- return;
- }
- // //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 upisa u fajl: " << nazivFajla << endl;
- else
- cout << "Uspjeno upisano u fajl: " << nazivFajla << endl;
- }
- // //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);
- }
- }
- 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)
- //2. GenerisiSljedeciBrojRacuna - generise i vraca naredni broj racuna
- //format broja racuna: 006005491
- //osigurati automatsko generisanje broja racuna pocevsi od 000000001
- 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;
- }
- Artikal * PronadjiNajskupljiArtikal(/*potrebni parametri*/)
- {
- Artikal * novi = nullptr;
- return novi;
- }
- 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();
- cout << endl;
- Artikal * p2 = PronadjiNajskupljiArtikal(/*potrebni parametri*/);
- cout << "Rekurzivno pronadjen najskuplji artikal -> ";
- //p2->Ispis();
- cout << endl;
- //dealocirati zauzetu memoriju
- p1->Dealociraj();
- racun.Dealociraj();
- sok.Dealociraj(); cokolada.Dealociraj(); cigarete.Dealociraj();
- danas.Dealociraj();
- system("PAUSE");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement