#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#include <conio.h>
#include <cstring>
#include <list>
#include <sstream>
#include <cstdlib>
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);
}