Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Schemat dziedziczenia klas
- * ZYWNOSC
- * / \
- * OWOC WARZYWO
- * / \ / \
- * JABLKO POMARANCZA MARCHEW BURAK
- *
- *ZYWNOSC
- * - wartosc_odzywcza
- * - nazwa
- *
- *
- *WARZYWO
- * - wartosc_odzywcza
- * - nazwa
- * - swieze
- *
- *MARCHEW
- * - wartosc_odzywcza
- * - nazwa
- * - swieze
- * - dlugosc_korzenia
- *BURAK
- * - wartosc_odzywcza
- * - nazwa
- * - swieze
- * - cukrowy
- *
- *
- *OWOC
- * - wartosc_odzywcza
- * - nazwa
- * - cytrusowy
- * - witamina
- *
- *JABLKO
- * - wartosc_odzywcza
- * - nazwa
- * - cytrusowy
- * - witamina
- * - odmiana
- *POMARANCZA
- * - wartosc_odzywcza
- * - nazwa
- * - cytrusowy
- * - witamina
- * - bezpestkowa
- */
- #include <vector>
- #include <cstdlib>
- #include <iostream>
- #include <fstream>
- #include <sstream>
- #include <cstring>
- using namespace std;
- /*** ZYWNOSC ***/
- /*
- * Klasa macierzysta dla pozostalych klas w programie
- * Przechowuje informacje o nazwie i wartosci odzywczej danego rodzaju zywnosci
- */
- class Zywnosc {
- protected:
- float wartosc_odzywcza;
- char * nazwa;
- void ustaw_nazwe(const char * _nazwa) {
- // przepisanie nazwy do zmiennej wlasnosci
- nazwa = new char[strlen(_nazwa)];
- strcpy(nazwa, _nazwa);
- }
- public:
- Zywnosc() {
- }
- Zywnosc(const char * _nazwa, float w_odzywcza) : wartosc_odzywcza(w_odzywcza) {
- ustaw_nazwe(_nazwa);
- }
- Zywnosc(const Zywnosc & cpy) :
- wartosc_odzywcza(cpy.pokaz_w_odzywcza()) {
- ustaw_nazwe(cpy.pokaz_nazwe());
- }
- string podstawowe_info(){
- stringstream str;
- str << pokaz_nazwe()
- << ", wartosc odzywcza: " << pokaz_w_odzywcza() << "kcal";
- return str.str();
- }
- //metoda wirtualna tworzaca ciag do zapisu obiektu do pliku
- virtual string konwertuj_do_zapisu() {
- return "";
- }
- //metoda wirtualna tworzaca ciag informacyjny na temat obiektu
- virtual string konwertuj_do_prezentacji(){
- return podstawowe_info();
- }
- // akcesory wlasnosci
- float pokaz_w_odzywcza() const {
- return wartosc_odzywcza;
- }
- char * pokaz_nazwe() const {
- return nazwa;
- }
- };
- // Przeciazony operator wyprowadzenia na strumien wyjsciowy
- ostream & operator <<(ostream & strumien, Zywnosc z) {
- strumien << z.konwertuj_do_prezentacji();
- return strumien;
- }
- /*** WARZYWO ***/
- /*
- * Klasa modelujaca warzywa. Rozszerza Zywnosc o informacje czy
- * warzywo jest swieze
- */
- class Warzywo : public Zywnosc {
- protected:
- bool swieze;
- public:
- Warzywo() {
- }
- Warzywo(const char * _nazwa, float w_odzywcza, bool _swieze) :
- Zywnosc(_nazwa, w_odzywcza), swieze(_swieze) {
- }
- Warzywo(const Warzywo & cpy) :
- Zywnosc(cpy.pokaz_nazwe(), cpy.pokaz_w_odzywcza()), swieze(cpy.czy_swieze()) {
- }
- virtual string konwertuj_do_zapisu() {
- return "";
- }
- virtual string konwertuj_do_prezentacji(){
- stringstream str;
- str << podstawowe_info() << (czy_swieze() ? ", swieze" : ", mrozone");
- return str.str();
- }
- bool czy_swieze() const {
- return swieze;
- }
- };
- ostream & operator <<(ostream & strumien, Warzywo w) {
- strumien << w.konwertuj_do_prezentacji();
- return strumien;
- }
- /*** MARCHEW ***/
- /*
- * Klasa marchwi, dziedziczy po Warzywie. Rozszerza je o dlugosc korzenia
- * i stosowny akcesor
- */
- class Marchew : public Warzywo {
- protected:
- float dlugosc_korzenia;
- public:
- Marchew(float dl_korzenia, float w_odzywcza, bool _swieze) :
- Warzywo("Marchew", w_odzywcza, _swieze), dlugosc_korzenia(dl_korzenia) {
- }
- Marchew(Marchew & cpy) :
- Warzywo("Marchew", cpy.pokaz_w_odzywcza(), cpy.czy_swieze()), dlugosc_korzenia(cpy.daj_dl_korzenia()) {
- }
- explicit Marchew(istream & strumien) {
- ustaw_nazwe("Marchew");
- strumien >> wartosc_odzywcza >> swieze >> dlugosc_korzenia;
- }
- string konwertuj_do_zapisu() {
- stringstream bufor;
- bufor << nazwa << " "
- << wartosc_odzywcza << " "
- << swieze << " "
- << dlugosc_korzenia;
- return bufor.str();
- }
- string konwertuj_do_prezentacji(){
- stringstream str;
- str << Warzywo::konwertuj_do_prezentacji() << endl << "Korzen dlugosci: " << daj_dl_korzenia();
- return str.str();
- }
- float daj_dl_korzenia() const {
- return dlugosc_korzenia;
- }
- };
- /*** BURAK ***/
- /*
- * Dziedziczy po warzywie, rozszerza je o informacje czy jest cukrowy.
- * Zapewnia odpowiedni akcesor.
- */
- class Burak : public Warzywo {
- protected:
- bool cukrowy;
- public:
- Burak(bool _cukrowy, float w_odzywcza, bool _swieze) :
- Warzywo("Burak", w_odzywcza, _swieze), cukrowy(_cukrowy) {
- }
- Burak(Burak & cpy) :
- Warzywo("Burak", cpy.pokaz_w_odzywcza(), cpy.czy_swieze()), cukrowy(cpy.czy_cukrowy()) {
- }
- explicit Burak(istream & strumien) {
- ustaw_nazwe("Burak");
- strumien >> wartosc_odzywcza >> swieze >> cukrowy;
- }
- string konwertuj_do_zapisu() {
- stringstream bufor;
- bufor << nazwa << " "
- << wartosc_odzywcza << " "
- << swieze << " "
- << cukrowy;
- return bufor.str();
- }
- string konwertuj_do_prezentacji(){
- stringstream str;
- str << Warzywo::konwertuj_do_prezentacji() << endl << (czy_cukrowy() ? "Nie jest cukrowy" : "Jest cukrowy");
- return str.str();
- }
- bool czy_cukrowy() const {
- return cukrowy;
- }
- };
- /*** OWOC ***/
- /*
- * Rozszerza Zywnosc o informacje czy jest cytrusowy i jaka ma witamine.
- * Zapewnia odpowiednie akcesory
- */
- class Owoc : public Zywnosc {
- protected:
- bool cytrusowy;
- char witamina;
- public:
- Owoc() {
- }
- Owoc(const char * _nazwa, float w_odzywcza, bool _cytrus, char _witamina) :
- Zywnosc(_nazwa, w_odzywcza), cytrusowy(_cytrus), witamina(_witamina) {
- }
- Owoc(const Owoc & cpy) :
- Zywnosc(cpy.pokaz_nazwe(), cpy.pokaz_w_odzywcza()), cytrusowy(cpy.czy_jest_cytrusem()),
- witamina(cpy.pokaz_witamine()) {
- }
- virtual string konwertuj_do_zapisu() {
- return "";
- }
- virtual string konwertuj_do_prezentacji(){
- stringstream str;
- str << podstawowe_info() << ", owoc "
- << (czy_jest_cytrusem() ? "cytrusowy" : "niecytrusowy")
- << endl << "Zawiera witamine " << pokaz_witamine();
- return str.str();
- }
- bool czy_jest_cytrusem() const {
- return cytrusowy;
- }
- char pokaz_witamine() const {
- return witamina;
- }
- };
- /*** JABLKO ***/
- /*
- * Modeluje klase jablka rozszerzajac Owoc o wlasnosc odmiana.
- */
- class Jablko : public Owoc {
- private:
- char * odmiana;
- void ustaw_odmiane(const char * _odmiana) {
- odmiana = new char[strlen(_odmiana)];
- strcpy(odmiana, _odmiana);
- }
- public:
- Jablko(const char * _odmiana, float w_odzywcza) :
- Owoc("Jablko", w_odzywcza, false, 'D') {
- ustaw_odmiane(_odmiana);
- }
- Jablko(Jablko & cpy) :
- Owoc("Jablko", cpy.pokaz_w_odzywcza(), false, 'D') {
- ustaw_odmiane(cpy.pokaz_odmiane());
- }
- explicit Jablko(istream & strumien) {
- ustaw_nazwe("Jablko");
- char tmp_odmiana[30];
- strumien >> wartosc_odzywcza
- >> witamina
- >> cytrusowy;
- strumien.get();
- strumien >> tmp_odmiana;
- odmiana = new char(strlen(tmp_odmiana));
- strcpy(odmiana, tmp_odmiana);
- }
- string konwertuj_do_zapisu() {
- stringstream bufor;
- bufor << nazwa << " "
- << wartosc_odzywcza << " "
- << witamina << " "
- << cytrusowy << " "
- << odmiana;
- return bufor.str();
- }
- string konwertuj_do_prezentacji(){
- stringstream str;
- str << Owoc::konwertuj_do_prezentacji() << endl << "Odmiana: " << pokaz_odmiane();
- return str.str();
- }
- char * pokaz_odmiane() const {
- return odmiana;
- }
- };
- /*** POMARANCZA ***/
- /*
- * Dziedziczy po Owoc, rozszerza go o informacje czy to odmiana bezpestkowa
- */
- class Pomarancza : public Owoc {
- private:
- bool bezpestkowa;
- public:
- Pomarancza(bool _bezpestkowa, float w_odzywcza) :
- Owoc("Pomarancza", w_odzywcza, true, 'C'),
- bezpestkowa(_bezpestkowa) {
- }
- Pomarancza(const Pomarancza & cpy) :
- Owoc("Pomarancza", cpy.pokaz_w_odzywcza(), true, 'C'),
- bezpestkowa(cpy.czy_bezpestkowa()) {
- }
- explicit Pomarancza(istream & strumien) {
- ustaw_nazwe("Pomarancza");
- strumien >> wartosc_odzywcza
- >> witamina
- >> cytrusowy
- >> bezpestkowa;
- }
- string konwertuj_do_zapisu() {
- stringstream bufor;
- bufor << nazwa << " "
- << wartosc_odzywcza << " "
- << witamina << " "
- << cytrusowy << " "
- << bezpestkowa;
- return bufor.str();
- }
- string konwertuj_do_prezentacji(){
- stringstream str;
- str << Owoc::konwertuj_do_prezentacji()
- << endl << "Odmiana " << (czy_bezpestkowa() ? "bezpestkowa" : "z pestkami");
- return str.str();
- }
- bool czy_bezpestkowa() const {
- return bezpestkowa;
- }
- };
- /*** KOSZYCZEK ***/
- /*
- * Klasa kontenera zywnosci
- * Posiada metody sluzace dodawaniu nowych elementow do listy oraz czyszczenia listy
- * Udostepnia mozliwosc zapisu do pliku i odczytu z pliku
- */
- class Koszyczek {
- vector<Zywnosc*> zawartosc;
- public:
- Koszyczek & dodaj(Zywnosc * zyw) {
- zawartosc.push_back(zyw);
- return *this;
- }
- void zapisz(const char *nazwa_pliku) {
- ofstream plik(nazwa_pliku);
- // Jesli nie udalo sie otworzyc pliku do zapisu
- if (!plik.is_open()) {
- cerr << "Blad otwarcia pliku!" << endl;
- return;
- }
- // Glowna petla zapisu
- for (int i = 0; i < zawartosc.size(); ++i) {
- plik << zawartosc[i]->konwertuj_do_zapisu() << endl;
- }
- plik.close();
- }
- void odczyt(const char * nazwa_pliku) {
- ifstream plik(nazwa_pliku);
- // Jesli nie udalo sie czytac z pliku
- if (!plik.is_open()) {
- cerr << "Blad otwarcia pliku!" << endl;
- return;
- }
- char tmp_nazwa[20];
- // Glowna petla odczytu kolejnych linii
- while (plik.get() != EOF) {
- plik.unget();
- plik >> tmp_nazwa;
- if (!strcmp(tmp_nazwa, "Burak")) {
- dodaj(new Burak(plik));
- } else if (!strcmp(tmp_nazwa, "Marchew")) {
- dodaj(new Marchew(plik));
- } else if (!strcmp(tmp_nazwa, "Jablko")) {
- dodaj(new Jablko(plik));
- } else if (!strcmp(tmp_nazwa, "Pomarancza")) {
- dodaj(new Pomarancza(plik));
- } else break;
- plik.get();
- }
- plik.close();
- }
- // Czyszczenie zawartosci koszyka
- void oproznij() {
- zawartosc.clear();
- }
- // Wyswietlenie zawartosci koszyka
- void prezentuj() {
- cout << "ZAWARTOSC KOSZYCZKA" << endl;
- if (zawartosc.empty())
- cout << "<koszyk jest pusty>" << endl;
- else
- for (int i = 0; i < zawartosc.size(); ++i)
- cout << (i + 1) << ". ELEMENT:" << endl << zawartosc[i]->konwertuj_do_prezentacji() << endl;
- }
- };
- int main(int argc, char** argv) {
- Koszyczek k;
- // dodanie do koszyczka warzyw i owocow
- k.dodaj(new Jablko("reneta", 10))
- .dodaj(new Marchew(8, 21, true))
- .dodaj(new Burak(false, 7, true))
- .dodaj(new Pomarancza(false, 12));
- // zapis do pliku
- k.zapisz("omg.dat");
- // czyszczenie lokalnego buforu
- k.oproznij();
- // odczyt danych z pliku
- k.odczyt("omg.dat");
- // prezentacja wczytanych danych
- k.prezentuj();
- return (EXIT_SUCCESS);
- }
Add Comment
Please, Sign In to add comment