diff --git a/rute.cpp b/rute.cpp index 0b8acc32caa5714281249cf00c3fc7604ad1b57d..d610d9d7f6e669d4a08456bee9df670ab33bf203 100644 --- a/rute.cpp +++ b/rute.cpp @@ -11,12 +11,14 @@ #include <fstream> #include "const.h" #include "rute.h" +#include "ruter.h" #include "stoppested.h" #include "stoppesteder.h" #include "LesData3.h" using namespace std; extern Stoppesteder gStoppestederBase; +extern Ruter gRuterBase; //********STOPP FUNKSJONER******************* @@ -100,6 +102,40 @@ 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 * alle tegn i strengen er tall eller ei @@ -148,7 +184,7 @@ bool Rute::gyldigTid(const int time, const int minutt) { /** * Finner antall minutter mellom et faktisk stopp på ruten * og startstoppestedet på ruten - * + * * @param nr - Et stoppesteds unike nummer * @param retning - Fram eller Tilbake (ulikt startsted) avhengig * av hvilken vei ruten går @@ -179,9 +215,23 @@ int Rute::finnDifferanse(const int nr, const Retning retning) { return -1; // Skal ikke skje } +/** + * Henter hvor et stopp er i rute listen stoppene. + * + * @param stoppNr + * @return int - returnerer hvor i lista stoppet er. + */ +int Rute::hentRuteIndeks(const int stoppNr) { + int indeks; + auto it = find(stoppene.begin(), stoppene.end(), stoppNr); + indeks = distance(stoppene.begin(), it); + return indeks; +} + + /** * Henter navn på startstasjonen på en rute - * + * * @param retning Om ruten er Fram (original) eller Tilbake ("baklengs") * @return Navnet på startstopp på rute avhengig av retning * @see Stoppesteder::hentNavnVhaIndeks(...) @@ -195,21 +245,82 @@ string Rute::hentNavn(const Retning retning) { startSted = gStoppestederBase.hentNavnVhaIndeks(stoppene.back()->hentNr()); return startSted; // Returnerer navnet på startstopp på ruten -} +} //må endres til å ta imot peker! return peker. /** - * TODO: fjernStopp() + * 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 */ void Rute::fjernStopp() { + int stoppNr, sIndeks, lIndeks; + string navn, navn2, sNavn, lNavn; //start og last + Stopp* sStopp = nullptr; + Stopp* lStopp = nullptr; + + auto itS = stoppene.begin(); + cout << "\n\nMellom start\n" + << "Stoppested (entydig navn / tall / ENTER for å avslutte): "; + getline(cin, navn); + + while (navn.size() > 0) { + navn = gStoppestederBase.byttBokstaver(navn); + if (erTall(navn)) { stoppNr = stoi(navn); } + if (gStoppestederBase.finnesIndeks(stoppNr-1)) { + navn = gStoppestederBase.hentNavnVhaIndeks(stoppNr); } + 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 + 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); + + } + } + + auto itL= stoppene.begin(); //setter slutt(last) stopper til start. + cout << "\n\nMellom slutt\nStopp kan ikke være nabo eller samme som start!" + << "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 = ""; + }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); + } + stoppene.erase(itS, itL); + + } } /** * Leser inn og oppretter en rutetabell for et gitt stoppested på en rute * med utgangspunkt i omregning fra et startsted på ruten - * + * * @param diff - differanse mellom startsted og aktuelt stoppested i minutter * @param start - faktisk startstedsnavn på ruten * @param stSted - faktisk navn på aktuellt stoppested @@ -241,12 +352,12 @@ void Rute::ruteTabell(const int diff, const string start, const string stSted) { startTid = (startT*60)+startM; // Regner ut første avgangstid // Sørger for at starttid er gyldig, samt ikke senere enn 23:53 (1433) - while (!gyldigTid(startT, startM) || startTid > 1433) { + while (!gyldigTid(startT, startM) || startTid > 1433) { cout << "\nUlovlig klokkeslett. Prøv igjen (tt mm): "; cin >> startT >> startM; cin.ignore(); startTid = (startT*60)+startM; } - + while (startT != 0 || startM != 0) { // Så lenge bruker ikke taster 0 0 avgangsTid = startTid+diff; // Må ha en sjekk her for lang tid mellom stoppesteder, som @@ -254,13 +365,13 @@ void Rute::ruteTabell(const int diff, const string start, const string stSted) { // så man ikke får output med et klokkeslett 25:xx f.eks. if (avgangsTid < 1440) { // < 24:00 avgangstider.push_back(avgangsTid); // Legger første avgang - // i vector + // i vector } else { // Omregning av hva som skal i vector, for spesielle // tilfeller, unngå 25:xx f.eks.: avgangstider.push_back(avgangsTid%1440); } - - + + // Leser tid mellom avganger: // Ny sjekk her for å sørge for riktig output til bruker // basert på valgt "fra"-tid. Godtar ikke 6-120 min for @@ -311,7 +422,7 @@ void Rute::ruteTabell(const int diff, const string start, const string stSted) { startTotal = (startT*60)+startM; // Omregning // Sørger for ny lovlig starttid: while ((!gyldigTid(startT, startM) || startTotal <= sluttTotal) - && (startT != 0 || startM != 0)) { + && (startT != 0 || startM != 0)) { cout << "\nUlovlig klokkeslett. Prøv igjen (tt mm): "; cin >> startT >> startM; cin.ignore(); startTotal = (startT*60)+startM; // Omregning @@ -319,10 +430,10 @@ void Rute::ruteTabell(const int diff, const string start, const string stSted) { startTid = (startT*60)+startM; // Omregning } else { // Avslutter innlesning fra bruker hvis slutttid er 23:53 // eller senere (da det må være +1 min minimum til neste - // avgang). + // avgang). startT = 0; startM = 0; // Sørger for stopp av innlesning } - + } cout << "\n\nRutetabell for stoppested: " << stSted << "\n\n"; // Sorterer vektoren, slik at man ikke får duplikat utskrift av @@ -342,7 +453,7 @@ void Rute::ruteTabell(const int diff, const string start, const string stSted) { } else { // Hvis time er mer enn 24 (skjer ved stor avstand) // mellom stoppesteder på en rute, gjør modulo // slik at det ikke skrives ut 25:xx f.eks.: - cout << '\n' << ((timer%24 < 10) ? "0" : "") << timer%24 + cout << '\n' << ((timer%24 < 10) ? "0" : "") << timer%24 << ": " << ((minutter < 10) ? "0" : "") << minutter; } @@ -445,7 +556,7 @@ void Rute::smettStopp() { cout << "\n\nMellom start\n" << "Stoppested (entydig navn / tall / ENTER for å avslutte): "; getline(cin, navn); - + while (navn.size() > 0) { // Så lenge ikke skrevet enter: navn = gStoppestederBase.byttBokstaver(navn); // fjerner æøåÆØÅ @@ -531,13 +642,13 @@ void Rute::lesData() { // Henter et stoppesteds faktiske indeks i vector: indeks = gStoppestederBase.hentIndeksVhaNavn(fNavn); // Hvis stopp ikke finnes fra før på ruten: - if (!finnesStopp(indeks+1)) { - + if (!finnesStopp(indeks+1)) { + if (stoppene.size() > 0) { // Hvis ikke første stopp på ruten // Henter peker til eget stoppested: nStopp = gStoppestederBase.finnDuplikat(fNavn); // Hvis nabo finnes fra før: - if (nStopp->finnesNabo(naboIndeks+1)) { + if (nStopp->finnesNabo(naboIndeks+1)) { // Henter naboens indeks naboIndeks = nStopp->hentNaboIndeks(naboIndeks+1); // Henter tid til naboen: @@ -546,7 +657,7 @@ void Rute::lesData() { nyStopp = new Stopp(indeks+1, tidTilF); stoppene.push_back(nyStopp); // Legges i lista // Oppdaterer naboindeks for videre bruk: - naboIndeks = indeks; + naboIndeks = indeks; cout << "\nTiden mellom stoppestedene er allerede" << " registrert som " << tidTilF << " minutter.\n"; @@ -581,11 +692,11 @@ void Rute::lesData() { // forrige nabo å være 0, da første stopp på ruten stoppene.push_back(nyStopp); // Legges til ruten // Oppdaterer naboindeks for videre bruk - naboIndeks = indeks; + naboIndeks = indeks; } // Setter peker til forrige stopp til å peke på riktig // stoppested for videre bruk: - fStopp = nStopp; + fStopp = nStopp; } else // Stoppet finnes allerede på ruten: cout << "\nStoppet er allerede registrert på ruten!\n"; } else { // Hvis ikke entydig: diff --git a/rute.h b/rute.h index 451328ed3b81ea61fe08be59e2366ffca404eccd..1cd08a7c1f4e393304d766f454ceb4aea9566363 100644 --- a/rute.h +++ b/rute.h @@ -36,10 +36,13 @@ class Rute { Rute(); Rute(std::ifstream & inn); bool erListeGyldig(); + bool Rute::erNabo(Stopp* s1, Stopp* s2); bool erTall(std::string nvn); 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); std::string hentNavn(const Retning retning); void fjernStopp(); void ruteTabell(const int diff, const std::string start, @@ -53,8 +56,8 @@ class Rute { virtual void skrivData() const; virtual void skrivKort() const; virtual void skrivTilFil(std::ofstream & ut); - - + + }; diff --git a/ruter.cpp b/ruter.cpp index 1e1612f15eebb8794779736ecbc9d03190612a99..a85af7839fe2ab8219403105616028f963000887 100644 --- a/ruter.cpp +++ b/ruter.cpp @@ -54,8 +54,12 @@ void Ruter::endreRute() { } switch (valg) { // Sender til rett funksjon etter brukervalg: - case 'F': ruten->second->fjernStopp(); break; - case 'S': ruten->second->smettStopp(); break; + 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; } } else // Rutenummeret finnes ikke: