*quetz: "poprzedni" watek: http:*4programmers.net/Forum/viewtopic.php?id=137312
Nikt mi nie odpisuje w starym temacie gdzie dołączyłem nowy program, więc zrobiłem osobny temat bo bardzo potrzebuję szybkiej pomocy w znalezieniu błędów, ewentualnie podpowiedzi, bo może jest jakiś lepszy sposób napisania tego. Poniżej to co udało mi się zrobić oraz treść zadania.
#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;
class RailVehicle
{
protected:
int speed, mass;
RailVehicle* RearVehicle;
RailVehicle* FrontVehicle;
public:
RailVehicle()
{
speed=0;
mass=0;
RearVehicle=NULL;
FrontVehicle=NULL;
}
RailVehicle* ConnectToFrontVehicle(RailVehicle* FrontWsk)
{
if (FrontWsk == NULL)
{
this->FrontVehicle->RearVehicle=NULL;
this->FrontVehicle=NULL;
}
else if (this=&engine)
{
cout<<"Lokomotywa moze byc tylko z przodu pociagu."<<endl;
return NULL;
}
else if ((this->FrontVehicle=NULL)&&(this->FrontVehicle->RearVehicle=NULL))
{
this->FrontVehicle=FrontWsk;
this->FrontVehicle->RearVehicle=this;
return FrontWsk;
}
else
{
cout<<"Nie mozna polaczyc tych wagonow."<<endl;
return NULL;
}
}
virtual int GetSpeed() const
{
return speed;
}
int GetMassAll() const
{
int m;
RailVehicle* wsk;
wsk= &engine;
do
{
wsk->GetMassThis()=m;
mass += m;
wsk = wsk->RearVehicle;
}
while (this->RearVehicle!=NULL)
return mass;
}
void ShowAll(ostream& o) const
{
o<<"Predkosc pociagu: "<<GetSpeed()<<endl;
RailVehicle* wsk;
wsk= &engine;
do
{
wsk->ShowThis(o);
wsk = wsk->RearVehicle;
}
while (this->RearVehicle!=NULL);
}
~ RailVehicle()
{
this->RearVehicle->ConnectToFrontVehicle(NULL);
this->ConnectToFrontVehicle(NULL);
}
};
class Engine : public RailVehicle
{
private:
int engineMass;
public:
Engine (int engineMass, int speed)
{
this->engineMass = engineMass;
engineMass=0;
this->speed = speed;
}
int ChangeSpeed(int value)
{
speed = value;
}
virtual int GetMassThis() const
{
return this->engineMass;
}
virtual void ShowThis(ostream& o) const
{
o<<"Lokomotywa o masie: "<<GetMassThis()<<endl;
}
};
class FreightCar : public RailVehicle
{
private:
int freightCarMass;
public:
FreightCar (int freightCarMass)
{
this->freightCarMass = freightCarMass;
freightCarMass=0;
}
int AddFreight(int value)
{
if(speed=0)
this->freightCarMass += value;
else
cout<<"Nie można wykonać załadunku w trakcie jazdy!"<<endl;
}
int RemoveFreight(int value)
{
if(speed=0)
this->freightCarMass -= value;
else
cout<<"Nie można wykonać rozładunku w trakcie jazdy!"<<endl;
}
virtual int GetMassThis() const
{
return this->freightCarMass;
}
virtual void ShowThis(ostream& o) const
{
o << "Wagon towarowy o masie: "<<GetMassThis()<<endl;
}
};
int main()
{
cout<<"Stworzymy 3 obiekty: lokomotywe oraz 2 wagony towarowe, a nastepnie polaczymy je."<<endl;
Engine lokomotywa(10,10);
FreightCar wagon1(5);
FreightCar wagon2(5);
wagon1.ConnectToFrontVehicle(lokomotywa);
wagon2.ConnectToFrontVehicle(wagon1);
cout<<"Informacje o wagonie nr 1:"<<endl<<endl;
wagon1.ShowThis(cout);
system("Pause");
cout<<endl<<"Informacje o calym pociagu"<<endl<<endl;
ShowAll(cout);
system("Pause");
cout<<"Dokonamy zaladunku wagonu nr 2, a nastepnie zmienimy predkosc lokomotywy"<<endl<<endl;
wagon2.AddFreight(20);
lokomotywa.ChangeSpeed(100);
cout<<endl<<"Informacje o calym pociagu"<<endl<<endl;
ShowAll(cout);
system("Pause");
cout<<"Odlaczymy wagon nr 2 od pociagu."<<endl<<endl;
wagon2.ConnectToFrontVehicle(NULL);
cout<<endl<<"Informacje o calym pociagu"<<endl<<endl;
ShowAll(cout);
system("Pause");
return 0;
}
Cel:
Symulacja pociągów, zabawa z łączeniem wagonów i lokomotyw, ładowaniem towarów do
wagonów i zmiana prędkości pociągów.Na ocenę 3:
Opracować szkielet systemu w oparciu o poniższe klasy i funkcje.RailVehicle -- abstrakcyjna klasa bazowa dla wszystkich pojazdów szynowych. Umożliwia
łączenie pojazdów. Umożliwia wyświetlanie stanu i zawartości pojazdów. Funkcje:
RailVehicle* ConnectToNext(RailVehicle* nextPtr)
virtual int GetSpeed() const;
virtual void ShowThis(ostream& o) const = 0;
void ShowAll(ostream& o) const;Engine - lokomotywa. Umożliwia zmianę prędkości pociągu. Dziedziczy po RailVehicle. Ma
maksymalną prędkość. Funkcje:
int ChangeSpeed(int value)FreightCar - wagon towarowy. Dziedziczy po RailVehicle.
Zasady łączenia pojazdów:
Pojazdy można połączyć jeśli z danej strony nie są do niczego podłączone. Do łączenia służy jedna
funkcja, podłączająca pojazd do następnego w szeregu. Aby połączyć pojazdy, należy podać
wskaźnik do następnego pojazdu. Aby rozłączyć pojazdy, należy podać NULL. W przypadku
pomyślnej operacji funkcja zwraca wskaźnik do dołączanego pojazdu, w przeciwnym wypadku
rzuca wyjątek. Zniszczenie pojazdu powoduje odłączenie go od sąsiadów. Lokomotywę można
dołączyć tylko na początku pociągu. Do lokomotywy nie można dołączyć innej lokomotywy.
Zasady zwracania prędkości pociągu:
Każdy pojazd można zapytać o prędkość pociągu. Używając wskaźników do poprzedniego pojazdu
dochodzi on do czoła pociągu i jeśli jest tam lokomotywa, zwraca jej prędkość
Inna funkcjonalność:
Funkcje ShowThis i ShowAll mają odpowiednio wyprowadzać do strumienia informację o
pojedynczym pojeździe i całym pociągu.
Zagadka:
Co będzie jeśli w destruktorze RailVehicle wywołana zostanie funkcja wirtualna, np.
GetSpeed w celu sprawdzenia czy pociąg stoi?Na ocenę 4:
Umożliwić ładowanie i rozładowywanie towarów. Dodać do klasy FreightCar funkcje:
int AddFreight(int mass)
int RemoveFreight(int mass)Zasady załadunku i rozładunku:
Można przeprowadzać tylko gdy pociąg stoi. Załadowanie powoduje dodanie masy ładunku do
masy danego wagonu. Zdjęcie ładunku odejmuje masę ładunku od masy wagonu.
Inna funkcjonalność:
Funkcje ShowThis i ShowAll mają zostać uzupełnione o wyprowadzanie do strumienia
odpowiednio informacji o masie ładunków w pojedynczym pojeździe i w całym pociągu.Na ocenę 5:
Uwzględnić masę pociągu w wyznaczaniu jego prędkości. Uzupełnić klasę RailVehicle o
funkcje:
int GetMassAll() const;
virtual int GetMassThis() const = 0;Zasady zwracania masy danego pojazdu:
Dla wagonu masa jest sumą stałej masy wagonu (przekazywanej w konstruktorze) i masy towarów.
Dla lokomotywy jest jej stałą masa (przekazywaną w konstruktorze).
Zasady zwracania masy pociągu:
Każdy pojazd można zapytać o masę całego pociągu. Używając wskaźników do poprzedniego i
następnego pojazdu sumuje on masy pojazdów i zwraca te sumę.
Zasady zmiany prędkości pociągu:
W konstruktorze lokomotywy przekazywane są jej maksymalna prędkość bez obciążenia.
Maksymalna prędkość pociągu jest ustalana na podstawie maksymalnej prędkości lokomotywy oraz
masy pociągu. Dla zerowej masy całkowitej pociągu prędkość maksymalna równa jest
maksymalnej prędkości lokomotywy, każda tona masy to spadek prędkości maksymalnej o 1km/h.
(uwaga: pociąg nigdy nie będzie jechał z maksymalną prędkością lokomotywy, bo sama
lokomotywa ma już pewną masę).