You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
6.1 KiB
213 lines
6.1 KiB
#include "train.hpp"
|
|
#include "wagon.hpp" // nécessaire pour connaitre tout (seulement ce qui est public) ce qui compose un wagon
|
|
#include "passager.hpp"
|
|
|
|
|
|
using namespace std;
|
|
|
|
Train::Train(int nbWagons)
|
|
: roule{false} ////////////// comme ça !!!
|
|
{
|
|
for (int i = 1; i <= nbWagons; ++i) {
|
|
lesWagons.push_back(Wagon{i});
|
|
}
|
|
}
|
|
|
|
void Train::demarrer() {
|
|
roule = true;
|
|
}
|
|
|
|
void Train::arreter() {
|
|
roule = false;
|
|
}
|
|
|
|
bool Train::isRoule() const {
|
|
return roule;
|
|
}
|
|
|
|
int Train::monterDansLeTrain(int numeroWagon, Passager& lePassager) {
|
|
if (roule) {
|
|
return -1;
|
|
}
|
|
if (numeroWagon < 1 || numeroWagon > (int)lesWagons.size()) {
|
|
return -2;
|
|
}
|
|
|
|
////// if (lesWagons[numeroWagon - 1].ajouter(lePassager) == -1) { //// non
|
|
Wagon& w = lesWagons.at(numeroWagon-1);
|
|
if (w.ajouter(lePassager) == 0) { ///// c'est comme ça vu le code de ajouter dans wagon !!!
|
|
return -3;
|
|
}
|
|
lePassager.wagonActuel = & w; //// sans oublier cette ligne !!!
|
|
|
|
return 0;
|
|
}
|
|
|
|
int Train::descendreDuTrain(Passager &lePassager) {
|
|
if (roule) {
|
|
return -1;
|
|
}
|
|
|
|
/////////////////// NON pas comme ça, ne veut rien dire
|
|
/*
|
|
if (lePassager.getWagonActuel().getNumero() < 1 || lePassager.getWagonActuel().getNumero() > lesWagons.size()) {
|
|
return -2;
|
|
}
|
|
*/
|
|
Wagon* w = lePassager.getWagonActuel(); ////// comme ça
|
|
if(w==nullptr) return -2;
|
|
|
|
if (w->enlever(lePassager) == 0) {
|
|
return -3;
|
|
}
|
|
lePassager.wagonActuel=nullptr; /////// et on n'oublie pas cette ligne !!!!
|
|
return 0;
|
|
}
|
|
/*
|
|
int Train::deplacerAuWagonSuivant(Passager &lePassager) {
|
|
if (lePassager.getWagonActuel().getNumero() < 1 || lePassager.getWagonActuel().getNumero() > lesWagons.size()) {
|
|
return -1;
|
|
}
|
|
if (lePassager.getWagonActuel().getNumero() == lesWagons.size()) {
|
|
return -2;
|
|
}
|
|
// if (lePassager.getWagonActuel().enlever(lePassager) == -1) { Pas besoins si on l'ajout après ???!!!
|
|
// return -4;
|
|
// }
|
|
if (lesWagons[lePassager.getWagonActuel().getNumero()].ajouter(lePassager) == -1) {
|
|
return -3;
|
|
}
|
|
return 0;
|
|
}
|
|
*/
|
|
|
|
///// pour cette fonction on peut faire ainsi :
|
|
int Train::deplacerAuWagonSuivant(Passager &lePassager) {
|
|
Wagon* w = lePassager.getWagonActuel(); ///// comme ça on va éviter de faire plusieurs fois le même appel
|
|
|
|
if(w==nullptr){
|
|
return -1 ; //n'a pas de wagon => pas dans le train
|
|
}
|
|
|
|
unsigned int num = w->getNumero(); //! unsigned permet d'avoir que des nombres positifs !
|
|
if(num == lesWagons.size()) return -2;
|
|
|
|
// on tente de faire passer le passager au wagon suivant (num+1) qui est dans la case num
|
|
int fait = lesWagons[num].ajouter(lePassager);
|
|
if(fait == 0) return-3; // il n'y avait plus de place
|
|
|
|
// il ne nous reste plus qu'à l'enlever du wagon num
|
|
lesWagons[num-1].enlever(lePassager); //! une fois ajouter dans le prochain wagon, ne pas oublier de l'enlever du wagon actuel !
|
|
|
|
// et on met à jour l'attribut wagonActuel du passager
|
|
lePassager.wagonActuel = & lesWagons[num];
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
int Train::deplacerAuWagonPrecedent(Passager &lePassager) {
|
|
if (lePassager.getWagonActuel().getNumero() < 1 || lePassager.getWagonActuel().getNumero() > lesWagons.size()) {
|
|
return -1;
|
|
}
|
|
if (lePassager.getWagonActuel().getNumero() == 1) {
|
|
return -2;
|
|
}
|
|
// if (lePassager.getWagonActuel().enlever(lePassager) == -1) { Pareil ici que l.66 ??!!
|
|
// return -4;
|
|
// }
|
|
if (lesWagons[lePassager.getWagonActuel().getNumero() - 2].ajouter(lePassager) == -1) {
|
|
return -3;
|
|
}
|
|
return 0;
|
|
}
|
|
*/
|
|
|
|
int Train::deplacerAuWagonPrecedent(Passager &lePassager) {
|
|
Wagon* w = lePassager.getWagonActuel();
|
|
if(w==nullptr){
|
|
return -1 ; //n'a pas de wagon => pas dans le train
|
|
}
|
|
|
|
unsigned num = w->getNumero();
|
|
if (num==1) return -2; //* le wagon 1 n'a pas de wagon précédent
|
|
|
|
// on tente de faire passer le passager au wagon précédent (num-1)
|
|
int fait = lesWagons[num-2].ajouter(lePassager);
|
|
if(fait == 0) return-3;
|
|
|
|
// il ne nous reste plus qu'à l'enlever du wagon num
|
|
lesWagons[num-1].enlever(lePassager);
|
|
|
|
// et on met à jour l'attribut wagonActuel du passager
|
|
lePassager.wagonActuel = & lesWagons[num-2];
|
|
return 0;
|
|
|
|
}
|
|
|
|
/*
|
|
int Train::monterDansLeTrainAPartirDe(int numeroWagon, Passager &lePassager) {
|
|
int i;
|
|
if (numeroWagon < 1 || numeroWagon > lesWagons.size()) {
|
|
return -2;
|
|
}
|
|
if (roule) {
|
|
return -1;
|
|
}
|
|
for (i = numeroWagon - 1; i < lesWagons.size() && lesWagons[i].ajouter(lePassager) == 0; ++i) {
|
|
return -3;
|
|
}
|
|
return i--;
|
|
}
|
|
*/
|
|
|
|
int Train::monterDansLeTrainAPartirDe(int numeroWagon, Passager& lePassager){
|
|
int codeErreur;
|
|
|
|
codeErreur = monterDansLeTrain(numeroWagon,lePassager);
|
|
if(codeErreur==-1) return -1;
|
|
if(codeErreur==0) return numeroWagon; //! Pas oublier de rajouter ça ??!!
|
|
|
|
unsigned int taille = lesWagons.size(); //! unsigned permet d'avoir que des nombres positifs !
|
|
//? Que se passe-t-il si on a un nombre négatif ???
|
|
|
|
if(numeroWagon <=0 || numeroWagon > (int)taille) return -2; //? Pk on met le int ici ???
|
|
// rajouter (unsigned int) avant le numwagon
|
|
|
|
for(unsigned i = numeroWagon+1; i<=taille; i++){ //? Pourquoi on le declare pas en int ???
|
|
codeErreur = monterDansLeTrain(i,lePassager);
|
|
if(codeErreur==0) return i;
|
|
|
|
}
|
|
for(unsigned i = numeroWagon-1; i>0; i--){ //* A revoir les utilisation des for ici ==> on monte d'abord en + puis en -
|
|
codeErreur = monterDansLeTrain(i,lePassager);
|
|
if(codeErreur==0) return i;
|
|
}
|
|
return -3;
|
|
}
|
|
|
|
|
|
|
|
ostream &operator<<(ostream &s, const Train &t) {
|
|
s << "Train : " << t.lesWagons.size() << " wagon(s)." << endl;
|
|
s << "Liste des wagons :\n";
|
|
|
|
/* NON pas comme ça
|
|
for (Wagon* w : t.lesWagons){
|
|
s << "\t" << "Wagon n°" << w->numero << " : " << w->lesPassagers.size() << " passager(s)." << endl;
|
|
s << "\t" << "Reste " << w->capacite - w->lesPassagers.size() << " places(s)." << endl;
|
|
s << "\t" << "Liste des passagers :\n";
|
|
for (Passager* p : w->lesPassagers)
|
|
s << "\t\t" << *p << endl;
|
|
}
|
|
*/
|
|
|
|
// comme ça :
|
|
for (const Wagon & w : t.lesWagons){
|
|
cout << w << endl; //// on utilise l'operator<< des wagons !!!!
|
|
}
|
|
return s;
|
|
}
|