Repository navigation
Expand file tree
/
Copy pathTram.cpp
More file actions
243 lines (216 loc) · 9.28 KB
/
Copy pathTram.cpp
File metadata and controls
243 lines (216 loc) · 9.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
#include "Tram.h"
#include "DesignByContract.h"
#include "MetroNet.h"
#include <iostream>
Tram::Tram() {
initCheck = this;
ENSURE(properlyInitialized(),
"constructor must end in properlyInitialized state");
}
Tram::Tram(const int lijnNr, const int voertuigNr,
const int zitplaatsen, const std::string& beginStation, const int snelheid) :
lijnNr(lijnNr),
voertuigNr(voertuigNr),
zitplaatsen(zitplaatsen),
snelheid(snelheid),
beginStation(beginStation),
currentStation(beginStation)
{
REQUIRE(beginStation != "", "beginStation must not be empty");
REQUIRE(lijnNr >= 0 , "lijnNr must be bigger or equal to zero");
REQUIRE(voertuigNr >= 0 , "voertuigNr must be bigger or equal to zero");
REQUIRE(zitplaatsen >= 0 , "zitplaatsen must be bigger or equal to zero");
REQUIRE(snelheid >= 0 , "snelheid must be bigger or equal to zero");
initCheck = this;
ENSURE(properlyInitialized(), "constructor must end in properlyInitialized state");
}
Tram::~Tram() {
}
bool Tram::properlyInitialized() const{
return initCheck == this;
}
int Tram::getLijnNr() const {
REQUIRE(properlyInitialized(),
"Tram wasn't initialized when calling getLijnNr");
return lijnNr;
}
int Tram::getZitplaatsen() const {
REQUIRE(properlyInitialized(),
"Tram wasn't initialized when calling getZitplaatsen");
return zitplaatsen;
}
std::string Tram::getBeginStation() const {
REQUIRE(properlyInitialized(),
"Tram wasn't initialized when calling getBeginStation");
return beginStation;
}
std::string Tram::getCurrentStation() const {
REQUIRE(properlyInitialized(),
"Tram wasn't initialized when calling getCurrentStation");
return currentStation;
}
int Tram::getAantalPassagiers() const {
REQUIRE(properlyInitialized(),
"Tram wasn't initialized when calling getAantalPassagiers");
return aantalPassagiers;
}
int Tram::getSnelheid() const {
REQUIRE(properlyInitialized(),
"Tram wasn't initialized when calling getSnelheid");
return snelheid;
}
int Tram::getVoertuigNr() const {
REQUIRE(properlyInitialized(),
"Tram wasn't initialized when calling getVoertuigNr");
return voertuigNr;
}
void Tram::setLijnNr(const int newLijnNr) {
REQUIRE(properlyInitialized(),
"Tram wasn't initialized when calling setLijnNr");
REQUIRE(newLijnNr >= 0 , "newLijnNr must be bigger or equal to zero");
lijnNr = newLijnNr;
ENSURE(getLijnNr() == newLijnNr, "setLijnNr post condition failure");
}
void Tram::setZitplaatsen(const int newZitplaatsen) {
REQUIRE(properlyInitialized(),
"Tram wasn't initialized when calling setZitplaatsen");
REQUIRE(newZitplaatsen >= 0 ,
"newZitplaatsen must be bigger or equal to zero");
zitplaatsen = newZitplaatsen;
ENSURE(getZitplaatsen() == newZitplaatsen,
"setZitplaatsen post condition failure");
}
void Tram::setBeginStation(const std::string & newBeginStation) {
REQUIRE(properlyInitialized(),
"Tram wasn't initialized when calling setBeginStation");
REQUIRE(newBeginStation != "", "newBeginStation must not be empty");
beginStation = newBeginStation;
ENSURE(getBeginStation() == newBeginStation,
"setBeginStation post condition failure");
}
void Tram::setCurrentStation(const std::string &newCurrentStation) {
REQUIRE(properlyInitialized(),
"Tram wasn't initialized when calling setCurrentStation");
REQUIRE(newCurrentStation != "", "newCurrentStation must not be empty");
currentStation = newCurrentStation;
ENSURE(getCurrentStation() == newCurrentStation,
"setCurrentStation post condition failure");
}
void Tram::setSnelheid(const int newSnelheid) {
REQUIRE(properlyInitialized(),
"Tram wasn't initialized when calling setSnelheid");
REQUIRE(newSnelheid >= 0 , "newSnelheid must be bigger or equal to zero");
snelheid = newSnelheid;
ENSURE(getSnelheid() == newSnelheid, "setSnelheid post condition failure");
}
void Tram::setAantalPassagiers(const int newAantalPassagiers) {
REQUIRE(properlyInitialized(), "Tram wasn't initialized when calling setAantalPassagiers");
REQUIRE(newAantalPassagiers >= 0 , "newAantalPassagiers must be bigger or equal to zero");
aantalPassagiers = newAantalPassagiers;
ENSURE(getAantalPassagiers() == newAantalPassagiers, "setAantalPassagiers post condition failure");
}
void Tram::setVoertuigNr(const int newVoertuigNr) {
REQUIRE(properlyInitialized(),
"Tram wasn't initialized when calling setVoertuigNr");
REQUIRE(newVoertuigNr >= 0 ,
"newVoertuigNr must be bigger or equal to zero");
voertuigNr = newVoertuigNr;
ENSURE(getVoertuigNr() == newVoertuigNr,
"setVoertuigNr post condition failure");
}
bool Tram::isInTram(std::string passagier) const {
REQUIRE(properlyInitialized(), "Tram wasn't initialized when calling setVoertuigNr");
REQUIRE(passagier != "", "passagier must not be empty");
return passagiers.find(passagier) != passagiers.end();
}
void Tram::addPassagier(std::string passagier, int aantal) {
REQUIRE(properlyInitialized(), "Tram wasn't initialized when calling setVoertuigNr");
REQUIRE(passagier != "", "passagier must not be empty");
REQUIRE(aantal >= 0, "aantal must be bigger or equal to zero");
REQUIRE(isInTram(passagier) == false, "passenger allready in Tram");
passagiers.insert(passagier);
setOmzet(getOmzet() + ticketPrijs*aantal);
ENSURE(isInTram(passagier) == true, "addPassagier post condition failure");
}
void Tram::removePassagier(std::string passagier) {
REQUIRE(properlyInitialized(), "Tram wasn't initialized when calling setVoertuigNr");
REQUIRE(passagier != "", "passagier must not be empty");
REQUIRE(isInTram(passagier) == true, "passenger not in Tram");
passagiers.erase(passagier);
ENSURE(isInTram(passagier) == false, "addPassagier post condition failure");
}
std::set<std::string> Tram::afstappenInHalte(MetroNet& metronet, std::string station) {
REQUIRE(properlyInitialized(), "Tram wasn't initialized when calling afstappenInHalte");
REQUIRE(metronet.properlyInitialized(), "MetroNet wasn't initialized when calling afstappenInHalte");
REQUIRE(station != "", "station must not be empty");
std::set<std::string> afstappen;
for (std::string passagierName : passagiers) {
Passagier* passagier = metronet.getPassagier(passagierName);
if (passagier->getEindStation() == station) {
afstappen.insert(passagierName);
}
}
return afstappen;
}
int Tram::getOmzet() const {
REQUIRE(properlyInitialized(), "Tram wasn't initialized when calling getOmzet");
return omzet;
}
void Tram::setOmzet(const int newOmzet) {
REQUIRE(properlyInitialized(), "Tram wasn't initialized when calling setOmzet");
REQUIRE(newOmzet >= 0 , "newOmzet must be bigger or equal to zero");
omzet = newOmzet;
ENSURE(getOmzet() == newOmzet, "setOmzet post condition failure");
}
bool Tram::isReachable(MetroNet& metronet, std::string station) {
REQUIRE(properlyInitialized(), "Tram wasn't initialized when calling moveTram");
REQUIRE(metronet.properlyInitialized(), "MetroNet wasn't initialized when calling moveTram");
Station* nextStation = metronet.getStation(metronet.getStation(currentStation)->getVolgende(lijnNr));
while (nextStation->getNaam() != station) {
if (nextStation->isTramInStation(lijnNr)) {
ENSURE(metronet.isConsistent(), "isReachable made MetroNet inconsistent");
return false;
}
nextStation = metronet.getStation(nextStation->getVolgende(lijnNr));
}
return true;
}
void Tram::moveTram(MetroNet& metronet, std::ostream& output) {
REQUIRE(properlyInitialized(), "Tram wasn't initialized when calling moveTram");
REQUIRE(metronet.properlyInitialized(), "MetroNet wasn't initialized when calling moveTram");
bool attemptedToMove, moved = false;
Station* nextStation = metronet.getStation(metronet.getStation(currentStation)->getVolgende(lijnNr));
if (!nextStation->isTramInStation(lijnNr)) {
if (isReachable(metronet, nextStation->getNaam())) {
metronet.getStation(currentStation)->setTramInStation(lijnNr, voertuigNr, false);
nextStation->setTramInStation(lijnNr, voertuigNr, true);
output
<< "Tram #" << voertuigNr << " op spoor " << lijnNr << " reed van station "
<< currentStation << " naar station " << nextStation->getNaam() << "." << std::endl;
currentStation = nextStation->getNaam();
moved = true;
}
else {
output
<< "Tram #" << voertuigNr << " op spoor " << lijnNr << " wachtte in station "
<< currentStation << ", want de route naar station " << nextStation->getNaam()
<< " was bezet." << std::endl;
attemptedToMove = true;
}
}
else {
output
<< "Tram #" << voertuigNr << " op spoor " << lijnNr << " wachtte in station "
<< currentStation << ", want station " << nextStation->getNaam()
<< " was bezet door Tram #" << nextStation->getTramInStation(lijnNr) << "." << std::endl;
attemptedToMove = true;
}
ENSURE(moved || attemptedToMove, "moveTram post condition failure");
ENSURE(metronet.isConsistent(), "moveTram made MetroNet inconsistent");
}
bool Tram::stoptInStation(MetroNet& metronet, std::string station) const {
REQUIRE(properlyInitialized(), "Tram wasn't initialized when calling afstappenInHalte");
REQUIRE(metronet.properlyInitialized(), "MetroNet wasn't initialized when calling afstappenInHalte");
REQUIRE(station != "", "station must not be empty");
return false;
}