#include #include #include #include #include #include #include #include #include using namespace std; class CProdukt { //friend class CWarzywo; // deklaracja przyja�ni, aby mo�liwy by� dost�p do p� primVat w nowej klasie pochodnej protected: // zaprzyja�nienie zamienione na rozwi�zanie z polami protected int mLp; string mName; // nazwa CProduktu double mCount; // liczba CProdukt�w string mUnit; // jednostka miary double mPrize; // cena netto 1 sztuki double mVat; // warto�� podatku VAT public: CProdukt(); // konstruktor CProdukt(int aLp, string aName, double aCount, string aUnit, double aPrize, double aVat); // konstruktor void Wypelnij(void); //void Pokaz(void); virtual void Pokaz(void); CProdukt(CProdukt &l); // konstruktor kopiujacy ~CProdukt(); // destruktor int getLp(void); void setLp(int); virtual CProdukt * Klonuj(); virtual string Zwroc(void); }; CProdukt::CProdukt(int aLp, string aName, double aCount, string aUnit, double aPrize, double aVat) { mLp=aLp; mName=aName; mCount=aCount; mUnit=aUnit; mPrize=aPrize; mVat=aVat; } CProdukt::CProdukt() { mLp = 0; } CProdukt::CProdukt(CProdukt &l) { mLp=l.mLp; mName=l.mName; mCount=l.mCount; mUnit=l.mUnit; mPrize=l.mPrize; mVat=l.mVat; } CProdukt::~CProdukt() { ; } void CProdukt::Wypelnij(void) { cout << "Podaj nazwe:\n"; cin >> mName; cout << "Podaj ilosc:\n"; cin >> mCount; cout << "Podaj jednostke miary:\n"; cin >> mUnit; cout << "Podaj cene:\n"; cin >> mPrize; // UWAGA obowi�zuje notacja z kropk� . cout << "Podaj stawke VAT:\n"; cin >> mVat; } void CProdukt::Pokaz(void) { cout << endl; cout << mLp << "\t"; cout << mName << "\t"; cout << mCount << "\t"; cout << mUnit << "\t"; cout << mPrize << "\t"; cout << mVat << endl; } int CProdukt::getLp(void) { return(mLp); } void CProdukt::setLp(int x) { mLp = x; } CProdukt* CProdukt::Klonuj() { CProdukt *n = new CProdukt(*this); return n; } string CProdukt::Zwroc(void) { string wyjscie; stringstream wyjscie_stream; wyjscie_stream << endl << mLp << "\t" << mName << "\t" << mCount << "\t" << mUnit << "\t" << mPrize << "\t" << mVat << "\t" << endl; wyjscie = wyjscie_stream.str(); return wyjscie; } class CWarzywo : public CProdukt { public: string mKolor; CWarzywo(); CWarzywo(CWarzywo &l); CWarzywo(int aLp, string aName, double aCount, string aUnit, double aPrize, double aVat, string aKolor); void Pokaz(void); CProdukt* Klonuj(); string Zwroc(void); }; CWarzywo::CWarzywo() { mKolor="nieznany"; } CWarzywo::CWarzywo(CWarzywo &l) { mLp=l.mLp; mName=l.mName; mCount=l.mCount; mUnit=l.mUnit; mPrize=l.mPrize; mVat=l.mVat; mKolor=l.mKolor; } CWarzywo::CWarzywo(int aLp, string aName, double aCount, string aUnit, double aPrize, double aVat, string aKolor) { mLp=aLp; mName=aName; mCount=aCount; mUnit=aUnit; mPrize=aPrize; mVat=aVat; mKolor=aKolor; } void CWarzywo::Pokaz(void) { cout << endl; cout << mLp << "\t"; cout << mName << "\t"; cout << mCount << "\t"; cout << mUnit << "\t"; cout << mPrize << "\t"; cout << mVat << "\t"; cout << mKolor << endl; } string CWarzywo::Zwroc(void) { string wyjscie; stringstream wyjscie_stream; wyjscie_stream << endl << mLp << "\t" << mName << "\t" << mCount << "\t" << mUnit << "\t" << mPrize << "\t" << mVat << "\t" << mKolor << "\t" << endl; wyjscie = wyjscie_stream.str(); return wyjscie; } CProdukt* CWarzywo::Klonuj() { CProdukt *n = new CWarzywo(*this); return n; } class CWezel { public: CWezel *mNastepny; // wskaznik na mNastepny CWezel listy int indeks; CProdukt *mWskaznikNaCProdukt; // wskaznik na CProdukt CWezel(); ~CWezel(); }; CWezel::CWezel() { mNastepny = NULL; } class CBaza { private: public: CWezel *mPierwszy; // wskaznik na mPierwszy CWezel listy CBaza(); ~CBaza(); void Pokaz(void); void Dodaj(CProdukt &aProdukt); // dodawanie nowego CProduktu na poczatek listy void Dodaj_na_koniec(CProdukt &aProdukt); // dodawanie nowego CProduktu na koniec listy void Dodaj(int aLiczba); void Dodaj_na_koniec(); // dodawanie nowego elementu na koniec listy void Wczytaj(char *aName); void Zapisz(char *aName); friend ostream & operator<< (ostream &aWyjscie, const CBaza &aBaza); void operator + (CProdukt &p); CBaza& operator= (const CBaza& db); }; void CBaza::Zapisz(char *aName) { ofstream out(aName); out.write((char *) this, sizeof(CBaza)); out.close(); } void CBaza::Wczytaj(char *aName) { ifstream in(aName); in.read((char *) this, sizeof(CBaza)); in.close(); } void CBaza::operator + (CProdukt &p) { Dodaj(p); } CBaza& CBaza::operator= (const CBaza& f) { if (this == &f) return *this; // Spokojnie poradzi sobie z pseudo-przypisaniem CWezel *wsk_CWezel; CProdukt *wsk_CProdukt; wsk_CWezel = f.mPierwszy; while ( wsk_CWezel != NULL) { wsk_CProdukt = wsk_CWezel->mWskaznikNaCProdukt; this->Dodaj_na_koniec(*wsk_CProdukt); wsk_CWezel = wsk_CWezel->mNastepny; } return *this; } CBaza::CBaza() { mPierwszy = NULL; } CBaza::~CBaza() { } void CBaza::Dodaj(CProdukt &aProdukt) { CWezel *nowy = new CWezel; if (mPierwszy == NULL) { mPierwszy = nowy; } else { nowy->mNastepny = mPierwszy; mPierwszy = nowy; } mPierwszy->mWskaznikNaCProdukt = aProdukt.Klonuj(); } void CBaza::Dodaj_na_koniec(CProdukt &aProdukt) //Dodaje na koniec listy { CWezel *nowy = new CWezel; nowy->mWskaznikNaCProdukt = aProdukt.Klonuj(); CWezel *wsk_CWezel; wsk_CWezel = mPierwszy; if (mPierwszy == NULL) { mPierwszy = nowy; } else { while ( wsk_CWezel != NULL) { if (wsk_CWezel->mNastepny == NULL) { wsk_CWezel->mNastepny = nowy;break; } wsk_CWezel = wsk_CWezel->mNastepny; } } } void CBaza::Dodaj(int aLiczba) { CWezel *nowy = new CWezel; if (mPierwszy == NULL) { mPierwszy = nowy; } else { nowy->mNastepny = mPierwszy; mPierwszy = nowy; } mPierwszy->indeks = aLiczba; } void CBaza::Pokaz(void) { CWezel *wsk_CWezel; wsk_CWezel = mPierwszy; //cout<< "POKAZ:\n"; while ( wsk_CWezel != NULL) { wsk_CWezel->mWskaznikNaCProdukt->Pokaz(); wsk_CWezel = wsk_CWezel->mNastepny; } } ostream & operator << (ostream &aWyjscie, const CBaza &aBaza) { string tmp; CWezel *wsk_CWezel; wsk_CWezel = aBaza.mPierwszy; //cout<< "POKAZ:\n"; while ( wsk_CWezel != NULL) { tmp = tmp + wsk_CWezel->mWskaznikNaCProdukt->Zwroc(); wsk_CWezel = wsk_CWezel->mNastepny; } return aWyjscie << tmp; } int main(void) { CBaza bd2; CBaza bd1; CProdukt *wsk_CProdukt; CWarzywo *wsk_CWarzywo; CProdukt p1(2, "CProdukt", 10, "kg", 1.20, 0.07); CWarzywo w1(2, "marchew", 100, "kg", 1.50, 0.07, "czerwony"); CWarzywo w2(2, "burak", 100, "kg", 1.50, 0.07, "ciemno-czerwony"); wsk_CProdukt = &w1; wsk_CWarzywo = &w1; bd2.Dodaj(w1); bd2.Dodaj(p1); bd2 + w2; cout << "bd2 + w2, POKAZ BD2:\n"; cout << bd2; bd1 = bd2; cout << "bd1=bd2, POKAZ BD1:\n"; cout << bd1; //bd2.Zapisz("CBaza"); /// zapis do pliku bd2.Zapisz("CBaza"); // odczyt z pliku CBaza bd3; bd3.Wczytaj("CBaza"); cout << "bd3.Wczytaj, POKAZ BD3:\n"; bd3.Pokaz(); // spr konstruktora kopiuj�cego //CProdukt *pp = new CProdukt(p1); //CProdukt * pp; //pp = w1.Klonuj(); //pp = &w1; //pp->Pokaz(); //CProdukt *mWskaznikNaCProdukt = new w1; /* w1.Pokaz(); wsk_CProdukt->Pokaz(); wsk_CWarzywo->Pokaz(); // Dynamiczne przydzielanie pamiecy CProdukt *p1 = new CProdukt; p1->getLp(6); cout << p1->getLp() << endl; delete p1; CProdukt *p2 = new CProdukt(5, "maslo", 10, "sztuk", 1.00, 0.07); p2->Pokaz(); // Deklaracja statyczna CProdukt p3(4, "chleb", 10, "sztuk", 2.00, 0.07); CProdukt p4; p3.Pokaz(); p4.Wypelnij(); p4.Pokaz(); cout << p4.getLp(); p4.getLp(5); cout << p4.getLp(); */ system("PAUSE"); return(0); }