Skip to content
Snippets Groups Projects
Commit 2bcc319e authored by Frederik Simonsen's avatar Frederik Simonsen
Browse files

R E smett

parent b002d870
Branches
No related tags found
1 merge request!6Frederik
......@@ -87,6 +87,37 @@ Rute::Rute(ifstream & inn) {
}
}
/**
* Sjekker om et sluttsted ifm. smetting av stopper er før på ruten
* enn startstedet i intervallet for hvor stopper skal smettes
*
* @param s1 - Peker til startstopp i intervallet
* @param s2 - Peker til sluttstopp i intervallet
* @return true s2 er tidligere på ruten enn s1
* @return false s1 er før s2
*/
bool Rute::erForst(Stopp* s1, Stopp* s2) {
int fPos, // første posisjon
aPos; // andre posisjon
// finner posisjon i listen for startstopp i intervallet:
auto it = find(stoppene.begin(), stoppene.end(), s1);
if (it != stoppene.end()) {
fPos = distance(stoppene.begin(), it);
}
// Finner posisjon i listen for stoppsted i intervallet:
auto it2 = find(stoppene.begin(), stoppene.end(), s2);
if (it2 != stoppene.end()) {
aPos = distance(stoppene.begin(), it2);
}
// Hvis stoppsted faktisk er før startsted i intervall:
if (aPos < fPos) {
return true;
}
// Hvis startsted faktisk er før stoppsted i intervall:
return false;
}
/**
* Sjekker om en rute har mer enn en stopp (= gyldig rute)
*
......@@ -101,36 +132,25 @@ bool Rute::erListeGyldig() {
}
/**
* Går gjennom et medsendt navn fra bruker, sjekker
* alle tegn i strengen er tall eller ei
* Sjekker om to stopp på en rute faktisk er nabo eller ei
*
* @param nvn - Mulig stoppestedsnavn eller stoppestedsnr
* @return true Hvis alle tegnene i strengen er tall
* @return false Hvis strengen inneholder tegn som ikke er tall
*/
bool Rute::erTall(std::string nvn) {
return all_of(nvn.begin(), nvn.end(), ::isdigit);
}
/**
* @brief
*
* @param fStoppNr
* @param aStoppNr
* @return true
* @return false
* @param s1 - Peker til startstopp i intervallet
* @param s2 - Peker til sluttstopp i intervallet
* @return true Hvis stoppene er naboer
* @return false Hvis stoppene ikke er naboer
*/
bool Rute::erNabo(Stopp* s1, Stopp* s2) {
int fPos,
aPos,
temp,
avstand;
int fPos, // posisjon til første stopp i ruten
aPos, // posisjon til andre stopp i ruten
temp, // Hjelpevariabel for eventuelt bytte om fPos og aPos
avstand; // Avstand mellom stoppene på ruten (=1 hvis nabo)
// Finner posisjon til første stopp i intervallet
auto it = find(stoppene.begin(), stoppene.end(), s1);
if (it != stoppene.end()) { // Funn av stoppNr
fPos = distance(stoppene.begin(), it);
}
// Finner posisjon til andre stopp i intervallet
auto it2 = find(stoppene.begin(), stoppene.end(), s2);
if (it2 != stoppene.end()) { // Funn av stoppNr
aPos = distance(stoppene.begin(), it2);
......@@ -138,22 +158,36 @@ bool Rute::erNabo(Stopp* s1, Stopp* s2) {
if (fPos < aPos) { // Hvis første er før på ruten enn andre
avstand = aPos-fPos; // Setter avstand mellom stopp på ruten
// Hvis slutt stopp er før start stopp i intervallet, bytter plass:
} else if (fPos > aPos) {
temp = fPos; // Gjør om slik at første stopp på ruten kommer først
temp = fPos;
fPos = aPos;
aPos = temp;
avstand = aPos-fPos;
// Hvis man sjekker om samme stopp er først og sist i intervall:
} else if (fPos == aPos) { // Skal ikke skje
cout << "\nHer er det noe alvorlig galt.\n\n";
}
if (avstand == 1) { // Stoppene er naboer
// Hvis stoppene i intervallet er naboer:
if (avstand == 1) {
return true;
}
// Stoppene er ikke naboer:
return false;
}
/**
* Går gjennom et medsendt navn fra bruker, sjekker
* alle tegn i strengen er tall eller ei
*
* @param nvn - Mulig stoppestedsnavn eller stoppestedsnr
* @return true Hvis alle tegnene i strengen er tall
* @return false Hvis strengen inneholder tegn som ikke er tall
*/
bool Rute::erTall(std::string nvn) {
return all_of(nvn.begin(), nvn.end(), ::isdigit);
}
/**
* Går gjennom om alle Stopp på en rute for å sjekke om deres
* unike nr matcher en nr som bruker mener finnes på ruten
......@@ -240,10 +274,12 @@ string Rute::hentNavn(const Retning retning) {
}
/**
* Prøver å finne en peker til et stopp på en rute
* Sjekker om en stopp er på en aktuell rute
*
* @param nr
* @return Stopp*
* @param nr - Stoppens unike nr
* @return Stopp* - Peker til stopp ved funn (er på ruta)
* @return nullptr - Hvis stoppen ikke er på aktuell rute
* @see Stopp::hentNr()
*/
Stopp* Rute::finnStopp(int nr) {
int nummer;
......@@ -481,35 +517,61 @@ void Rute::slettData(){
}
/**
* TODO: smettStopp()
* Husk her må avstanden mellom de to stoppestedene være akkurat 1 (naboer)
* Hvis de ikke er naboer, skal man bli sendt tilbake til meny
* Smetter inn stoppesteder mellom et intervall hvis mulig
* Skal godta tall, navn så fort entydig, hoppe ut ved enter
* Skal sjekke at det kun går ann å smette inn mellom faktiske
* naboer på en rute (uavhengig av hvilken "vei" bruker har
* tastet inn disse) osv.
*
* @see Stoppesteder::byttBokstaver(...)
* @see Rute::erTall(...)
* @see Stoppesteder::finnesIndeks(...)
* @see Stoppesteder::hentNavnVhaIndeks(...)
* @see Stoppesteder::finnEntydig(...)
* @see Stoppesteder::hentIndeksVhaNavn(...)
* @see Rute::finnesStopp(...)
* @see Stoppesteder::finnDuplikat(...)
* @see Rute::finnStopp(...)
* @see Rute::erNabo(...)
* @see Rute::erForst(...)
* @see Stoppested::finnesNabo(...)
* @see Stoppested::hentNaboIndeks(...)
* @see Stoppested::hentNaboTid(...)
* @see Stopp::Stopp(...)
* @see Stoppested::settNaboIndeks(...)
* @see Stoppested::settNaboTid(...)
* @see Rute::skrivRute(...)
*/
void Rute::smettStopp() {
string navn,
fNavn,
aNavn,
nNavn;
int stoppNr,
fStoppNr,
aStoppNr,
nStoppNr,
indeks,
naboIndeks,
fIndeks,
aIndeks,
tid,
storrelse = stoppene.size();
Stopp* fStopp = nullptr;
Stopp* aStopp = nullptr;
Stopp* nStopp = nullptr;
Stoppested* fStoppested = nullptr;
Stoppested* aStoppested = nullptr;
Stoppested* nStoppested = nullptr;
string navn, // Hjelpevariabel for å lese brukerinput
fNavn, // Forrige stoppesteds navn
aNavn, // Siste stoppesteds navn i intervall
nNavn, // Nåværende stoppesteds navn
tempNavn; // Hjelpevariabel for evt. å endre rekkefølge
int stoppNr, // Hjelpevariabel for å lese brukerinput
fStoppNr, // Forrige stoppesteds unike nr
aStoppNr, // Siste stoppesteds unike nr i intervall
nStoppNr, // Nåværende stoppesteds unike nr
tempStoppNr, // Hjelpevariabel for evt. å endre rekkefølge
indeks, // Hjelpevariabel for å lese bruker input
naboIndeks, // Nabostopp sin indeks
fIndeks, // Forrige stoppested sin indeks
aIndeks, // Siste stoppested sin indeks i intervall
tempIndeks, // Hjelpevariabel for evt. å endre rekkefølge
tid, // antall minutter mellom stopp
storrelse = stoppene.size(); // Hjelpevariabel for å se om ruten har blitt lengre
Stopp* fStopp = nullptr; // Peker til forrige stopp-struct
Stopp* aStopp = nullptr; // Peker til siste stopp-struct i intervall
Stopp* nStopp = nullptr; // Peker til nåværende stopp-struct
Stopp* tempStopp = nullptr; // Hjelpevariabel for evt. å endre rekkefølge
Stoppested* fStoppested = nullptr; // Peker til forrige stoppested i vector
Stoppested* aStoppested = nullptr; // Peker til siste stoppested i vector fra intervall
Stoppested* nStoppested = nullptr; // Peker til nåværende stoppested i vector
Stoppested* tempStoppested = nullptr; // Hjelpevariabel for evt. å endre rekkefølge
cout << "\n\nMellom start\n"
<< "Stoppested (entydig navn / tall / ENTER for å avslutte): ";
getline(cin, navn);
getline(cin, navn); // Leser navn fra bruker
while (navn.size() > 0) { // Så lenge ikke skrevet enter:
navn = gStoppestederBase.byttBokstaver(navn); // fjerner æøåÆØÅ
......@@ -539,7 +601,7 @@ void Rute::smettStopp() {
// Starte på neste while for å finne andre stopp?
navn = ""; // Sørger for at man kommer seg ut av whilen
} else {
navn = ""; // TEST
fNavn = ""; // Må være her hvis neste input er ENTER
cout << "\nStoppen finnes ikke på denne ruten.\n"
<< "\nStoppested (entydig navn / tall / ENTER"
<< " for å avslutte): ";
......@@ -547,7 +609,7 @@ void Rute::smettStopp() {
//send inn i while igjen, stopp er ikke på ruta
}
} else {
navn = ""; // TEST
fNavn = ""; // må være her hvis neste input er ENTER
cout << "\nIngen entydig stopp funnet.\n"
<< "\nStoppested (entydig navn / tall / ENTER"
<< " for å avslutte): ";
......@@ -559,7 +621,7 @@ void Rute::smettStopp() {
if (fNavn.size() > 0) { // Hvis suksessfull funn av startsted
cout << "\n\nMellom slutt\n"
<< "Stoppested (entydig navn / tall / ENTER for å avslutte): ";
getline(cin, navn);
getline(cin, navn); // Leser navn fra bruker
while (navn.size() > 0) { // Så lenge ikke skrevet enter:
navn = gStoppestederBase.byttBokstaver(navn); // fjerner æøå
......@@ -581,19 +643,41 @@ void Rute::smettStopp() {
aStoppNr = aIndeks+1; // Setter eget stoppNr
if (aStoppNr != fStoppNr) { // Hvis ikke samme stopp 2x på rad
// Finnes stoppen på ruta?
// Hvis stopp finnes på ruten:
if (finnesStopp(aStoppNr)) {
// Sjekker om stoppene er nabo på ruta:
// Henter peker til egen stopp:
aStopp = finnStopp(aStoppNr);
// Sjekker om stoppene er nabo på ruta:
if (erNabo(fStopp, aStopp)) {
// Henter peker til eget stoppested i vector
aStoppested = gStoppestederBase.finnDuplikat(aNavn);
// Henter peker til eget stopp i ruten
//aStopp = finnStopp(aStoppNr);
// Hvis sluttsted er før startsted, bytt alt:
if (erForst(fStopp, aStopp)) {
tempNavn = fNavn;
fNavn = aNavn;
aNavn = tempNavn;
tempIndeks = fIndeks;
fIndeks = aIndeks;
aIndeks = tempIndeks;
tempStoppNr = fStoppNr;
fStoppNr = aStoppNr;
aStoppNr = tempStoppNr;
tempStoppested = fStoppested;
fStoppested = aStoppested;
aStoppested = tempStoppested;
tempStopp = fStopp;
fStopp = aStopp;
aStopp = tempStopp;
tempNavn = "";
tempIndeks = -1;
tempStoppNr = -1;
tempStoppested = nullptr;
tempStopp = nullptr;
}
navn = ""; // Sørger for at man kommer seg ut av while
} else {
navn = ""; // TEST
aNavn = ""; // må være her hvis neste input er ENTER
// Stoppene er ikke naboer på ruta
cout << "\nStoppene er ikke naboer på ruten.\n"
<< "\nStoppested (entydig navn / tall / "
......@@ -602,7 +686,7 @@ void Rute::smettStopp() {
}
} else {
navn = ""; // TEST
aNavn = ""; // må være her hvis neste input er ENTER
// stoppen er ikke på ruta
cout << "\nStoppen er ikke på ruten.\n"
<< "\nStoppested (entydig navn / tall / "
......@@ -611,7 +695,7 @@ void Rute::smettStopp() {
}
} else {
navn = ""; // TEST
aNavn = ""; // må være her hvis neste input er ENTER
// andre stopp er samme som første stopp
cout << "\nStart- og sluttstopp kan ikke være lik.\n"
<< "\nStoppested (entydig navn / tall / "
......@@ -620,8 +704,8 @@ void Rute::smettStopp() {
}
} else {
navn = ""; // TEST
// IKKE ENTYDIG NAVN
aNavn = ""; // Må være her hvis neste input er ENTER
// Navnet er ikke entydig:
cout << "\nIngen entydig stopp funnet.\n"
<< "Stoppested (entydig navn / tall / ENTER"
<< " for å avslutte): ";
......@@ -634,7 +718,7 @@ void Rute::smettStopp() {
cout << "\n\nNye stoppested(er) etter " << fNavn
<< " og før " << aNavn << ":\n"
<< "Stoppested (entydig navn / tall / ENTER): ";
getline (cin, navn);
getline (cin, navn); // Leser navn fra bruker
while (navn.size() > 0) { // Så lenge ikke tastet enter:
navn = gStoppestederBase.byttBokstaver(navn); // Fjerner æøå
......@@ -647,7 +731,8 @@ void Rute::smettStopp() {
navn = gStoppestederBase.hentNavnVhaIndeks(stoppNr);
}
}
nNavn = gStoppestederBase.finnEntydig(navn); // Sjekker for entydighet
// Sjekker for entydighet:
nNavn = gStoppestederBase.finnEntydig(navn);
if (nNavn.size() > 0) { // Hvis entydig navn
// Henter egen indeks
......@@ -666,14 +751,13 @@ void Rute::smettStopp() {
naboIndeks = nStoppested->hentNaboIndeks(fStoppNr);
// Henter tid til nabo:
tid = nStoppested->hentNaboTid(naboIndeks);
// Oppretter nytt stopp på ruten:
nStopp = new Stopp(nStoppNr, tid);
// Hvordan får jeg satt dette i listen riktig???
// Insert evt., men skjønner ikke helt hvordan det
// fungerer
// Sørger for at stopp blir smettet inn på rett sted:
auto it = find(stoppene.begin(), stoppene.end(), aStopp);
stoppene.insert(it, nStopp); // Settes inn foran
// slutt stopp i intervall
// Oppdaterer peker og fStoppNr for videre bruk:
// Oppdaterer peker, indeks og stoppNr for videre bruk:
fStoppNr = nStoppNr;
fStoppested = nStoppested;
fIndeks = indeks;
......@@ -710,24 +794,27 @@ void Rute::smettStopp() {
getline(cin, navn);
}
} else {
navn = ""; // TEST
// Stoppen finnes allerede på ruten:
nNavn = ""; // Må være her hvis neste input er ENTER
cout << "\nStoppet finnes allerede på ruten.\n"
<< "\nStoppested (entydig navn / tall / "
<< "ENTER for å avslutte): ";
getline(cin, navn);
// Stoppen finnes allerede på ruten
}
} else {
navn = ""; // TEST
// Stoppen er en av de som skal smettes inn mellom:
nNavn = ""; // Må være her hvis neste input er ENTER
cout << "\nStoppet finnes allerede på ruten.\n"
<< "\nStoppested (entydig navn / tall / "
<< "ENTER for å avslutte): ";
getline(cin, navn);
// Stoppen er en av de som skal smettes inn mellom
}
} else {
navn = ""; // TEST
// Stopp er ikke entydig:
nNavn = ""; // Må være her hvis neste input er ENTER
cout << "\nIngen entydig stopp funnet.\n"
<< "Stoppested (entydig navn / tall / ENTER"
<< " for å avslutte): ";
......@@ -740,9 +827,10 @@ void Rute::smettStopp() {
cout << "\n\nFra " << nNavn << " til " << aNavn << ":\n";
// Hvis nabo finnes fra før:
if (aStoppested->finnesNabo(nStoppNr)) {
// Henter nabo sin indeks og allerede registrert tid:
naboIndeks = aStoppested->hentNaboIndeks(nStoppNr);
tid = nStoppested->hentNaboTid(naboIndeks);
aStopp->nr = tid; // oppdaterer tid til forrige nabo
aStopp->minutter = tid; // oppdaterer tid til forrige nabo på ruten
cout << "\nTiden mellom stoppestedene er allerede "
<< "registrert som " << tid << " minutter.\n\n";
......@@ -759,7 +847,8 @@ void Rute::smettStopp() {
aStoppested->settNaboIndeks(indeks);
// Oppdaterer egen stopps tid til nabo vektor
aStoppested->settNaboTid(tid);
aStopp->nr = tid; // oppdaterer tid til forrige nabo
aStopp->minutter = tid; // oppdaterer tid til forrige nabo
cout << '\n';
skrivRute(Fram); // skriver oppdatert rute forlengs
}
}
......@@ -786,7 +875,7 @@ void Rute::smettStopp() {
*/
void Rute::lesData() {
string navn,
fNavn;
fNavn; // faktisk navn (entydig)
int stoppNr = 0,
indeks = 0,
naboIndeks = 0,
......
......@@ -35,6 +35,7 @@ class Rute {
public:
Rute();
Rute(std::ifstream & inn);
bool erForst(Stopp* s1, Stopp* s2);
bool erListeGyldig();
bool erNabo(Stopp* s1, Stopp* s2);
bool erTall(std::string nvn);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment