diff --git a/rute.cpp b/rute.cpp index 2e5ba10e3c3843b1db8f5734cd3d9fe9d4a1324d..ab09e8a3e72acac23dfa001be397b2ff4febf26a 100644 --- a/rute.cpp +++ b/rute.cpp @@ -125,12 +125,35 @@ bool Rute::finnesStopp(const int indeks) { return false; } -int Rute::finnDifferanse(const int nr) { +/** + * Funksjon for å sjekke om et klokkeslett er gyldig (00:00-23:59) + * + * @param time + * @param minutt + * @return true + * @return false + */ +bool Rute::gyldigTid(const int time, const int minutt) { + if ((time >= 0 && time <= 23) && (minutt >= 0 && minutt <= 59)) { + return true; + } else + return false; +} + +int Rute::finnDifferanse(const int nr, const Retning retning) { int totMin = 0; - for (auto it = stoppene.begin(); it != stoppene.end(); it++) { - totMin += (*it)->hentMin(); - if ((*it)->hentNr() == nr) - return totMin; + if (retning == Fram) { + for (auto it = stoppene.begin(); it != stoppene.end(); it++) { + totMin += (*it)->hentMin(); + if ((*it)->hentNr() == nr) + return totMin; + } + } else if (retning == Tilbake) { + for (auto it = stoppene.rbegin(); it != stoppene.rend(); it++) { + if ((*it)->hentNr() == nr) + return totMin; + totMin += (*it)->hentMin(); + } } return -1; // Skal ikke skje } @@ -145,29 +168,76 @@ string Rute::hentNavn(const Retning retning) { return startSted; } +/** + * + * + * @param diff - differanse mellom startsted og aktuelt stoppested i minutter + * @param start - faktisk startstedsnavn på ruten + * @param stSted - faktisk navn på aktuellt stoppested + * @see Rute::gyldigTid(...) + */ void Rute::ruteTabell(const int diff, const string start, const string stSted) { - int startT, - sluttT, - startM, - sluttM, - tidMellom; + int startT, // starttime + startTotal, // regner ut total starttid i minutter + sluttT, // slutt-time + sluttTotal, // regner ut total slutttid i minutter + startM, // startminutter + sluttM, // slutt-minutter + tidMellom, // Tid mellom hver avgang i minutter + tPrint, // hjelpevariabel for å sørge for korrekt utskrift av time + mPrint; // hjelpevariabel for å sørge for korrekt utskrift av minutter cout << "\nRuteavganger fra startstedet (" << start << ") - " << "avslutt med 0 0):\n\n"; cout << "Fra kl. (00:01 - 23:59): "; - cin >> startT >> startM; cin.ignore(); - while (startT != 0 || startM != 0) { + cin >> startT >> startM; cin.ignore(); // Leser starttid + + + while (!gyldigTid(startT, startM)) { // Sørger for at starttid er gyldig + cout << "\nUlovlig klokkeslett. Prøv igjen (tt mm): "; + cin >> startT >> startM; cin.ignore(); + } + + + while (startT != 0 || startM != 0) { // Så lenge bruker ikke taster 0 0 + // Leser tid mellom avganger tidMellom = lesInt("Tid mellom avganger", MINTID, MAXTID); - cout << "Til kl. (" << ((startT < 10) ? "0" : "") << startT - << ':' << ((tidMellom < 10) ? "0" : "") - << tidMellom << " - 23:59): "; + startTotal = (startT*60)+startM+tidMellom; // Omregner for sjekk + tPrint = startTotal/60; // Regner ut gyldig utskrift: + mPrint = startTotal%60; + + cout << "Til kl. (" << ((tPrint < 10) ? "0" : "") << tPrint + << ':' << ((mPrint < 10) ? "0" : "") << mPrint + << " - 23:59): "; + // Leser slutt tid cin >> sluttT >> sluttM; cin.ignore(); + sluttTotal = (sluttT*60)+sluttM; // Omregner for sjekk + // Sørger for lovlig slutt-tid + while (!gyldigTid(sluttT, sluttM) || sluttTotal < startTotal) { + cout << "\nUlovlig klokkeslett. Prøv igjen (tt mm): "; + cin >> sluttT >> sluttM; cin.ignore(); + sluttTotal = (sluttT*60)+sluttM; // Omregner for sjekk + } + + tPrint = (sluttTotal+1)/60; // Regner ut gyldig utskrift + mPrint = (sluttTotal+1)%60; - cout << "\n\nFra kl. (" << ((sluttT < 10) ? "0" : "") << sluttT - << ':' << ((sluttM+1 < 10) ? "0" : "") << sluttM+1 + + cout << "\n\nFra kl. (" << ((tPrint < 10) ? "0" : "") << tPrint + << ':' << ((mPrint < 10) ? "0" : "") << mPrint << " - 23:59): "; - cin >> startT >> startM; cin.ignore(); + cin >> startT >> startM; cin.ignore(); // Leser ny starttid + startTotal = (startT*60)+startM; // Omregning + // Sørger for ny lovlig starttid: + while ((!gyldigTid(startT, startM) || startTotal <= sluttTotal) + && (startT != 0 || startM != 0)) { // Sørger for at starttid er gyldig + cout << "\nUlovlig klokkeslett. Prøv igjen (tt mm): "; + cin >> startT >> startM; cin.ignore(); + startTotal = (startT*60)+startM; + } + + } } diff --git a/rute.h b/rute.h index 78f095f1864b5db84e440dc291ba64bb5aefccb8..7a2fb28a81614139ecebfb0e32419397ee65741f 100644 --- a/rute.h +++ b/rute.h @@ -38,8 +38,9 @@ class Rute { Rute(std::ifstream & inn); bool erListeGyldig(); bool erTall(std::string nvn); + bool gyldigTid(const int time, const int minutt); bool finnesStopp(const int indeks); - int finnDifferanse(const int nr); + int finnDifferanse(const int nr, const Retning retning); std::string hentNavn(const Retning retning); void ruteTabell(const int diff, const std::string start, const std::string stSted); diff --git a/ruter.cpp b/ruter.cpp index 19ee8fda0efa1bbeca80780a4313147a81f37831..ecc1c4b9b7c35f7bb90ea0432693a5f64d4391dd 100644 --- a/ruter.cpp +++ b/ruter.cpp @@ -164,8 +164,8 @@ void Ruter::ruteBeskrivelse(const int ruteNr){ */ void Ruter::ruteTabell() { int ruteNr, - stoppestedsNr, - differanse; + stoppNr, + diff; char valg; string navn, startSted; @@ -199,12 +199,23 @@ void Ruter::ruteTabell() { if (navn.size() > 0) { // Hvis navn er entydig: // Henter stoppestedets unike nr: - stoppestedsNr = gStoppestederBase.hentIndeksVhaNavn(navn) + 1; + stoppNr = gStoppestederBase.hentIndeksVhaNavn(navn) + 1; //Hvis stoppestedet finnes på ruten: - if (ruten->second->finnesStopp(stoppestedsNr)) { - differanse = ruten->second->finnDifferanse(stoppestedsNr); - startSted = ruten->second->hentNavn(Fram); - ruten->second->ruteTabell(differanse, startSted, navn); + if (ruten->second->finnesStopp(stoppNr)) { + switch (valg) { + case 'F': diff = + ruten->second->finnDifferanse(stoppNr, Fram); + break; + // Henter differanse ved retning fram + case 'T': diff = + ruten->second->finnDifferanse(stoppNr, Tilbake); + break; + // Henter differanse ved retning tilbake + } + + //diff = ruten->second->finnDifferanse(stoppNr); + //startSted = ruten->second->hentNavn(Fram); + ruten->second->ruteTabell(diff, startSted, navn); } else // Hvis stoppet ikke finnes på ruten: cout << "\nStoppestedet " << navn << " finnes ikke "