Skip to content
Snippets Groups Projects
Commit 847abd5f authored by Sondre Sand's avatar Sondre Sand
Browse files

R E fjernstopp er ferdig!

parent 10b6b2bf
Branches
No related tags found
1 merge request!6Frederik
......@@ -102,39 +102,6 @@ bool Rute::erListeGyldig() {
return false;
}
bool Rute::erNabo(Stopp* s1, Stopp* s2) {
int fPos,
aPos,
temp,
avstand;
auto it = find(stoppene.begin(), stoppene.end(), s1);
if (it != stoppene.end()) { // Funn av stoppNr
fPos = distance(stoppene.begin(), it);
}
auto it2 = find(stoppene.begin(), stoppene.end(), s2);
if (it2 != stoppene.end()) { // Funn av stoppNr
aPos = distance(stoppene.begin(), it2);
}
if (fPos < aPos) { // Hvis første er før på ruten enn andre
avstand = aPos-fPos; // Setter avstand mellom stopp på ruten
} else if (fPos > aPos) {
temp = fPos; // Gjør om slik at første stopp på ruten kommer først
fPos = aPos;
aPos = temp;
avstand = aPos-fPos;
} else if (fPos == aPos) { // Skal ikke skje
cout << "\nHer er det noe alvorlig galt.\n\n";
}
if (avstand == 1) { // Stoppene er naboer
return true;
}
// Stoppene er ikke naboer:
return false;
}
/**
* Går gjennom et medsendt navn fra bruker, sjekker
......@@ -263,9 +230,10 @@ int Rute::finnDifferanse(const int nr, const Retning retning) {
* @param stoppNr
* @return int - returnerer hvor i lista stoppet er.
*/
int Rute::hentRuteIndeks(const int stoppNr) {
int Rute::hentRuteIndeks(Stopp* p1) {
int indeks;
auto it = find(stoppene.begin(), stoppene.end(), stoppNr);
auto it = find(stoppene.begin(), stoppene.end(), p1);
indeks = distance(stoppene.begin(), it);
return indeks;
}
......@@ -309,15 +277,33 @@ Stopp* Rute::finnStopp(int nr) {
}
/**
* TODO: fjernStopp()
* Husk at her må avstanden mellom stoppene være mer enn direkte naboer (>1)
* Skal fjerne de i mellom to stoppesteder ikke stoppestedene som blir oppgitt
* Fjerner stopp på en bestemt rute mellom to stopp fra brukeren.
* Oppdaterer nabo og tid, hvis de stoppene som ender opp som naboer
* ikke er naboer fra før.
*
* @see Stoppesteder::byttBokstaver(...)
* @see Stoppesteder::finnesIndeks(...)
* @see Stoppesteder::hentIndeksVhaNavn(...)
* @see Stoppesteder::finnEntydig(...)
* @see Stoppesteder::hentIndeksVhaNavn(...)
* @see Rute::finnStopp(...)
* @see Rute::finnesStopp(...)
* @see Rute::hentRuteIndeks(...)
* @see Stoppesteder::finnDuplikat(...)
* @see Stoppested::finnesNabo(...)
* @see Stoppested::hentNaboTid(...)
* @see Stoppested::settNaboIndeks(...)
* @see Stoppested::settNaboTid(...)
*
*/
void Rute::fjernStopp() {
int stoppNr, sIndeks, lIndeks;
int sIndeks, lIndeks, sStoppNr, lStoppNr, //s=start, l=last
tid; //tid mellom naboer
string navn, navn2, sNavn, lNavn; //start og last
Stopp* sStopp = nullptr;
Stopp* lStopp = nullptr;
Stopp* p1 = nullptr; //struct peker
Stopp* p2 = nullptr; //struct peker
Stoppested* sp1 = nullptr; //stoppested(vektor) peker
Stoppested* sp2 = nullptr; //stoppested(vektor) peker
auto itS = stoppene.begin();
cout << "\n\nMellom start\n"
......@@ -326,23 +312,25 @@ void Rute::fjernStopp() {
while (navn.size() > 0) {
navn = gStoppestederBase.byttBokstaver(navn);
if (erTall(navn)) { stoppNr = stoi(navn); }
if (gStoppestederBase.finnesIndeks(stoppNr-1)) {
navn = gStoppestederBase.hentNavnVhaIndeks(stoppNr); }
if (erTall(navn)) { sIndeks = stoi(navn);
if (gStoppestederBase.finnesIndeks(sIndeks-1)) { //navn fra bruker
navn = gStoppestederBase.hentNavnVhaIndeks(sIndeks); }
}
sNavn = gStoppestederBase.finnEntydig(navn);
stoppNr=gStoppestederBase.hentIndeksVhaNavn(sNavn); //finner indeks fra vektor.
if (finnesStopp(stoppNr+1)){ //sjekker at stopp finnes på lista.
//peker? indeks? hvordan fikse???
sIndeks=hentRuteIndeks(stoppNr+1); //henter hvor på lista stoppet er
advance (itS, sIndeks+1); //setter iterator start til en forbi stoppet
if (sNavn.size() > 0){
sIndeks=gStoppestederBase.hentIndeksVhaNavn(sNavn); //finner indeks fra vektor.
p1 = finnStopp(sIndeks+1);
if (finnesStopp(sIndeks+1)){ //sjekker at stopp finnes på lista.
sStoppNr=hentRuteIndeks(p1); //henter hvor på lista stoppet er
advance (itS, sStoppNr+1); //setter iterator start til en forbi stoppet
//fordi advance tar med selv stoppet det starter på, så må en forbi
navn = ""; //hopper ut av while.
}else {
cout << "\nStoppet finnes ikke på ruta!";
cout << "\n\nMellom start\n"
<< "Stoppested (entydig navn / tall / ENTER for å avslutte): ";
getline(cin, navn);
}
}
}
......@@ -351,31 +339,47 @@ void Rute::fjernStopp() {
<< "Stoppested (entydig navn / tall / ENTER for å avslutte): ";
getline(cin, navn2);
while (navn2.size() > 0) { // Så lenge ikke skrevet enter:
navn = gStoppestederBase.byttBokstaver(navn2); // fjerner æøåÆØÅ
if (erTall(navn2)) { // Sjekker om input kun er tall
stoppNr = stoi(navn2); // Hvis kun tall, gjør om til int
}
if (gStoppestederBase.finnesIndeks(stoppNr-1)) {
// Henter det faktiske navnet
navn2 = gStoppestederBase.hentNavnVhaIndeks(stoppNr);
}
lNavn = gStoppestederBase.finnEntydig(navn);
stoppNr=gStoppestederBase.hentIndeksVhaNavn(lNavn);
if (finnesStopp(stoppNr+1)){
lIndeks=hentRuteIndeks(stoppNr+1);
advance (itL, lIndeks);
navn = "";
while (navn2.size() > 0) {
navn2 = gStoppestederBase.byttBokstaver(navn2);
if (erTall(navn2)) { lIndeks = stoi(navn2);
if (gStoppestederBase.finnesIndeks(lIndeks-1)) { //navn fra bruker
navn2 = gStoppestederBase.hentNavnVhaIndeks(lIndeks); }
}
lNavn = gStoppestederBase.finnEntydig(navn2);
if (lNavn.size() > 0){
lIndeks=gStoppestederBase.hentIndeksVhaNavn(lNavn);
p2 = finnStopp(lIndeks+1);
if (finnesStopp(lIndeks+1) && sNavn!=lNavn && !erNabo(p1, p2)){
lStoppNr=hentRuteIndeks(p2);
advance (itL, lStoppNr);
navn2 = "";
}else {
cout << "\nStoppet finnes ikke på ruta!";
cout << "\nStopp kan ikke være nabo eller samme som start!";
cout << "\n\nMellom slutt\n"
<< "Stoppested (entydig navn / tall / ENTER for å avslutte): ";
getline(cin, navn);
getline(cin, navn2);
}
stoppene.erase(itS, itL);
}
}
stoppene.erase(itS, itL); //fjerner alt mellom bruker start og slutt.
sp1 = gStoppestederBase.finnDuplikat(sNavn); //setter peker til vektoren på start navn
sp2 = gStoppestederBase.finnDuplikat(lNavn); //setter peker til vektoren på slutt navn
if(sp2->finnesNabo(sIndeks+1)){ //hvis de er naboer
tid = sp2->hentNaboTid(sIndeks); //hent tiden
p2->minutter=tid; //oppdater tiden i structen
cout << "Tiden mellom stoppestedene er allerede registrert som "
<< tid << "minutter.";
}else{ //hvis de ikke er naboer
tid=lesInt("Tid til fra forrige stopp", 1, 10); //leser inn tid mellom stopp
p2->minutter=tid; //oppdaterer tiden i struct
sp1->settNaboIndeks(lIndeks); //start stopp er nabo med slutt stopp
sp1->settNaboTid(tid); //oppdaterer tiden
sp2->settNaboIndeks(sIndeks); //slutt stopp er nabo med start stopp
sp2->settNaboTid(tid); //oppdaterer tiden
}
skrivKort();
skrivRute(Fram); //skriver ut oppdatert rute.
}
/**
......
......@@ -41,8 +41,7 @@ class Rute {
bool finnesStopp(const int nr);
bool gyldigTid(const int time, const int minutt);
int finnDifferanse(const int nr, const Retning retning);
Stopp* finnStopp(int nr);
int hentRuteIndeks(const int nr);
int hentRuteIndeks(Stopp* p1);
std::string hentNavn(const Retning retning);
Stopp* finnStopp(int nr);
void fjernStopp();
......
......@@ -54,12 +54,8 @@ void Ruter::endreRute() {
}
switch (valg) { // Sender til rett funksjon etter brukervalg:
case 'F': ruten->second->fjernStopp();
ruten->second->skrivKort(); // Skriver egen info
ruten->second->skrivRute(Fram); break;
case 'S': ruten->second->smettStopp();
ruten->second->skrivKort(); // Skriver egen info
ruten->second->skrivRute(Fram); break;
case 'F': ruten->second->fjernStopp(); break;
case 'S': ruten->second->smettStopp(); break;
}
} else // Rutenummeret finnes ikke:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment