#include
"stdafx.h" //Przy projektowaniu w Microsoft Visual C++
#include
<stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include "PlikNaglowkowy.h"
using namespace std;
class BazaDanych{
public:
virtual
void save() = 0;
virtual
void load() = 0;
};
class Zwierze{
public:
char* nazwa;
int wysokosc;
double waga;
char* ubarwienie;
Zwierze(char*nazwa, int
wysokosc, double waga, char*ubarwienie){
this->nazwa = new char[strlen(nazwa) + 1];
strcpy(this->nazwa, nazwa);
this->wysokosc = wysokosc;
this->waga = waga;
this->ubarwienie
= new char[strlen(ubarwienie)
+ 1];
strcpy(this->ubarwienie, ubarwienie);
}
virtual
void show() = 0;
virtual
void zamienNaNapis(ostream& out) = 0;
virtual
void setNazwa() = 0;
virtual
void setWysokosc() = 0;
virtual
void setWaga() = 0;
virtual
void setUbarwienie() = 0;
virtual
void setInne() = 0;
~Zwierze(){
delete[]
nazwa;
delete[]
ubarwienie;
}
};
/*Importowanie bibliotek niezbędnych dla
programu. Pierwsza z nich jest potrzebna tylko jeśli program jest pisany w
Visual Studio C++. Biblioteka fstream służy do obsługi strumieni
wejściowych i wyjściowych na plikach.
Klasa BazaDanych jest
abstrakcyjną klasą do zarządzania bazą danych. Umieszczone są w niej metody
wirtualne load() i save(), służące do zapisywania i wczytywania
zawartości bazy do programu.
Klasa Zwierze jest także
abstrakcyjna. Z niej dziedziczą klasy różnych gatunków zwierząt, które
wszystkie łączy to, że (poza tym, że są zwierzętami), mają pewne cechy wspólne.
Są to między innymi: nazwa (imię), wysokość, waga oraz ubarwienie.
Konstruktor zwierzęcia składa się z
tych właśnie wspólnych cech, którymi możemy opisać każde zwierzę. Ponieważ nazwa
jest typu wskaźnikowego, nie można kopiować jej do innej zmiennej w zwykły
sposób przypiasania tak jak zmienne typu całkowitego (integer), lecz nalerzy
użyć bardziej złożonej procedury. W dynamiczny sposób wydzielana jest pamięc
dla nazwy rezerwując dla niej tyle miejsca ile zajmuje nazwa z konstruktora. Za pomocą strlen sprawdzana jest długość nazwy.
Dodany jest jeden znak dodatkowy na wartość null, która powinna być na
końcu każdego char*. Za pomocą dwuargumentowej funkcji strcpy
kopiowana jest zawartość drugiego elementu do pierwszego. Wten sam sposób
odbywa się to z kopiowaniem ubarwienia.
Klasa ta zawiera także 7 metod
wirtualnych, które są zdefiniowane w każdej z klas dziedziczących.
Nazwa oraz ubarwienie
są typu wskaźnikowego i wygenerowana dla nich pamięć jest stale zajmowana,
dlatego konieczny jest tzw. destruktor, który usuwa te zmienne za pomocą słowa
kluczowego delete. Destruktor
wykorzystywany jest w klasie ListaZwierzat w metodzie remove(), która
służy do usuwania zwierząt z Zoo.*/
class Node{
public:
Node* next;
Zwierze* zwierz;
Node(Zwierze* zwierz){
this->zwierz = zwierz;
next
= NULL;
}
void show(){
zwierz->show();
}
void setNazwa(){
zwierz->setNazwa();
}
void setWysokosc(){
zwierz->setWysokosc();
}
void setWaga(){
zwierz->setWaga();
}
void setUbarwienie(){
zwierz->setUbarwienie();
}
void setInne(){
zwierz->setInne();
}
};
class Delfin : public Zwierze{
public:
int
IQ;
Delfin(char*nazwa,
int wysokosc, double
waga, char*ubarwienie,
int IQ):Zwierze(nazwa, wysokosc, waga,
ubarwienie){
this->IQ = IQ;
}
void
show(){
cout << endl
<< "***INFORMACJE O
DELFINIE***" << endl << endl
<<
" Nazwa: " << this->Zwierze::nazwa
<< endl
<< " --> wysokosc:
"
<< this->Zwierze::wysokosc
<< "cm" << endl
<< " --> waga:
"
<< this->Zwierze::waga <<
"kg" << endl
<< " --> ubarwienie: "
<< this->Zwierze::ubarwienie
<< endl
<< " --> iloraz
inteligencji: IQ "
<< IQ
<< endl << endl;
}
void
zamienNaNapis(ostream& out){
out << endl << 1 <<
";"
<< nazwa
<< ";"
<< wysokosc << ";"
<< waga << ";"
<< ubarwienie << ";"
<< IQ;
}
/*Klasa Node (kolejka) jest
czymś w rodzaju kolekcji, która współdziała z klasą ListaZwierząt, będącą
czymś w rodzaju zwykłej listy lub tablicy, w której mieszczą się wszystkie
obiekty zwierzęta.
Dzięki tej klase możemy poruszać się na
liście zwierząt między poszczególnymi jej elementami.
Tworząc nowy obiekt za pomocą
konstruktora Node, zmienna next ustawiana jest na wartość null,
ponieważ gdy będziemy chcieli dodać nowe zwierzę do listy, będziemy musieli
dadać je na koniec listy, czyli w miejsce wartości null.
Ponadto, dzięki klasie Node możemy
dostać się do zdefiniowanych dla każdego zwierzęcia metod typu void, (takich
jak show(), setNazwa(), setUbarwienie() itp.) w kontekście konkretngo
zwierzęcia. Metoda setInne() odnosi się do cechy charakterystycznej,
każdego gatunku, którą wyróżnia się każdy gatunek.
Klasa Delfin oraz pozostałe
klasy z innych gatunków, dziedziczą po abstrakcyjnej klasie Zwierze.
Cechą charakteryzującą dla delfinów
jest ich inteligencja, podawana w skali IQ.
W konstruktorze cztery pierwsze
argumenty przekazywane są do konstruktora Zwierza, po którym dziedziczy Delfin,
a ostatni kopiowany jest do wewnętrznej zmiennej, jaką jest IQ.
Metoda show() zamieszczona jest
w każdej z klas różnych gatunków. Wyświetla ona wszystkie informacje o
zwierzęciu w przejrzysty dla użytkownika sposób. Ponieważ nazwa, wysokość,
waga i ubarwienie należą do klasy zwierze, trzeba odwołać
się do nich za pomocą następującego zwrotu: Zwierze::ubarwienie, poprzedzając
go słówkiem this.
ZamienNaNapis(ostream& out) jest funkcją, zapisującą do strumienia wyjściowego out
informacje o utworzonym zwierzęciu w określonym formacie. Argumentem jest tutaj
plik, który jest strumieniem utworzonym w funkcji save() z klasy ListaZwierzat.
Liczba 1 jest identyfikatorem gatunku. W tym przypadku oznacza ona rodzinę
delfinów.*/
void
setNazwa(){
char
noweImie[100];
cout
<< endl << "Podaj nowe imie dla delfina \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin >> noweImie;
this->Zwierze::nazwa
= new char[strlen(noweImie)
+ 1];
strcpy(this->Zwierze::nazwa, noweImie);
cout << "Imie zostalo zmienione
na \""
<< this->Zwierze::nazwa
<< "\"." << endl;
}
void
setWysokosc(){
int
nowaWys;
cout << endl << "Podaj nowa
wysokosc dla delfina \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin >> nowaWys;
this->Zwierze::wysokosc
= nowaWys;
cout << "Wysokosc zwierzecia
\"" << this->Zwierze::nazwa
<< "\" zostala zmieniona na "
<< this->Zwierze::wysokosc
<< "." << endl;
}
void setWaga(){
double nowaWaga;
cout << endl << "Podaj
nowa wage dla delfina \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin >> nowaWaga;
this->Zwierze::waga
= nowaWaga;
cout << "Waga zwierzecia
\"" << this->Zwierze::nazwa
<< "\" zostala zmieniona na " << this->Zwierze::waga
<< "." << endl;
}
void
setUbarwienie(){
char
noweUb[100];
cout << "\nPodaj nowy kolor
ubarwienia dla delfina \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin >> noweUb;
this->Zwierze::ubarwienie
= new char[strlen(noweUb)+1];
strcpy(this->Zwierze::ubarwienie, noweUb);
cout << "Ubarwienie zwierzecia
\"" << this->Zwierze::nazwa
<< "\" zostalo zmienione na kolor \""
<< this->Zwierze::ubarwienie
<< "\"." << endl;
}
void
setInne(){
int
noweIQ;
cout << "\nPodaj nowy iloraz
inteligencji dla delfina \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin >> noweIQ;
IQ = noweIQ;
cout
<< "Iloraz inteligencji zwierzecia \""
<< this->Zwierze::nazwa
<< "\" zostala zmieniona na "
<< IQ << "."
<< endl;
}
};
/*Za pomocą setNazwa() zmieniamy nazwę zwierzęcia. Odbywa się to w trybie
tekstowym na konsoli. Użytkownik pytany jest o nowe imię na jakie ma być
zmienione stare. Zmienna noweImie
jest typu char. Z góry ograniczona
jest pojemność tej zmiennej przez sto znaków. Dzięki temu zmiennej tej nie
trzeba pamiętać kasować, ponieważ znika ona sama z pamięci po zakączeniu
wykonywania metody.
NoweImie kopiowane jest do nazwy za pomocą strcpy.
Na koniec użytkownik dostaje
potwierdzenie zmiany imienia, poprzez wyświetlenie go na ekran, odwołując się
do nazwy zwierza, na rzecz którego imie zostało zmienione.
Podobnie odbywa się to w metodzie setWysokosc() i setWaga(). Z tą tylko różnicą, że wysokość i waga zwierzęcia jest
zapisana w zmiennej typu int i
nowa wartość przypisywana jest do starej zmiennej za pomocą znaku równości.
W setUbarwienie()
wszystko odbywa się identycznie jak w setNazwa(),
ponieważ ubarwienie jest też typu char.
Metoda setInne() nie różni się wiele od setWysokosc() i setWaga()
opisanych powyżej. Jest to funkcja występująca w każdym ze zwierząt, lecz w
każdym z nich ustawia nowe wartości dla innych zmiennych (opisujących cechy
charakterystyczne każdego ze zwierzęcia).
Tu nie trzeba odwoływać się do zmiennej
opisującą cechę szczególną z klasy zwierze,
poniewzaż tam ona nie występuje. Jest to zmienna powiązana z tą klasą i może być
używana tylko w kontekście tej klasy.*/
class
Kot : public Zwierze {
public:
int dlugoscOgona;
Kot(char* nazwa, int
wysokosc, double waga, char*
ubarwienie,
int dlugoscOgona):Zwierze(nazwa, wysokosc, waga,
ubarwienie){
this->dlugoscOgona = dlugoscOgona;
}
void show(){
cout
<< endl << "***INFORMACJE O KOCIE***" << endl
<< endl
<< " Nazwa: " << this->Zwierze::nazwa << endl
<< " --> wysokosc: "
<< this->Zwierze::wysokosc
<< "cm" << endl
<< " --> waga: "
<< this->Zwierze::waga
<< "kg" << endl
<< " --> ubarwienie: "
<< this->Zwierze::ubarwienie
<< endl
<< " --> dlugosc ogona: "
<< dlugoscOgona <<
"cm" << endl << endl;
}
void zamienNaNapis(ostream& out){
out
<< endl << 2 << ";"
<< nazwa
<< ";"
<< wysokosc << ";"
<< waga << ";"
<< ubarwienie << ";"
<< dlugoscOgona;
}
void setNazwa(){
char noweImie[100];
cout
<< endl << "Podaj nowe imie dla kota \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> noweImie;
this->Zwierze::nazwa = new
char[strlen(noweImie) + 1];
strcpy(this->Zwierze::nazwa, noweImie);
cout
<< "Imie zostalo zmienione na \""
<< this->Zwierze::nazwa
<< "\"." << endl;
}
void setWysokosc(){
int nowaWys;
cout
<< endl << "Podaj nowa wysokosc dla kota \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> nowaWys;
this->Zwierze::wysokosc = nowaWys;
cout
<< "Wysokosc zwierzecia \"" << this->Zwierze::nazwa
<< "\" zostala zmieniona
na "
<< this->Zwierze::wysokosc
<< "." << endl;
}
void
setWaga(){
double
nowaWaga;
cout
<< endl << "Podaj nowa wage dla kota \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> nowaWaga;
this->Zwierze::waga = nowaWaga;
cout
<< "Waga zwierzecia \"" << this->Zwierze::nazwa
<< "\" zostala zmieniona
na " << this->Zwierze::waga
<< "." << endl;
}
/*W tej
klasie oraz w kolejnych pięciu klasach zwierząt,
które nie są krzyżówkami gatunków, wszystko odbywa się analogicznie do klasy Delfin, dlatego też w poszukiwaniu
opisów tej i kolejnych klas odsyłam do komentarzy z klasy poprzedniej.
Cechą
szczególną tej klasy jest długość ogona kota.
Numerem identyfikującym
gatunek jest liczba 2 przydzielana w
metodzie zamienNaNapis(ostream& out).*/
void
setUbarwienie(){
char noweUb[100];
cout
<< endl << "Podaj nowy kolor ubarwienia dla kota \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> noweUb;
this->Zwierze::ubarwienie = new char[strlen(noweUb)
+ 1];
strcpy(this->Zwierze::ubarwienie, noweUb);
cout
<< "Ubarwienie zwierzecia \"" << this->Zwierze::nazwa
<< "\" zostalo zmienione
na kolor \""
<< this->Zwierze::ubarwienie
<< "\"." << endl;
}
void
setInne(){
int nowaDlOgona;
cout
<< endl << "Podaj nowa dlugosc ogona dla delfina \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> nowaDlOgona;
dlugoscOgona
= nowaDlOgona;
cout
<< "Dlugosc ogona zwierzecia \""
<< this->Zwierze::nazwa
<< "\" zostala zmieniona na "
<< dlugoscOgona <<
"cm." << endl;
}
};
class
Bocian : public Zwierze{
public:
int dlugoscDzioba;
Bocian(char*nazwa, int
wysokosc, double waga, char*
ubarwienie,
int
dlugoscDzioba):Zwierze(nazwa,wysokosc,waga,ubarwienie){
this->dlugoscDzioba
= dlugoscDzioba;
}
void show(){
cout
<< "\n***INFORMACJE O BOCIANIE***" << endl << endl
<< " Nazwa: " << this->Zwierze::nazwa << endl
<< " --> wysokosc: "
<< this->Zwierze::wysokosc
<< "cm" << endl
<< " --> waga: "
<< this->Zwierze::waga
<< "kg" << endl
<< " --> ubarwienie: "
<< this->Zwierze::ubarwienie
<< endl
<< " --> dlugosc dzioba: "
<< dlugoscDzioba <<
"cm" << endl << endl;
}
void zamienNaNapis(ostream& out){
out
<< endl << 3 << ";"
<< nazwa << ";"
<< wysokosc << ";"
<< waga << ";"
<< ubarwienie << ";"
<< dlugoscDzioba;
}
void setNazwa(){
char noweImie[100];
cout
<< endl << "Podaj nowe imie dla bociana \""
<< this->Zwierze::nazwa
<< "\"." << endl;
cin
>> noweImie;
this->Zwierze::nazwa = new
char[strlen(noweImie) + 1];
strcpy(this->Zwierze::nazwa, noweImie);
cout
<< endl << "Imie zostalo zmienione na \""
<< this->Zwierze::nazwa
<< "\"." << endl;
}
void
setWysokosc(){
int nowaWys;
cout
<< endl << "Podaj nowa wysokosc dla bociana \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> nowaWys;
this->Zwierze::wysokosc = nowaWys;
cout
<< "Wysokosc zwierzecia \"" << this->Zwierze::nazwa
<< "\" zostala zmieniona
na "
<< this->Zwierze::wysokosc
<< "." << endl;
}
void
setWaga(){
double
nowaWaga;
cout
<< endl << "Podaj nowa wage dla bociana \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> nowaWaga;
this->Zwierze::waga = nowaWaga;
cout
<< "Waga zwierzecia \"" << this->Zwierze::nazwa
<< "\" zostala zmieniona
na " << this->Zwierze::waga
<< "." << endl;
}
void setUbarwienie(){
char noweUb[100];
cout
<< "\nPodaj nowy kolor ubarwienia dla bociana \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> noweUb;
this->Zwierze::ubarwienie = new char[strlen(noweUb)
+ 1];
strcpy(this->Zwierze::ubarwienie, noweUb);
cout
<< "Ubarwienie zwierzecia \"" << this->Zwierze::nazwa
<< "\" zostalo zmienione
na kolor \""
<< this->Zwierze::ubarwienie
<< "\"." << endl;
}
void setInne(){
int nowaDlDzioba;
cout
<< endl << "Podaj nowa dlugosc dzioba dla bociana
\""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> nowaDlDzioba;
dlugoscDzioba
= nowaDlDzioba;
cout
<< "Dlugosc dzioba zwierzecia \""
<< this->Zwierze::nazwa
<< "\" zostala zmieniona na "
<< dlugoscDzioba <<
"cm." << endl;
}
};
class
Zajac : public Zwierze{
public:
int dlugoscUszu;
Zajac(char* nazwa, int
wysokosc, double waga, char*
ubarwienie,
int dlugoscUszu):Zwierze(nazwa,wysokosc,waga,ubarwienie){
this->dlugoscUszu = dlugoscUszu;
}
void show(){
cout
<< endl << "***INFORMACJE O ZAJACU***" << endl
<< endl
<<
" Nazwa: " << this->Zwierze::nazwa
<< endl
<<
" --> wysokosc: "
<<
this->Zwierze::wysokosc <<
"cm" << endl
<<
" --> waga: "
<<
this->Zwierze::waga << "kg"
<< endl
<<
" --> ubarwienie: "
<<
this->Zwierze::ubarwienie << endl
<<
" --> dlugosc uszu: "
<< dlugoscUszu << "cm"
<< endl << endl;
}
void
zamienNaNapis(ostream& out){
out << endl
<< 4 << ";"
<<
nazwa << ";"
<<
wysokosc << ";"
<<
waga << ";"
<<
ubarwienie << ";"
<<
dlugoscUszu;
}
void setNazwa(){
char noweImie[100];
cout
<< endl << "Podaj nowe imie dla zajaca \""
<< this->Zwierze::nazwa
<< "\"." << endl;
cin
>> noweImie;
this->Zwierze::nazwa = new
char[strlen(noweImie) + 1];
strcpy(this->Zwierze::nazwa, noweImie);
cout
<< endl << "Imie zostalo zmienione na \""
<< this->Zwierze::nazwa
<< "\"." << endl;
}
void setWysokosc(){
int nowaWys;
cout
<< endl << "Podaj nowa wysokosc dla zajaca \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> nowaWys;
this->Zwierze::wysokosc = nowaWys;
cout
<< "Wysokosc zwierzecia \"" << this->Zwierze::nazwa
<< "\" zostala zmieniona
na "
<< this->Zwierze::wysokosc
<< "." << endl;
}
void
setWaga(){
double
nowaWaga;
cout
<< endl << "Podaj nowa wage dla zajaca \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> nowaWaga;
this->Zwierze::waga = nowaWaga;
cout
<< "Waga zwierzecia \"" << this->Zwierze::nazwa
<< "\" zostala zmieniona
na " << this->Zwierze::waga
<< "." << endl;
}
void
setUbarwienie(){
char noweUb[100];
cout
<< endl << "Podaj nowy kolor ubarwienia dla zajaca
\""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> noweUb;
this->Zwierze::ubarwienie = new char[strlen(noweUb)
+ 1];
strcpy(this->Zwierze::ubarwienie, noweUb);
cout
<< "Ubarwienie zwierzecia \"" << this->Zwierze::nazwa
<< "\" zostalo zmienione
na kolor \""
<< this->Zwierze::ubarwienie
<< "\"." << endl;
}
void setInne(){
int nowaDlUszu;
cout
<< endl << "Podaj nowa dlugosc uszu dla zajaca \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> nowaDlUszu;
dlugoscUszu
= nowaDlUszu;
cout
<< "Dlugosc uszu zwierzecia \""
<< this->Zwierze::nazwa
<< "\" zostala zmieniona na "
<< dlugoscUszu <<
"cm." << endl;
}
};
class
Ryba : public Zwierze{
public:
int maxZanurzenie;
Ryba(char* nazwa, int
wysokosc, double waga, char*
ubarwienie,
int
maxZanurzenie):Zwierze(nazwa,wysokosc,waga,ubarwienie){
this->maxZanurzenie = maxZanurzenie;
}
void show(){
cout
<< endl << "***INFORMACJE O RYBIE***" << endl
<< endl
<<
" Nazwa: " << this->Zwierze::nazwa
<< endl
<<
" --> wysokosc: "
<<
this->Zwierze::wysokosc <<
"cm" << endl
<<
" --> waga: "
<<
this->Zwierze::waga << "kg"
<< endl
<<
" --> ubarwienie: "
<<
this->Zwierze::ubarwienie << endl
<<
" --> maksymalne zanurzenie:
"
<<
maxZanurzenie << "m" << endl << endl;
}
void zamienNaNapis(ostream& out){
out
<< endl << 5 << ";"
<<
nazwa << ";"
<<
wysokosc << ";"
<<
waga << ";"
<<
ubarwienie << ";"
<<
maxZanurzenie;
}
void setNazwa(){
char noweImie[100];
cout
<< endl << "Podaj nowe imie dla ryby \""
<< this->Zwierze::nazwa
<< "\"." << endl;
cin
>> noweImie;
this->Zwierze::nazwa = new
char[strlen(noweImie) + 1];
strcpy(this->Zwierze::nazwa, noweImie);
cout
<< endl << "Imie zostalo zmienione na \""
<< this->Zwierze::nazwa
<< "\"." << endl;
}
void setWysokosc(){
int nowaWys;
cout
<< endl << "Podaj nowa wysokosc dla ryby \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> nowaWys;
this->Zwierze::wysokosc = nowaWys;
cout
<< "Wysokosc zwierzecia \"" << this->Zwierze::nazwa
<< "\" zostala zmieniona
na "
<< this->Zwierze::wysokosc
<< "." << endl;
}
void
setWaga(){
double
nowaWaga;
cout
<< endl << "Podaj nowa wage dla ryby \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> nowaWaga;
this->Zwierze::waga = nowaWaga;
cout
<< "Waga zwierzecia \"" << this->Zwierze::nazwa
<< "\" zostala zmieniona
na " << this->Zwierze::waga
<< "." << endl;
}
void setUbarwienie(){
char noweUb[100];
cout
<< endl << "Podaj nowy kolor ubarwienia dla ryby \""
<<
this->Zwierze::nazwa <<
"\":" << endl;
cin
>> noweUb;
this->Zwierze::ubarwienie = new char[strlen(noweUb)
+ 1];
strcpy(this->Zwierze::ubarwienie, noweUb);
cout
<< "Ubarwienie zwierzecia \"" << this->Zwierze::nazwa
<< "\" zostalo zmienione
na kolor \""
<< this->Zwierze::ubarwienie
<< "\"." << endl;
}
void setInne(){
int noweMax;
cout
<< "\nPodaj nowe maksymalne zanurzenie dla ryby \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> noweMax;
maxZanurzenie
= noweMax;
cout
<< "Maksymalne zanurzenie zwierzecia \""
<< this->Zwierze::nazwa
<< "\" zostalo zmieniona na "
<< maxZanurzenie <<
"m." << endl;
}
};
class
Slon : public Zwierze{
public:
int glosnosc; //w dB
Slon(char* nazwa, int
wysokosc, double waga, char*
ubarwienie,
int glosnosc):Zwierze(nazwa,
wysokosc, waga, ubarwienie){
this->glosnosc = glosnosc;
}
void
show(){
cout
<< "\n***INFORMACJE O SLONIU***" << endl << endl
<<
" Nazwa: " << this->Zwierze::nazwa
<< endl
<<
" --> wysokosc: "
<<
this->Zwierze::wysokosc <<
"cm" << endl
<<
" --> waga: "
<<
this->Zwierze::waga << "kg"
<< endl
<<
" --> ubarwienie: "
<<
this->Zwierze::ubarwienie << endl
<<
" --> glosnosc trabienia:
" << glosnosc << "dB"
<< endl << endl;
}
void
zamienNaNapis(ostream& out){
out << endl
<< 6 << ";"
<<
nazwa << ";"
<<
wysokosc << ";"
<<
waga << ";"
<<
ubarwienie << ";"
<<
glosnosc;
}
void setNazwa(){
char noweImie[100];
cout
<< endl << "Podaj nowe imie dla slonia \""
<< this->Zwierze::nazwa
<< "\"." << endl;
cin
>> noweImie;
this->Zwierze::nazwa = new
char[strlen(noweImie) + 1];
strcpy(this->Zwierze::nazwa, noweImie);
cout
<< endl << "Imie zostalo zmienione na \""
<< this->Zwierze::nazwa
<< "\"." << endl;
}
void setWysokosc(){
int nowaWys;
cout
<< endl << "Podaj nowa wysokosc dla slonia \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> nowaWys;
this->Zwierze::wysokosc = nowaWys;
cout
<< "Wysokosc zwierzecia \"" << this->Zwierze::nazwa
<< "\" zostala zmieniona
na "
<< this->Zwierze::wysokosc
<< "." << endl;
}
void
setWaga(){
double
nowaWaga;
cout
<< endl << "Podaj nowa wage dla slonia \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> nowaWaga;
this->Zwierze::waga = nowaWaga;
cout
<< "Waga zwierzecia \"" << this->Zwierze::nazwa
<< "\" zostala zmieniona
na " << this->Zwierze::waga
<< "." << endl;
}
void setUbarwienie(){
char noweUb[100];
cout
<< "\nPodaj nowy kolor ubarwienia dla slonia \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> noweUb;
this->Zwierze::ubarwienie = new char[strlen(noweUb)
+ 1];
strcpy(this->Zwierze::ubarwienie, noweUb);
cout
<< "Ubarwienie zwierzecia \"" << this->Zwierze::nazwa
<< "\" zostalo zmienione
na kolor \""
<< this->Zwierze::ubarwienie
<< "\"." << endl;
}
void setInne(){
int nowaGlosnosc;
cout
<< "\nPodaj nowa glosnosc trabienia dla slonia \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> nowaGlosnosc;
glosnosc
= nowaGlosnosc;
cout
<< "Glosnosc trabienia zwierzecia \""
<< this->Zwierze::nazwa
<< "\" zostalo zmieniona na "
<< glosnosc << "dB."
<< endl;
}
};
class
Wielblad : public Zwierze{
public:
int iloscGarbow;
Wielblad(char*nazwa, int
wysokosc, double waga, char*ubarwienie,
int iloscGarbow):Zwierze(nazwa, wysokosc, waga,
ubarwienie){
this->iloscGarbow = iloscGarbow;
}
void
show(){
cout
<< "\n***INFORMACJE O WIELBLADZIE***" << endl <<
endl
<<
" Nazwa: " << this->Zwierze::nazwa
<< endl
<<
" --> wysokosc: "
<<
this->Zwierze::wysokosc <<
"cm" << endl
<<
" --> waga: "
<<
this->Zwierze::waga << "kg"
<< endl
<<
" --> ubarwienie: "
<<
this->Zwierze::ubarwienie << endl
<<
" --> ilosc garbow: "
<<
iloscGarbow << endl << endl;
}
void zamienNaNapis(ostream& out){
out
<< endl << 7 << ";"
<<
nazwa << ";"
<<
wysokosc << ";"
<<
waga << ";"
<<
ubarwienie << ";"
<<
iloscGarbow;
}
void setNazwa(){
char noweImie[100];
cout
<< endl << "Podaj nowe imie dla wielblada \""
<< this->Zwierze::nazwa
<< "\"." << endl;
cin
>> noweImie;
this->Zwierze::nazwa = new
char[strlen(noweImie) + 1];
strcpy(this->Zwierze::nazwa, noweImie);
cout
<< endl << "Imie zostalo zmienione na \""
<< this->Zwierze::nazwa
<< "\"." << endl;
}
void setWysokosc(){
int nowaWys;
cout
<< endl << "Podaj nowa wysokosc dla wielblada \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> nowaWys;
this->Zwierze::wysokosc = nowaWys;
cout
<< "Wysokosc zwierzecia \"" << this->Zwierze::nazwa
<< "\" zostala zmieniona
na "
<< this->Zwierze::wysokosc
<< "." << endl;
}
void
setWaga(){
double
nowaWaga;
cout
<< endl << "Podaj nowa wage dla wielblada \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> nowaWaga;
this->Zwierze::waga = nowaWaga;
cout
<< "Waga zwierzecia \"" << this->Zwierze::nazwa
<< "\" zostala zmieniona
na " << this->Zwierze::waga
<< "." << endl;
}
void setUbarwienie(){
char noweUb[100];
cout
<< "\nPodaj nowy kolor ubarwienia dla wielblada \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> noweUb;
this->Zwierze::ubarwienie = new char[strlen(noweUb)
+ 1];
strcpy(this->Zwierze::ubarwienie, noweUb);
cout
<< "Ubarwienie zwierzecia \"" << this->Zwierze::nazwa
<< "\" zostalo zmienione
na kolor \""
<< this->Zwierze::ubarwienie
<< "\"." << endl;
}
void
setInne(){
int
nowaIloscG;
cout
<< "\nPodaj nowa glosnosc trabienia dla wielblada \""
<< this->Zwierze::nazwa
<< "\":" << endl;
cin
>> nowaIloscG;
iloscGarbow
= nowaIloscG;
cout
<< "Ilosc garbow zwierzecia \""
<< this->Zwierze::nazwa
<< "\" zostalo zmieniona na "
<< iloscGarbow << "." << endl;
}
};
class KotoBocian : public Kot, public
Bocian{
protected:
char* nazwa;
public:
KotoBocian(char* nazwa, int
wysokosc, double waga,
char* kUbarwienie, char*
bUbarwienie,
int dlugoscOgona, int
dlugoscDzioba):
Kot(nazwa,
wysokosc, waga, kUbarwienie, dlugoscOgona),
Bocian(nazwa,wysokosc,waga,bUbarwienie,dlugoscDzioba){
this->nazwa = new char[strlen(nazwa) + 1];
strcpy(this->nazwa, nazwa);
}
KotoBocian(Kot&
k, Bocian& b, char* nazwa):
Kot(k.nazwa,k.wysokosc,k.waga,k.ubarwienie,
k.dlugoscOgona),
Bocian(b.nazwa, b.wysokosc, b.waga,
b.ubarwienie,
b.dlugoscDzioba){
this->nazwa = new char[strlen(nazwa) + 1];
strcpy(this->nazwa,
nazwa);
}
void
show(){
cout
<< "\n***INFORMACJE O KOTO-BOCIANIE***\n" << endl
<<
" Nazwa: " << nazwa << endl
<<
" --> wysokosc: "
<<
(this->Kot::wysokosc+this->Bocian::wysokosc)/2
<< "cm" << endl
<<
" --> waga: "
<< (this->Kot::waga + this->Bocian::waga)/2
<< "kg\n"
<<
" --> ubarwienie: "
<<
this->Kot::ubarwienie << "-"
<<
this->Bocian::ubarwienie << endl
<<
" --> dlugosc ogona: "
<<
this->Kot::dlugoscOgona <<
"cm" << endl
<<
" --> dlugosc dzioba: "
<<
this->Bocian::dlugoscDzioba <<
"cm\n" << endl;
}
void
zamienNaNapis(ostream& out){
out << endl
<< 8 << ";"
<<
nazwa << ";"
<<
(this->Kot::wysokosc + this->Bocian::wysokosc)/2
<< ";" << (this->Kot::waga + this->Bocian::waga)/2
<<
";" << this->Kot::ubarwienie
<< "-"
<<
this->Bocian::ubarwienie <<
";"
<<
dlugoscOgona << ";"
<<
dlugoscDzioba;
}
void setNazwa(){
char noweImie[100];
cout
<< endl << "Podaj nowe imie dla koto-bociana \""
<< nazwa <<
"\"." << endl;
cin
>> noweImie;
this->Kot::nazwa = new
char[strlen(noweImie) + 1];
strcpy(Kot::nazwa,
noweImie);
this->Bocian::nazwa= new
char[strlen(noweImie) + 1];
strcpy(Bocian::nazwa,
noweImie);
nazwa
= noweImie;
cout
<< endl << "Imie zostalo zmienione na \""
<< nazwa <<
"\"." << endl;
}
/*Klasa KotoBocian jest pierwszą z klas, w której na skutek eksperymentów
medycznych powstają tzw. krzyżówki zwierząt.
Klasa ta dziedziczy z klas zwierząt normalnych
(kota i bociana) i zgodnie z prawem wielodziedziczenia, pośrednio z klasy Zwierze.
W każdej z tych trzech klas są po dwa
konstruktory, z któruch jeden daje możliwość krzyżowania mieszkających już w
Zoo zwierząt, a drugi tworzenia zupełnie nowego obirktu podając wszystkie
parametry po kolei.
W ten sposób mamy możliwość stworzenia KotoBociana, przez podanie referencji do obiektów istniejących.
Podobnie jak klasy prostych zwierząt,
klasa ta ma funkcję show(), która
musi byś zdefiniowana, ponieważ jest ona wirtualną metodą w klasie Zwierze, a KotoBocian dziedziczy ze Zwierza,
choć nie bezpośrednio.
W krzyżówkach wysokość oraz waga są
wyliczane jako średnia odu zwierząt z których powstały. Ubarwienie zaś, jest
mieszanką dwuczłonową nazwą koloru (np. srebrno-złoty).
Zmiana poszczególnych parametrów odbywa
się analogicznie do metod z klas zwierząt prostych, jednakże zmiany
przepisywane są do obu podgatunków krzyżówki. */
void setWysokosc(){
int nowaWys;
cout
<< endl << "Podaj nowa wysokosc dla koto-bociana \""
<< nazwa <<
"\":" << endl;
cin
>> nowaWys;
this->Kot::wysokosc = nowaWys;
this->Bocian::wysokosc = nowaWys;
cout
<< "Wysokosc zwierzecia \"" << nazwa
<<"\" zostala zmieniona na
"
<< (this->Kot::wysokosc+this->Bocian::wysokosc)/2
<< "." << endl;
}
void
setWaga(){
double
nowaWaga;
cout
<< endl << "Podaj nowa wage dla koto-bociana \""
<< nazwa <<
"\":" << endl;
cin
>> nowaWaga;
this->Bocian::waga = nowaWaga;
this->Kot::waga = nowaWaga;
cout
<< "Waga zwierzecia \"" << nazwa
<< "\" zostala zmieniona
na "
<< (this->Kot::waga
+ this->Bocian::waga)/2
<< "." << endl;
}
void setUbarwienie(){
char noweUb[100];
cout
<< "\nPodaj nowy kolor ubarwienia dla koto-bociana \""
<< nazwa <<
"\":" << endl;
cin
>> noweUb;
this->Kot::ubarwienie = new
char[strlen(noweUb) + 1];
strcpy(Kot::ubarwienie,
noweUb);
this->Bocian::ubarwienie = new char[strlen(noweUb) + 1];
strcpy(Bocian::ubarwienie,
noweUb);
cout
<< "Ubarwienie zwierzecia \"" << nazwa
<< "\" zostalo zmienione
na kolor \""
<< this->Kot::ubarwienie
<<"-"
<< this->Bocian::ubarwienie
<< "\"." << endl;
}
void
setInne(){
int nowaDlOgona;
int nowaDlDzioba;
cout
<< "\nPodaj nowa dlugosc ogna i "
<< "dzioba dla koto-bociana
\""
<< nazwa <<
"\":" << endl;
cin
>> nowaDlOgona >> nowaDlDzioba;
this->Bocian::dlugoscDzioba = nowaDlDzioba;
this->Kot::dlugoscOgona = nowaDlOgona;
cout
<< "Dlugosc ogona i dzioba zwierzecia \"" << nazwa
<< "\" zostaly zmieniona
na " << dlugoscOgona
<< "cm i " <<
dlugoscDzioba << "cm." << endl;
}
~KotoBocian(){
delete[] nazwa;
}
};
/*Przy zmianie parametrów w śród cech
charakterystycznych wymagane jest podanie obydwu cech, które zostały
odziedziczone po rodzicach, czyli gatunkach macierzystych. W przypadku KotoBociana będzie to długość dzioba
oraz długość ogona.
Destruktor pola char* nazwa. Destruktor
wykorzystywany jest w klasie ListaZwierzat w metodzie remove(), która
służy do usuwania zwierząt z Zoo.*/
class SlonioRyba : public Slon, public
Ryba{
protected:
char*
nazwa;
public:
SlonioRyba(char*
nazwa, int wysokosc, double
waga,
char* sUbarwienie, char*
rUbarwienie,
int glosnosc, int
maxZanurzenie):
Slon(nazwa,
wysokosc, waga, sUbarwienie, glosnosc),
Ryba(nazwa,
wysokosc, waga, rUbarwienie, maxZanurzenie){
this->nazwa = new char[strlen(nazwa) + 1];
strcpy(this->nazwa, nazwa);
}
SlonioRyba(Slon&
s, Ryba& r, char* nazwa):
Slon(s.nazwa,s.wysokosc,s.waga,s.ubarwienie,s.glosnosc),
Ryba(r.nazwa,r.wysokosc,r.waga,r.ubarwienie,r.maxZanurzenie){
this->nazwa = new char[strlen(nazwa) + 1];
strcpy(this->nazwa, nazwa);
}
void
show(){
cout
<< "\n***INFORMACJE O SLONIO-RYBIE***\n" << endl
<<
" Nazwa: " << nazwa << endl
<<
" --> wysokosc: "
<<
(this->Slon::wysokosc+this->Ryba::wysokosc)/2
<< "cm" << endl
<<
" --> waga: "
<< (this->Slon::waga + this->Ryba::waga)/2
<< "kg\n"
<<
" --> ubarwienie: "
<< this->Slon::ubarwienie << "-"
<< this->Ryba::ubarwienie << endl
<<
" --> glosnosc trabienia:
"
<<
this->Slon::glosnosc << "bD"
<< endl
<<
" --> maksymalne zanurzenie:
"
<<
this->Ryba::maxZanurzenie<<
"m" << endl << endl;
}
void zamienNaNapis(ostream& out){
out << endl
<< 9 << ";"
<<
nazwa << ";"
<<
(this->Slon::wysokosc+this->Ryba::wysokosc)/2 << ";"
<< (this->Slon::waga
+ this->Ryba::waga)/2 << ";"
<< this->Slon::ubarwienie <<"-"
<< this->Ryba::ubarwienie << ";"
<<
glosnosc << ";"
<<
maxZanurzenie;
}
void
setNazwa(){
char
noweImie[100];
cout
<< endl << "Podaj nowe imie dla slonio-ryby \""
<<
nazwa << "\"." << endl;
cin
>> noweImie;
Slon::nazwa
= new char[strlen(noweImie)
+ 1];
strcpy(Slon::nazwa,
noweImie);
Ryba::nazwa
= new char[strlen(noweImie)
+ 1];
strcpy(Ryba::nazwa,
noweImie);
nazwa
= noweImie;
cout
<< endl << "Imie zostalo zmienione na \""
<<
nazwa << "\"." << endl;
}
/*W klasie SlonioRyba wszystkie jej składowe zdefiniowane są analogicznie do
klasy KotoBocian.
numerem identyfikującym ten gatunek
jest kod 9.*/
void setWysokosc(){
int nowaWys;
cout
<< endl << "Podaj nowa wysokosc dla slonio-ryby \""
<<
nazwa << "\":" << endl;
cin
>> nowaWys;
this->Slon::wysokosc = nowaWys;
this->Ryba::wysokosc = nowaWys;
cout
<< "Wysokosc zwierzecia \"" << nazwa
<<
"\" zostala zmieniona na "
<<
(this->Slon::wysokosc+this->Ryba::wysokosc)/2
<< "." << endl;
}
void
setWaga(){
double
nowaWaga;
cout
<< endl << "Podaj nowa wage dla slonio-ryby \""
<<
nazwa << "\":" << endl;
cin
>> nowaWaga;
this->Slon::waga = nowaWaga;
this->Ryba::waga = nowaWaga;
cout
<< "Waga zwierzecia \"" << nazwa
<<
"\" zostala zmieniona na "
<< (this->Slon::waga
+ this->Ryba::waga)/2
<<
"kg." << endl;
}
void
setUbarwienie(){
char
noweUb[100];
cout
<< "\nPodaj nowy kolor ubarwienia dla slonio-ryby \""
<< nazwa <<
"\":" << endl;
cin >> noweUb;
this->Slon::ubarwienie
= new char[strlen(noweUb)
+ 1];
strcpy(this->Slon::ubarwienie, noweUb);
this->Ryba::ubarwienie
= new char[strlen(noweUb)
+ 1];
strcpy(this->Ryba::ubarwienie, noweUb);
cout
<< "Ubarwienie zwierzecia \"" << nazwa
<<
"\" zostalo zmienione na kolor \""
<<
this->Slon::ubarwienie <<
"-"
<<
this->Ryba::ubarwienie << "\"."
<< endl;
}
void setInne(){
int nowaGlosnosc;
int noweMaxZanurzenie;
cout
<< "\nPodaj nowa glosnosc i maksymalne zanurzenie"
<<
" dla slonio-ryby \"" << nazwa <<
"\":" << endl;
cin
>> nowaGlosnosc >> noweMaxZanurzenie;
this->Slon::glosnosc = nowaGlosnosc;
this->Ryba::maxZanurzenie = noweMaxZanurzenie;
cout
<< "Glosnosc i maksymalne zanurzenie zwierzecia \""
<<
nazwa << "\" zostaly zmieniona na " << glosnosc
<<
"dB i " << maxZanurzenie << "m." << endl;
}
~SlonioRyba(){
delete[] nazwa;
}
};
class
DelfinoZajac : public Delfin, public Zajac{
protected:
char* nazwa;
public:
DelfinoZajac(char* nazwa, int
wysokosc, double waga,
char* dUbarwienie, char*
zUbarwienie,
int IQ, int
dlugoscUszu): Delfin(nazwa,
wysokosc,
waga, dUbarwienie, IQ), Zajac(nazwa,
wysokosc,
waga, zUbarwienie, dlugoscUszu){
this->nazwa = new char[strlen(nazwa) + 1];
strcpy(this->nazwa, nazwa);
}
DelfinoZajac(Delfin&
d, Zajac& z, char* nazwa):
Delfin(d.nazwa,
d.wysokosc, d.waga, d.ubarwienie, d.IQ),
Zajac(z.nazwa,z.wysokosc,z.waga,z.ubarwienie,z.dlugoscUszu){
this->nazwa = new char[strlen(nazwa) + 1];
strcpy(this->nazwa, nazwa);
}
void
show(){
cout
<< "\n***INFORMACJE O DELFINO-ZAJACU***\n" << endl
<<
" Nazwa: " << nazwa << endl
<<
" --> wysokosc: "
<<
(this->Delfin::wysokosc+this->Zajac::wysokosc)/2
<< "cm" << endl
<<
" --> waga: "
<< (this->Delfin::waga + this->Zajac::waga)/2
<< "kg" << endl
<<
" --> ubarwienie: "
<< this->Delfin::ubarwienie << "-"
<<
this->Zajac::ubarwienie << endl
<<
" --> iloraz inteligencji:
"
<<
this->Delfin::IQ << " IQ "
<< endl
<<
" --> dlugosc uszu: "
<<
this->Zajac::dlugoscUszu<<
"cm" << endl << endl;
}
void
zamienNaNapis(ostream& out){
out << endl
<< 10 << ";"
<<
nazwa << ";"
<<
(this->Delfin::wysokosc + this->Zajac::wysokosc)/2
<< ";" << (this->Delfin::waga + this->Zajac::waga)/2
<<
";" << this->Delfin::ubarwienie
<< "-"
<<
this->Zajac::ubarwienie <<
";"
<<
IQ << ";"
<<
dlugoscUszu;
}
void setNazwa(){
char noweImie[100];
cout
<< endl << "Podaj nowe imie dla delfino-zajaca \""
<< nazwa <<
"\"." << endl;
cin
>> noweImie;
Delfin::nazwa
= new char[strlen(noweImie)
+ 1];
strcpy(Delfin::nazwa,
noweImie);
Zajac::nazwa
= new char[strlen(noweImie)
+ 1];
strcpy(Zajac::nazwa,
noweImie);
nazwa
= noweImie;
cout
<< endl << "Imie zostalo zmienione na \""
<< nazwa <<
"\"." << endl;
}
void setWysokosc(){
int nowaWys;
cout
<< "\nPodaj nowa wysokosc dla delfino-zajaca \""
<<
nazwa << "\":" << endl;
cin
>> nowaWys;
this->Delfin::wysokosc = nowaWys;
this->Zajac::wysokosc = nowaWys;
cout
<< "Wysokosc zwierzecia \"" << nazwa
<<
"\" zostala zmieniona na "
<<
(this->Delfin::wysokosc + this->Zajac::wysokosc)/2
<< "cm." << endl;
}
void
setWaga(){
double
nowaWaga;
cout
<< endl << "Podaj nowa wage dla delfino-zajaca \""
<<
nazwa << "\":" << endl;
cin
>> nowaWaga;
this->Delfin::waga = nowaWaga;
this->Zajac::waga = nowaWaga;
cout
<< "Waga zwierzecia \"" << nazwa
<<
"\" zostala zmieniona na "
<< (this->Delfin::waga
+ this->Zajac::waga)/2
<<
"." << endl;
}
void
setUbarwienie(){
char
noweUb[100];
cout
<< endl << "Podaj nowy kolor ubarwienia "
<<
"dla delfino-zajaca \"" << nazwa <<
"\":" << endl;
cin >> noweUb;
this->Delfin::ubarwienie
= new char[strlen(noweUb)
+ 1];
strcpy(this->Delfin::ubarwienie, noweUb);
this->Zajac::ubarwienie
= new char[strlen(noweUb)
+ 1];
strcpy(this->Zajac::ubarwienie, noweUb);
cout
<< "Ubarwienie zwierzecia \"" << nazwa
<<
"\" zostalo zmienione na kolor \""
<<
this->Delfin::ubarwienie <<
"-"
<<
this->Zajac::ubarwienie
<<
"\"." << endl;
}
void setInne(){
int noweIQ;
int nowaDlUszu;
cout
<< endl << "Podaj nowe IQ i nowa dlugosc uszu "
<<
"dla delfino-zajaca \"" << nazwa <<
"\":" << endl;
cin
>> noweIQ >> nowaDlUszu;
Delfin::IQ
= noweIQ;
Zajac::dlugoscUszu
= nowaDlUszu;
cout
<< "IQ i dlugosc uszu zwierzecia \"" << nazwa
<<
"\" zostaly zmieniona na " << IQ << " IQ "
<<
"i " << dlugoscUszu << "cm." << endl;
}
~DelfinoZajac(){
delete[] nazwa;
}
};
class
ListaZwierzat : public BazaDanych{
private:
Node* head;
int
licznik;
public:
ListaZwierzat(){
head = NULL;
licznik = 0;
}
void
save(){
ofstream
out("dane.txt");
if(!out)
cout << "Error!!!" << endl;
for(int i = 0 ; i
< licznik; i++){
Zwierze*
z = pobierz(i);
z->zamienNaNapis(out);
}
out.close();
}
/*ListaZwierzat to klasa
dziedzicząca z abstrakcyjnej BazyDanych,
której wirtualne funktcje muszą być zdefiniowane tutaj. Są to metoda save() i load().
Prywatną składową jest między innymi
zmienna typu wskaźnikowego klasy Node.
W konstruktorze zmienna head, która wskazywać ma pierwszy element
każdej listy. Na początku, kiedy lista jest tylko tworzona jest jeszcze pusta,
dlatego licznik, który zlicza ilość
zwierząt, ma wartość 0.
W metodzie save() otwierany jest strumień wyjściowy, którym jest plik tekstowy
dane.txt. W przypadku wystąpienia
błędu, czyli nieudanej próbie otwarcia strumienia, wyswietlany jest komunikat o
błądzie. Jeśli wszystko jest w porządku, to w pętli, która wykonuje się tyle
razy, ile wskazuje licznik, czyli tyle razy ile jest zwierząt na liście,
wywoływane jest po kolei każde zwierzę i na rzecz kazdego z nich wywoływana
jest metoda zamienNaNapis(...).
Parametrem tej funkcji jest utworzony wcześniej strumień wyjściowy out. Na koniec, kiedy wszystkie
zwierzęta wysłane są już do pliku i w nim zapisane, strumień jest zamykany.
W funkcji load() otwierany jest z kolei strumień wejściowy in. Odczytuje on zawartość pliku, w
którym wcześniej zostały zapisane informacje o stanie zoo (zawartość bazy
danych).
W pętli while, która wykonuje się aż do momentu, kiedy istnieje strumień
wejściowy, odczytywane są po kolei wszystkie dane. Najpierw kod gatunku, po
którym ignorowany jest jeden znak, ponieważ wszystkie informacje odseparowane
są znakiem ;.
Później, za pomocą trzyparametrowej
funkcji getline(), pobierana jest
nazwa. Pierwszy parametrem jest nazwa zmiennej, do której ma być zapisana
informacja, następnym ilość znaków, a na końcu określony jest symbol, na którym
ma być zakończone odczytywanie jeśli nazwa jest krótsza niż sto znaków.
Później w zależności od kodu zwierzęcia
wczytywane są pozostałe dane. Barwa wczytywana jest także w zależności od
gatunku zwierzęcia, ponieważ barwy krzyżówek są dwuczłonowe.
Na koniec dodawane są zwierzęta do
listy, za pomocą funkcji add(...),
której parametrem jest konstruktor danego zwierzęcia. */
void
load(){
ifstream
in("dane.txt");
if(!in)
cout << "Nie znaleziono pliku!" << endl;
while(in){
//ID gatunku
int kod;
in >> kod;
in.ignore(1);
char
nazwa[100];
in.getline(nazwa, 100, ';');
int wys;
in >> wys;
in.ignore(1);
double
waga;
in >> waga;
in.ignore(1);
char
barwa[100];
//rozpoznanie
zwierzecia
switch(kod){
case 1:
//ubarwienie
in.getline(barwa, 100, ';');
//cecha szczególna
int IQ;
in >> IQ;
add(new
Delfin(nazwa, wys, waga, barwa, IQ));
break;
case 2:
//ubarwienie
in.getline(barwa, 100, ';');
//cecha szczególna
int
dlugoscOgona;
in >> dlugoscOgona;
add(new
Kot(nazwa,wys,waga,barwa,dlugoscOgona));
break;
case 3:
in.getline(barwa, 100, ';');
int
dlugoscDzioba;
in >> dlugoscDzioba;
add(new Bocian(nazwa,
wys, waga,
barwa,dlugoscDzioba));
break;
case 4:
in.getline(barwa, 100, ';');
int
dlugoscUszu;
in >> dlugoscUszu;
add(new
Zajac(nazwa,wys,waga,barwa,dlugoscUszu));
break;
case 5:
in.getline(barwa, 100, ';');
int
maxZanurzenie;
in >> maxZanurzenie;
add(new
Ryba(nazwa,wys,waga,barwa,maxZanurzenie));
break;
case 6:
in.getline(barwa, 100, ';');
int glosnosc;
in >> glosnosc;
add(new
Slon(nazwa, wys, waga, barwa, glosnosc));
break;
case 7:
in.getline(barwa, 100, ';');
int
iloscGarbow;
in >> iloscGarbow;
add(new
Wielblad(nazwa, wys, waga,
barwa,iloscGarbow));
break;
case 8:
char
barwaKota[100];
in.getline(barwaKota, 100, '-');
char
barwaBociana[100];
in.getline(barwaBociana, 100, ';');
int ogon;
in >> ogon;
in.ignore(1);
int dziob;
in >> dziob;
add((Bocian*)(new
KotoBocian(
*(new Kot(nazwa, wys, waga, barwaKota, ogon)),
*(new
Bocian(nazwa, wys, waga,
barwaBociana,
dziob)),
nazwa)));
break;
/*Ponieważ KotoBocian dziedziczy z dwóch klas, kota i bociana, a lista dodaje
obiekty typu zwierze* należy dokonać
zawężenia referencji do jednego typu, kota lub bociana. Pozostałe mieszanki
gatunków dodawane są w analogiczny sposób.*/
case 9:
char
barwaSlonia[100];
in.getline(barwaSlonia, 100, '-');
char barwaRyby[100];
in.getline(barwaRyby, 100, ';');
int glosn;
in >> glosn;
in.ignore(1);
int
maxZan;
in >> maxZan;
add((Slon*)(new
SlonioRyba(
*(new Slon(nazwa, wys, waga, barwaSlonia, glosn)), *(new
Ryba(nazwa,wys,waga,barwaRyby,maxZan)), nazwa)));
break;
case 10:
char
barwaDelfina[100];
in.getline(barwaDelfina, 100, '-');
char
barwaZajaca[100];
in.getline(barwaZajaca, 100, ';');
int iq;
in >> iq;
in.ignore(1);
int dlUszu;
in >> dlUszu;
add((Delfin*)(new
DelfinoZajac(
*(new
Delfin(nazwa,wys,waga,barwaDelfina,iq)),
*(new Zajac(nazwa,wys,waga,barwaZajaca,dlUszu)),
nazwa)));
break;
}
in.ignore(1000,
'\n');
}
}
Zwierze* pobierz(int
index){
Node*
temp = head;
for(int i = 0;i <
index; i++){
if(temp == NULL){
return 0;
}
temp =
temp->next;
}
if(temp
== NULL){
return 0;
}
return
temp->zwierz;
}
void
add(Zwierze* noweZwierze){
if(head
== NULL){
head = new Node(noweZwierze);
}else{
Node* temp =
head;
while(temp->next != NULL){
temp
= temp->next;
}
temp->next
= new Node(noweZwierze);
}
licznik++;
}
/*Metoda pobierz(int index) zwraca adres zwierzącia.
Metoda add(Zwierze* noweZwierze) dodaje na koniec listy nowe zwierzę.
Jeżeli head ma wartość NULL, jej wartość zostaje zmienaina na
nowe zwierze za pomocą wywołania konstruktora Node(...). W przeciwnym wypadku element next, który jest zawsze pusty, zostaje zapisany przez nowe zwierzę.
Pętla while przelatuje najpierw do
ostatniego elementu listy. Licznik wzrasta o jeden.*/
void remove(int index){
if(head
== NULL) return;
//usuwanie pierwszsego elemtnu
if(index == 0){
Node* oldHead = head;
head =
head->next;
delete oldHead;
licznik--;
return;
}
Node* temp =
head->next;
Node* previous = head;
for(int i = 1;i < index; i++){
if(temp == NULL)
return;
previous =
temp;
temp =
temp->next;
}
if(temp
== NULL) return;
previous->next =
temp->next;
delete
temp;
licznik--;
}
int getLicznik(){ return licznik; }
Zwierze* getZwierze(int index){
Node* temp = head;
if(temp
== NULL){
cout
<< "Lista jest pusta!" << endl;
return 0;
}
for(int i = 0;i < index; i++){
if(temp == NULL){
cout
<< "Wyszedles poza liste!" << endl;
return 0;
}
temp =
temp->next;
}
if(temp
== NULL){
cout
<< "Wyszedles poza liste!" << endl;
return 0;
}
temp->zwierz;
temp->show();
return
0;
}
Zwierze* setNazwa(int index){
Node* temp = head;
if(temp
== NULL){
cout
<< "Lista jest pusta!" << endl;
return 0;
}
for(int i = 0;i < index; i++){
if(temp == NULL){
cout
<< "Wyszedles poza liste!" << endl;
return 0;
}
temp =
temp->next;
}
if(temp
== NULL){
cout
<< "Wyszedles poza liste!" << endl;
return 0;
}
temp->zwierz;
temp->setNazwa();
return 0;
}
/*Metoda remove usuwa element z listy o podanym indeksie. Zwierzęta, których
indeksy są większe od podanego jako parametr, przesuwane są o jeden do tyłu, a
licznik maleje o jeden.
getLicznik() zwraca aktualny stan
licznika.
getZwierze() wywołuje metodę show() ze zwierzęcia o podanym indeksie
na liście.
Podobnie jest z kolejnymi metodami,
które zmieniają poszczególne parametry zwierząt.*/
Zwierze* setWysokosc(int index){
Node* temp = head;
if(temp
== NULL){
cout
<< "Lista jest pusta!" << endl;
return 0;
}
for(int i = 0;i < index; i++){
if(temp == NULL){
cout
<< "Wyszedles poza liste!" << endl;
return 0;
}
temp =
temp->next;
}
if(temp
== NULL){
cout
<< "Wyszedles poza liste!" << endl;
return 0;
}
temp->zwierz;
temp->setWysokosc();
return 0;
}
Zwierze* setWaga(int index){
Node* temp = head;
if(temp
== NULL){
cout
<< "Lista jest pusta!" << endl;
return 0;
}
for(int i = 0;i < index; i++){
if(temp == NULL){
cout
<< "Wyszedles poza liste!" << endl;
return 0;
}
temp =
temp->next;
}
if(temp
== NULL){
cout
<< "Wyszedles poza liste!" << endl;
return 0;
}
temp->zwierz;
temp->setWaga();
return
0;
}
Zwierze* setUbarwienie(int index){
Node* temp = head;
if(temp
== NULL){
cout
<< "Lista jest pusta!" << endl;
return 0;
}
for(int i = 0;i < index; i++){
if(temp == NULL){
cout
<< "Wyszedles poza liste!" << endl;
return 0;
}
temp =
temp->next;
}
if(temp
== NULL){
cout
<< "Wyszedles poza liste!" << endl;
return 0;
}
temp->zwierz;
temp->setUbarwienie();
return 0;
}
Zwierze* setInne(int index){
Node* temp = head;
if(temp
== NULL){
cout
<< "Lista jest pusta!" << endl;
return 0;
}
for(int i = 0;i < index; i++){
if(temp == NULL){
cout
<< "Wyszedles poza liste!" << endl;
return 0;
}
temp =
temp->next;
}
if(temp
== NULL){
cout
<< "Wyszedles poza liste!" << endl;
return 0;
}
temp->zwierz;
temp->setInne();
return
0;
}
void
show(){
cout << endl
<< endl << " ------------------" << endl
<< " Zawartosc ZOO: " << endl
<< " ------------------" << endl
<< endl;
Node* temp = head;
while(temp
!= NULL){
temp->show();
temp =
temp->next;
}
}
void
sort(char typ){
//tablica tymczasowa
Zwierze** zwierzaki = new Zwierze*[getLicznik()];
for(int z = 0; z < getLicznik(); z++){
zwierzaki[z] = pobierz(z);
}
int
minindex;
//sortowanie
switch(typ){
case
'A':
for(int i = 0; i < this->getLicznik();
i++){
minindex = i;
for(int j = i; j < this->getLicznik();
j++){
if(strcmp(zwierzaki[i]->nazwa,zwierzaki[j]->nazwa)>0){
minindex = j;
//zamiana
Zwierze* temp = zwierzaki[minindex];
zwierzaki[minindex] = zwierzaki[i];
zwierzaki[i] = temp;
}
}
}
break;
case 'B':
for(int i = 0; i < this->getLicznik();
i++){
minindex =
i;
for(int j = i; j <
this->getLicznik(); j++){
if(zwierzaki[i]->wysokosc
> zwierzaki[j]->wysokosc){
minindex = j; //zamiana
Zwierze* temp = zwierzaki[minindex];
zwierzaki[minindex] = zwierzaki[i];
zwierzaki[i] = temp;
}
}
}
break;
/*Metoda show() wyświetla zawartość całego zoo.
Metoda sort(char typ) sortuje listę według wskazanego pola.
Do tablicy zwierzaki wprowadzane są
adresy wszystkich zwierząt.
Rozpoczyna się sortowanie, w
zalerzności od podanego typu, po nazwach i ubarwieniu (alfabetycznie) oraz
(rosnąco) po wartościach pól waga i wysokosc.
Strcmp porównuje dwie wartości typu char. Wyrażenie to zwraca
wynik większy od zera, gdy pierwsza wartość
jest większa. Jeśli tak jest,
dokonuje się zamiana kolejności poszczególnych elementów, sortując je.
Przy porównywaniu wysokości i wagi nie
używamy strcmp, lecz zwykłago znaku porównania.*/
case 'C':
for(int i = 0; i <
this->getLicznik(); i++){
minindex = i;
for(int j = i; j < this->getLicznik();
j++){
if(zwierzaki[i]->waga >
zwierzaki[j]->waga){
minindex
= j; //zamiana
Zwierze*
temp = zwierzaki[minindex];
zwierzaki[minindex]
= zwierzaki[i];
zwierzaki[i]
= temp;
}
}
}
break;
case 'D':
for(int i = 0; i <
this->getLicznik(); i++){
minindex = i;
for(int j = i; j < this->getLicznik();
j++){
if(strcmp(zwierzaki[i]->ubarwienie,
zwierzaki[j]->ubarwienie)>0){
minindex
= j;
//zamiana
Zwierze*
temp = zwierzaki[minindex];
zwierzaki[minindex]
= zwierzaki[i];
zwierzaki[i]
= temp;
}
}
}
break;
}
//wyswietlenie
listy:
for(int zz = 0; zz < getLicznik(); zz++){
zwierzaki[zz]->show();
}
}
};
//stworzenie listy dla
zwierząt:
ListaZwierzat lista;
int
showMenu(){
//menu:
system("cls");
cout
<< "\n\n >>> M
E N U
<<< \n" << endl;
cout
<< "1: Pokaz zawartosc calego ZOO" << endl;
cout
<< "2: Pokaz wszystko o zwierzeciu..." << endl;
cout
<< "3: Zmien parametry zwierzecia..." << endl;
cout
<< "4: Wyswietl posortowana liste zwierzat..." <<
endl;
cout
<< "5: Wprowadz nowe zwierze..." << endl;
cout << "6: Usun
zwierze..." << endl;
cout <<
"7: Odczytaj baze danych" << endl;
cout
<< "8: Zachowaj baze danych" << endl;
cout << "9: SAVE & EXIT"
<< endl;
cout << "10: EXIT\n" <<
endl;
int
wybor;
cout
<< "Wybieram opcje: ";
cin
>> wybor;
if(!cin){
cout
<< "ERROR!!! --> Nieprawidlowa liczba" << endl;
cin.clear();
cin.ignore(1000, '\n');
system("pause");
return 1; //Powrót do menu
głównego
}
/*W showMenu() wyświetlane jest
menu. W funkcji main odwołanie do niego jest zapętlone aż do momentu, w
którym nie zostanie zwrócona wartość 0.
Wybierać można z menu różne funkcje,
podając liczby.
W przypadku podania znaku zamiast
liczby wyświetla się komunikat o błędzie.*/
if (wybor < 1 || wybor > 10){
//Powrót do menu głównego
return 1;
}
switch(wybor){
case 1: //Zawartość
całego zoo:
lista.show();
break;
case 2: //Info
o zwierzęciu:
system("cls");
int z;
cout
<< "\nPadaj numer zwierzecia, na temat ktorego "
<< "chcesz uzyskac informacje:
";
cin
>> z;
if (z<0){
//Powrót
do menu głównego
return 1;
}
lista.getZwierze(z);
break;
case 3: //Zmiana
parametrów:
system("cls");
cout
<< "\nJaki parametr zamierzasz zmienic?:" << endl;
cout << "A: nazwe "
<< endl;
cout << "B:
wysokosc " << endl;
cout << "C:
wage " << endl;
cout << "D:
ubarwienie " << endl;
cout << "E:
ceche szczegolna " << endl;
cout << "F:
powrot do menu glownego " << endl;
cout << "G:
SAVE && EXIT\n" << endl;
char x;
cout
<< "Wybieram opcje: ";
cin >> x;
if
(x!='A' && x!='B' && x!='C' && x!='D' && x!='E'
&& x!='F' || x =='G'){
//Powrót do menu głównego
return 1;
}
int
y;
if
(x != 'F'){
cout <<
"\nPadaj numer zwierzecia, ktorego "
<< "parametr chcesz zmienic:
";
cin >> y;
}
switch(x){
case 'A':
lista.setNazwa(y);
break;
case 'B':
lista.setWysokosc(y);
break;
case 'C':
lista.setWaga(y);
break;
case 'D':
lista.setUbarwienie(y);
break;
case 'E':
lista.setInne(y);
break;
case 'F':
break;
}
break;
/*Jeśli użytkownik wybierze liczbę
spoza menu, następuje powrót do menu.
Wybór pierwszej opcji wywołuję metodę show()
na rzecz listy.
Delej wykonują się funkcje w
zalerzności od życzeń użytkownika.*/
case 4: //Sortowanie:
system("cls");
cout <<
"\nSortuj wedlug:" << endl;
cout
<< "A: nazwy (alfabetycznie)" << endl;
cout
<< "B: wysokosci (rosnaco)" << endl;
cout << "C: wagi
(rosnaco)" << endl;
cout
<< "D: ubarwienia (alfabetycznie)" << endl;
cout
<< "E: powrot do menu glownego " << endl;
cout << "F: SAVE &&
EXIT\n" << endl;
char s;
cout
<< "Wybieram opcje: ";
cin >> s;
if
(s!='A' && s!='B' && s!='C' && s!='D' && s!='E'
|| s=='F'){
//Powrót do menu głównego
return 1;
}
switch(s){
case 'A':
//Nazwa
lista.sort('A');
break;
case 'B':
//Wysokosc
lista.sort('B');
break;
case 'C':
//Waga
lista.sort('C');
break;
case 'D':
//Ubarwienie
lista.sort('D');
break;
case 'E':
break;
}
break;
case
5: //Nowy obiekt:
system("cls");
cout
<< "\nWybierz gatynek zwierzecia do wprowadzenia:" <<
endl;
cout << "A: delfin"
<< endl;
cout << "B:
bocian" << endl;
cout << "C:
kot" << endl;
cout << "D:
ryba" << endl;
cout << "E:
slon" << endl;
cout << "F:
wielblad" << endl;
cout << "G:
zajac" << endl;
cout << "H:
koto-bocian" << endl;
cout << "I:
slonio-ryba" << endl;
cout << "J:
delfino-zajac" << endl;
cout << "K:
powrot do menu glownego " << endl;
cout << "L:
SAVE && EXIT\n" << endl;
char g;
cout
<< "Wybieram opcje: ";
cin
>> g;
if (g!='A' && g!='B' && g!='C'
&& g!='D' && g!='E' && g!='F' && g!='G'
&& g!='H' && g!='I' && g!='J' && g!='K' ||
g=='L'){
//Powrót
do menu głównego
return 1;
}
char nazwa[100];
int wysokosc;
double waga;
char ubarwienie[100];
char ubarwienie2[100];
int cecha;
int cecha2;
switch(g){
case 'A':
cout <<
"Podaj nazwe (imie) dla nowego delfina: ";
cin >> nazwa;
cout << "\nwysokosc (cm):
";
cin >> wysokosc;
cout << "\nwage (kg): ";
cin >>
waga;
cout << "\nubarwienie: ";
cin >> ubarwienie;
cout << "\niloraz inteligencji
(IQ): ";
cin >> cecha;
lista.add(new
Delfin(nazwa, wysokosc, waga,
ubarwienie, cecha));
cout << "\nZwierze zostalo
dodane!" << endl;
lista.getZwierze(lista.getLicznik()-1);
break;
case 'B':
cout << "Podaj nazwe (imie) dla
nowego bociana: ";
cin >> nazwa;
cout << "\nwysokosc (cm):
";
cin >> wysokosc;
cout << "\nwage (kg): ";
cin >>
waga;
cout << "\nubarwienie: ";
cin >> ubarwienie;
cout << "\ndlugosc dzioba (cm):
";
cin >> cecha;
lista.add(new
Bocian(nazwa, wysokosc, waga,
ubarwienie, cecha));
cout << "\nZwierze zostalo
dodane!" << endl;
lista.getZwierze(lista.getLicznik()-1);
break;
case 'C':
cout << "Podaj nazwe (imie) dla
nowego kota: ";
cin >> nazwa;
cout << "\nwysokosc (cm):
";
cin >> wysokosc;
cout << "\nwage (kg): ";
cin >>
waga;
cout << "\nubarwienie: ";
cin >> ubarwienie;
cout << "\ndlugosc ogona (cm):
";
cin >> cecha;
lista.add(new
Kot(nazwa, wysokosc, waga, ubarwienie,
cecha));
cout << "\nZwierze zostalo
dodane!" << endl;
lista.getZwierze(lista.getLicznik()-1);
break;
case 'D':
cout << "Podaj nazwe (imie) dla
nowej ryby: ";
cin >> nazwa;
cout << "\nwysokosc (cm):
";
cin >> wysokosc;
cout <<
"\nwage (kg): ";
cin >>
waga;
cout << "\nubarwienie: ";
cin >> ubarwienie;
cout << "\nmaksymalne
zanurzenie(m): ";
cin >> cecha;
lista.add(new
Ryba(nazwa, wysokosc, waga, ubarwienie,
cecha));
cout << "\nZwierze zostalo
dodane!" << endl;
lista.getZwierze(lista.getLicznik()-1);
break;
case 'E':
cout << "Podaj nazwe (imie) dla
nowego slonia: ";
cin >> nazwa;
cout << "\nwysokosc (cm):
";
cin >> wysokosc;
cout << "\nwage (kg): ";
cin >>
waga;
cout << "\nubarwienie: ";
cin >> ubarwienie;
cout << "\nglosnosc
trabienia(dB): ";
cin >> cecha;
lista.add(new
Slon(nazwa, wysokosc, waga, ubarwienie, cecha));
cout << "\nZwierze zostalo
dodane!" << endl;
lista.getZwierze(lista.getLicznik()-1);
break;
case 'F':
cout << "Podaj nazwe (imie) dla
nowego wielblada:";
cin >> nazwa;
cout << "\nwysokosc (cm):
";
cin >> wysokosc;
cout << "\nwage (kg): ";
cin >>
waga;
cout << "\nubarwienie: ";
cin >> ubarwienie;
cout << "\nilosc garbow: ";
cin >> cecha;
lista.add(new Wielblad(nazwa, wysokosc, waga, ubarwienie,
cecha));
cout << "\nZwierze zostalo
dodane!" << endl;
lista.getZwierze(lista.getLicznik()-1);
break;
case 'G':
cout << "Podaj nazwe (imie) dla
nowego zajaca: ";
cin >> nazwa;
cout << "\nwysokosc (cm):
";
cin >> wysokosc;
cout << "\nwage (kg): ";
cin >>
waga;
cout << "\nubarwienie: ";
cin >> ubarwienie;
cout << "\ndlugosc uszu (cm):
";
cin >> cecha;
lista.add(new
Zajac(nazwa, wysokosc, waga, ubarwienie, cecha));
cout << "\nZwierze zostalo
dodane!" << endl;
lista.getZwierze(lista.getLicznik()-1);
break;
case 'H':
cout << "Podaj nazwe (imie) dla
nowego koto-bociana: ";
cin >> nazwa;
cout << "\nwysokosc (cm):
";
cin >> wysokosc;
cout << "\nwage (kg): ";
cin >>
waga;
cout << "\nubarwienie kota:
";
cin >> ubarwienie;
cout << "\nubarwienie bociana:
";
cin >> ubarwienie2;
cout << "\ndlugosc ogona (cm):
";
cin >> cecha;
cout << "\ndlugosc dzioba (cm):
";
cin >> cecha2;
lista.add((Kot*)(new
KotoBocian(nazwa, wysokosc, waga, ubarwienie, ubarwienie2, cecha, cecha2)));
cout << "\nZwierze zostalo
dodane!" << endl;
lista.getZwierze(lista.getLicznik()-1);
break;
case 'I':
cout <<"Podaj nazwe (imie) dla
nowej slonio-ryby:";
cin >> nazwa;
cout << "\nwysokosc (cm):
";
cin >> wysokosc;
cout << "\nwage (kg): ";
cin >> waga;
cout <<
"\nubarwienie slonia: ";
cin >> ubarwienie;
cout << "\nubarwienie rybu:
";
cin >> ubarwienie2;
cout << "\nglosnosc trabienia
(dB): ";
cin >> cecha;
cout << "\nmaksymalne zanurzenie (m): ";
cin >> cecha2;
lista.add((Slon*)(new
SlonioRyba(nazwa, wysokosc, waga, ubarwienie, ubarwienie2, cecha, cecha2)));
cout << "\nZwierze zostalo
dodane!" << endl;
lista.getZwierze(lista.getLicznik()-1);
break;
case 'J':
cout << "Podaj nazwe (imie) dla
nowego delfino-zajaca:";
cin >> nazwa;
cout << "\nwysokosc (cm):
";
cin >> wysokosc;
cout << "\nwage (kg): ";
cin >>
waga;
cout << "\nubarwienie delfina:
";
cin >> ubarwienie;
cout << "\nubarwienie zajaca:
";
cin >> ubarwienie2;
cout << "\niloraz inteligencji
(IQ): ";
cin >> cecha;
cout << "\ndlugosc uszu (cm):
";
cin
>> cecha2;
lista.add((Delfin*)(new DelfinoZajac(nazwa, wysokosc, waga, ubarwienie,
ubarwienie2, cecha, cecha2)));
cout << "\nZwierze zostalo
dodane!" << endl;
lista.getZwierze(lista.getLicznik()-1);
break;
case 'K':
break;
}
break;
case 6: //Usuwanie
obiektu:
system("cls");
int ind;
cout
<< "\nPodaj numer zwierzecia, ktore chcesz usunac\n"
<< "lub wpisz \"-1\"
aby powrocic do menu glownego: " << endl;
cin >>
if (
lista.remove(ind);
break;
case 7: //Ładowanie
listy:
system("cls");
lista.load();
cout
<< "\nBaza danych zostala zaladowana.\n" << endl;
break;
case 8: //Zachowanie
listy:
system("cls");
lista.save();
cout
<< "Lista zostala zachowana!" << endl;
break;
case
9: //Zachowanie listy i wyjście:
lista.save();
return
0;
case 10:
return
0;
}
system("pause");
return
1;
}
int main() {
//intro:
int ooo = 0;
while(ooo<35){
system("cls");
ooo++;
}
ooo = 0;
while(ooo<30){
cout << "\n\n\n\n\n\n"
<< "\n
ZZZZZZZZZZZZZZZZZZZZZZ
OOOOOO
OOOOOO "
<< "\n
ZZZZZZZZZZZZZZZZZZZZZZ
OOOOOOOOOOOO
OOOOOOOOOOOO "
<< "\n
ZZZZZZZZZZZZZZZZZZZZZZ OOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOO "
<< "\n ZZZZZZ OOOOOO OOOOOO OOOOOO OOOOOO
"
<< "\n ZZZZZZ OOOOOO OOOOOO OOOOOO OOOOOO "
<< "\n ZZZZZZ OOOOOO OOOOOO OOOOOO OOOOOO "
<< "\n ZZZZZZ OOOOOO OOOOOO OOOOOO OOOOOO "
<< "\n ZZZZZZ OOOOOO OOOOOO OOOOOO OOOOOO "
<< "\n ZZZZZZ OOOOOO OOOOOO OOOOOO OOOOOO "
<< "\n ZZZZZZ OOOOOO OOOOOO OOOOOO OOOOOO "
<< "\n ZZZZZZ OOOOOO OOOOOO OOOOOO OOOOOO "
<< "\n ZZZZZZ OOOOOO OOOOOO OOOOOO OOOOOO "
<< "\n ZZZZZZ OOOOOO OOOOOO OOOOOO OOOOOO "
<< "\n ZZZZZZ OOOOOO OOOOOO OOOOOO OOOOOO "
<< "\n ZZZZZZ OOOOOO OOOOOO OOOOOO OOOOOO "
<< "\n ZZZZZZ OOOOOO OOOOOO
OOOOOO OOOOOO "
<< "\n ZZZZZZ OOOOOO OOOOOO OOOOOO OOOOOO "
<< "\n ZZZZZZ OOOOOOO OOOOOO OOOOOOO OOOOOO "
<< "\n ZZZZZZZZZZZZZZZZZZZZZZ OOOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOO "
<< "\n
ZZZZZZZZZZZZZZZZZZZZZZ
OOOOOOOOOOOOOO
OOOOOOOOOOOOOO "
<< "\n
ZZZZZZZZZZZZZZZZZZZZZZ
OOOOOOOO OOOOOOOO ";
system("cls");
ooo++;
}
ooo = 0;
while(ooo<60){
system("cls");
ooo++;
}
//menu:
while(showMenu());
return
0;
}
/*Funkcja main() zaczyna swoje wukonywanie od tzw. intro, które wyświetla na
ekranie kilka sekund duży napis zoo.
Póżniej uruchamiane jest menu programu.
Funkcja showMenu() została zapętlona
do momentu zwrócenia przez nią wartości 0.
Jeśli natomiast użytkownik poda złą liczbę lub znak w menu, zwracana jest
wartość 1 przez co następuje powrót
do głównego menu.*/