diff --git a/rute.cpp b/rute.cpp index 874deb3e44d8d0148934e510f19d5c448bc8a7c6..049c12bae35d3816d8a9084462667e2bfd33d215 100644 --- a/rute.cpp +++ b/rute.cpp @@ -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. } /** diff --git a/rute.h b/rute.h index c41eda3e0a36102df6ff54e270a275529e3109b9..3247a9d4c793549abc707a7cf1571391ab962206 100644 --- a/rute.h +++ b/rute.h @@ -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(); diff --git a/ruter.cpp b/ruter.cpp index a85af7839fe2ab8219403105616028f963000887..964d44417280e0e45d526c214cd9df8bcc2392a4 100644 --- a/ruter.cpp +++ b/ruter.cpp @@ -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: