From 50246e31446fef1831dd2053f2f0459dd2ee7b43 Mon Sep 17 00:00:00 2001 From: fsimonsen <fredersi@stud.ntnu.no> Date: Sun, 3 Apr 2022 22:17:26 +0200 Subject: [PATCH] kommentering, clean up --- bane.cpp | 4 + buss.cpp | 3 +- rute.cpp | 381 ++++++++++++++++++++++++++++------------------- rute.h | 5 +- ruter.cpp | 121 +++++++++------ stoppesteder.cpp | 12 +- 6 files changed, 316 insertions(+), 210 deletions(-) diff --git a/bane.cpp b/bane.cpp index c599c2f..15dae3b 100644 --- a/bane.cpp +++ b/bane.cpp @@ -64,6 +64,10 @@ void Bane::skrivData() const { Rute::skrivData(); // Rute skriver egne datamedlemmer } + +/** + * Skriver ut kort informasjon om banens datamedlemmer i run-time (virtuell) + */ void Bane::skrivKort() const { cout << "\nBanen har " << antVogner << " vogner og banesettet er " << lengde << " meter langt.\n\n"; diff --git a/buss.cpp b/buss.cpp index a743676..6fac640 100644 --- a/buss.cpp +++ b/buss.cpp @@ -80,8 +80,7 @@ void Buss::skrivData() const { } /** - * skrivKort() (virtuell) - * + * Skriver kort informasjon om bussens datamedlemmer (virtuell) */ void Buss::skrivKort() const { cout << "\nBussen har " << antSitt << " sitteplasser, " << antStaa diff --git a/rute.cpp b/rute.cpp index fdebaaf..a39a56e 100644 --- a/rute.cpp +++ b/rute.cpp @@ -4,7 +4,7 @@ * @file rute.cpp * @author Sondre Sand & Frederik Simonsen */ -#include <algorithm> //all_of +#include <algorithm> // all_of, sort #include <iostream> #include <iomanip> #include <list> @@ -22,37 +22,38 @@ extern Stoppesteder gStoppestederBase; /** - * Construct a new Stopp:: Stopp object + * Oppretter et nytt Stopp ifm. rutefunksjonalitet * - * @param stoppNr - * @param antMin + * @param stoppNr - Stoppens unike nummer + * @param antMin - Minutter fra stoppet rett før på ruten */ Stopp::Stopp(const int stoppNr, const int antMin) { + // Kopierer medsendte verdier til å være egne data: nr = stoppNr; minutter = antMin; } /** - * Henter en stopps unike nr + * Henter antall minutter fra en stopp til forrige stopp på ruten * - * @return Et stoppesteds unike nr + * @return Antall minutter fra en stopp til forrige stopp */ -int Stopp::hentNr() { - return nr; +int Stopp::hentMin() { + return minutter; } /** - * @brief henter minutter fra forrige stopp + * Henter en stopps unike nr * - * @return int + * @return Et stoppesteds unike nr */ -int Stopp::hentMin() { - return minutter; +int Stopp::hentNr() { + return nr; } /** - * skrivTilFil(...) + * Skriver ut data om en Stopp til fil * - * @param ut + * @param ut - Filen det skrives til */ void Stopp::skrivTilFil(ofstream & ut) { ut << nr << ' ' << minutter << '\n'; @@ -62,7 +63,7 @@ void Stopp::skrivTilFil(ofstream & ut) { /** - * Rute() + * Default constructor for en Rute, faktiske data leses inn i lesData */ Rute::Rute() { // Gjør ingenting, men må være her så man kan opprette buss/bane @@ -71,105 +72,134 @@ Rute::Rute() { /** * Opretter en ny rute fra fil * - * @param inn filen det leses fra + * @param inn - filen det leses fra */ Rute::Rute(ifstream & inn) { int antStopp, stoppNr, antMin; - inn >> antStopp; inn.ignore(); - for (int i = 0; i < antStopp; i++) { + inn >> antStopp; inn.ignore(); // Leser antall stopp på ruten + for (int i = 0; i < antStopp; i++) { // For hvert stopp: inn >> stoppNr >> antMin; inn.ignore(); + // Oppretter ny stopp på ruten: stoppene.push_back(new Stopp(stoppNr, antMin)); } } /** - * -sjekker om lista er mer en 1 entry. + * Sjekker om en rute har mer enn en stopp (= gyldig rute) * - * @return true - * @return false + * @return true Hvis ruten er gyldig (>1 stopp) + * @return false Hvis ruten ikke er gyldig (<1 stopp) */ -bool Rute::erListeGyldig(){ - if(stoppene.size() > 1){ +bool Rute::erListeGyldig() { + if (stoppene.size() > 1) { return true; } return false; } /** - * @brief + * Går gjennom et medsendt navn fra bruker, sjekker + * alle tegn i strengen er tall eller ei * - * @param nvn - * @return true - * @return false + * @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); } /** - * Sjekker om stopp er lagt til i ruta allerede + * Går gjennom om alle Stopp på en rute for å sjekke om deres + * unike nr matcher en nr som bruker mener finnes på ruten * - * @param nr - * @return true - * @return false + * @param nr - Et stopps nummer som skal forsøkes finnes på ruten + * @return true - Hvis stoppnummeret finnes på ruten + * @return false - Hvis stoppnummeret ikke finnes på ruten * @see Stopp::hentNr() */ -bool Rute::finnesStopp(const int indeks) { +bool Rute::finnesStopp(const int nr) { + // For alle stopp på ruten: for (auto it = stoppene.begin(); it != stoppene.end(); it++) { - if ((*it)->hentNr() == indeks) - return true; + if ((*it)->hentNr() == nr) // Ser om eget nr matcher medsendt nr + return true; // Match, returnerer at stoppet finnes på ruten } - return false; + return false; // Ingen match } /** * Funksjon for å sjekke om et klokkeslett er gyldig (00:00-23:59) * - * @param time - * @param minutt - * @return true - * @return false + * @param time - Time i et klokkeslett som skal sjekkes for gyldighet + * @param minutt - Minutter i et klokkeslett som skal sjekkes for gyldighet + * @return true - Hvis klokkeslettet er gyldig + * @return false - Hvis klokkeslettet er ugyldig (utenfor intervall) */ bool Rute::gyldigTid(const int time, const int minutt) { if ((time >= 0 && time <= 23) && (minutt >= 0 && minutt <= 59)) { - return true; + return true; // Klokkeslett mellom 00:00 og 23:59 } else - return false; + return false; // Klokkeslett utenfor lovlig intervall } +/** + * 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 + * @return Antall minutter mellom et startsted på ruten og et gitt + * stoppested på ruten + * @see Stopp::hentMin() + * @see Stopp:hentNr() + */ int Rute::finnDifferanse(const int nr, const Retning retning) { int totMin = 0; if (retning == Fram) { + // For hvert stopp på ruten: for (auto it = stoppene.begin(); it != stoppene.end(); it++) { - totMin += (*it)->hentMin(); - if ((*it)->hentNr() == nr) - return totMin; + totMin += (*it)->hentMin(); // Teller opp antall minutter + if ((*it)->hentNr() == nr) // Hvis egen stopp + return totMin; // Returnerer antall minutter fra start + // til eget stopp } } else if (retning == Tilbake) { + // For hvert stopp på ruten, traverserer ruten "baklengs": for (auto it = stoppene.rbegin(); it != stoppene.rend(); it++) { - if ((*it)->hentNr() == nr) - return totMin; - totMin += (*it)->hentMin(); + if ((*it)->hentNr() == nr) // Hvis egen stopp + return totMin; // Returnerer antall minutter mellom + totMin += (*it)->hentMin(); // Hvis ikke funn, teller opp + // antall minutter } } return -1; // Skal ikke skje } +/** + * 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(...) + * @see Stopp::hentNr() + */ string Rute::hentNavn(const Retning retning) { string startSted; - if (retning == Fram) { + if (retning == Fram) { // Henter navn på første stopp i listen: startSted = gStoppestederBase.hentNavnVhaIndeks(stoppene.front()->hentNr()); - } else if (retning == Tilbake) + } else if (retning == Tilbake) // Henter navn på bakerste stopp i listen: startSted = gStoppestederBase.hentNavnVhaIndeks(stoppene.back()->hentNr()); - return startSted; + return startSted; // Returnerer navnet på startstopp på ruten } /** - * + * 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 @@ -196,38 +226,44 @@ void Rute::ruteTabell(const int diff, const string start, const string stSted) { cout << "\nRuteavganger fra startstedet (" << start << ") - " << "avslutt med 0 0):\n\n"; - + // 23:53 her da det må være minimum 6 min mellom avganger: cout << "Fra kl. (00:01 - 23:53): "; cin >> startT >> startM; cin.ignore(); // Leser starttid startTid = (startT*60)+startM; // Regner ut første avgangstid - while (!gyldigTid(startT, startM) || startTid > 1433) { // Sørger for at starttid er gyldig + // Sørger for at starttid er gyldig, samt ikke senere enn 23:53 (1433) + while (!gyldigTid(startT, startM) || startTid > 1433) { cout << "\nUlovlig klokkeslett. Prøv igjen (tt mm): "; cin >> startT >> startM; cin.ignore(); startTid = (startT*60)+startM; } - avgangsTid = startTid+diff; - //n = avgangsTid/60; - - while (startT != 0 || startM != 0) { // Så lenge bruker ikke taster 0 0 - avgangsTid = startTid+diff; // mulig denne kan fjernes - if (avgangsTid < 1440) { - avgangstider.push_back(avgangsTid); // Legger start tid i vector - } else { + avgangsTid = startTid+diff; + // Må ha en sjekk her for lang tid mellom stoppesteder, som + // kan føre til at antall minutter blir mer enn 1440 (24:00) + // 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 + } 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 - if (avgangsTid < 1319) { + // 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 + // avganger senere enn 21:59, da vi kun skal lese inn + // for en dag + if (avgangsTid < 1319) { // < 21:59 tidMellom = lesInt("Tid mellom avganger", MINTID, MAXTID); - } else { + } else { // Senere klokkeslett enn 21:59, gjør om output til bruker: tidMellom = lesInt("Tid mellom avganger", MINTID, 1439%startTid); } startTotal = (startT*60)+startM+tidMellom; // Omregner for sjekk - tPrint = startTotal/60; // Regner ut gyldig utskrift: + tPrint = startTotal/60; // Regner ut gyldig utskrift av t og min: mPrint = startTotal%60; cout << "Til kl. (" << ((tPrint < 10) ? "0" : "") << tPrint @@ -242,22 +278,22 @@ void Rute::ruteTabell(const int diff, const string start, const string stSted) { cin >> sluttT >> sluttM; cin.ignore(); sluttTotal = (sluttT*60)+sluttM; // Omregner for sjekk } - - antGanger = (((sluttT-startT)*60)+sluttM-startM)/tidMellom; // Omregning for loop + // Omregning for for-loop, antall avganger som skal legges i vector: + antGanger = (((sluttT-startT)*60)+sluttM-startM)/tidMellom; avgangsTid = startTid+diff; // Setter på differanse en gang - for (int i = 0; i < antGanger; i++) { // Legger til riktig antall avgangstider: + for (int i = 0; i < antGanger; i++) { // For antall avgangstider: avgangsTid = avgangsTid + tidMellom; // Omregning - if (avgangsTid < 1440) { + if (avgangsTid < 1440) { // < 24:00 avgangstider.push_back(avgangsTid); - } else { + } else { // Omregning ved for å unngå 25:xx osv.: avgangstider.push_back(avgangsTid%1440); // Legges i vektor } } - tPrint = (sluttTotal+1)/60; // Regner ut gyldig utskrift: + tPrint = (sluttTotal+1)/60; // Regner ut gyldig utskrift av t og min: mPrint = (sluttTotal+1)%60; - + // Hvis slutttid er før 23:53 (siste lovlige avgang mtp. 6 min): if (sluttTotal < 1433) { cout << "\n\nFra kl. (" << ((tPrint < 10) ? "0" : "") << tPrint << ':' << ((mPrint < 10) ? "0" : "") << mPrint @@ -266,19 +302,22 @@ 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)) { // Sørger for at starttid er gyldig + && (startT != 0 || startM != 0)) { cout << "\nUlovlig klokkeslett. Prøv igjen (tt mm): "; cin >> startT >> startM; cin.ignore(); startTotal = (startT*60)+startM; // Omregning } startTid = (startT*60)+startM; // Omregning - } else { - startT = 0; startM = 0; + } else { // Avslutter innlesning fra bruker hvis slutttid er 23:53 + // eller senere (da det må være +1 min minimum til neste + // avgang). + startT = 0; startM = 0; // Sørger for stopp av innlesning } } cout << "\n\nRutetabell for stoppested: " << stSted << "\n\n"; - //<< ((n < 10) ? "0" : "") << n << ':'; + // Sorterer vektoren, slik at man ikke får duplikat utskrift av + // evt. veldig tidlige avganger og sene avganger: sort(avgangstider.begin(), avgangstider.end()); for (int i = 0; i < avgangstider.size(); i++) { // For hver avgangstid: @@ -286,13 +325,16 @@ void Rute::ruteTabell(const int diff, const string start, const string stSted) { minutter = avgangstider[i]%60; // Regner ut minutter if (timer == n) { // Skriver ut minutter hvis time er lik indikator cout << ' ' << ((minutter < 10) ? "0" : "") << minutter; - } else { // Skriver ut time hvis timer er mer enn indikator - if (timer < 24) { - cout << '\n' << ((timer < 10) ? "0" : "") - << timer << ':' << ' ' << ((minutter < 10) ? "0" : "") - << minutter; - } else { - cout << '\n' << ((timer%24 < 10) ? "0" : "") << timer%24 << ": " << ((minutter < 10) ? "0" : "") + } else { // Skriver ut time hvis time er mer enn indikator + if (timer < 24) { // Hvis time er mindre enn 24: + cout << '\n' << ((timer < 10) ? "0" : "") + << timer << ':' << ' ' << ((minutter < 10) ? "0" : "") + << minutter; + } 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 + << ": " << ((minutter < 10) ? "0" : "") << minutter; } n = timer; // Oppdaterer indikator @@ -301,11 +343,13 @@ void Rute::ruteTabell(const int diff, const string start, const string stSted) { } /** - * skrivRetninger(...) brukes med R T + * Skriver ut til bruker endestasjonene på en rute i begge retninger * + * @see Stopp::hentNr() + * @see Stoppesteder::hentNavnVhaIndeks(...) */ void Rute::skrivRetninger() const { - // Hjelpevariabler for å hente stasjonsnavnene knyttet til ruten: + // Hjelpevariabler for å hente endestasjonsnavnene på ruten: int startIndeks = stoppene.front()->hentNr(), stoppIndeks = stoppene.back()->hentNr(); string startStasjon = gStoppestederBase.hentNavnVhaIndeks(startIndeks), @@ -318,9 +362,10 @@ void Rute::skrivRetninger() const { } /** - * skriver rute forlengs eller baklengs + * Skriver ut hele ruten forlengs eller baklengs, med tid mellom + * stopper samt totaltid på ruten * - * @param retning forlengs eller baklengs + * @param retning Fram (forlengs) eller Tilbake (baklengs) * @see Stoppesteder::hentNavnVhaIndeks(...) */ void Rute::skrivRute(const Retning retning) { @@ -330,11 +375,13 @@ void Rute::skrivRute(const Retning retning) { string navn; if (retning == Fram) { + // For hvert stopp på ruten for (auto it = stoppene.begin(); it != stoppene.end(); it++) { - indeks = (*it)->nr; - minF = (*it)->minutter; + indeks = (*it)->nr; // Henter eget nr + minF = (*it)->minutter; // Henter antall min til forrige stopp + // Henter eget navn: navn = gStoppestederBase.hentNavnVhaIndeks(indeks); - totMin += minF; + totMin += minF; // Oppdaterer totalt antall min på ruten cout << setw(25) << navn << " - " << setw(2) << minF << " min fra forrige (" << setw(3) << totMin << " min fra rutestart)\n"; @@ -342,33 +389,38 @@ void Rute::skrivRute(const Retning retning) { } if (retning == Tilbake) { + // For hvert stopp på ruten, traverserer listen "baklengs": for (auto it = stoppene.rbegin(); it != stoppene.rend(); it++) { - indeks = (*it)->nr; + indeks = (*it)->nr; // Henter eget nr + // Henter eget navn navn = gStoppestederBase.hentNavnVhaIndeks(indeks); cout << setw(25) << navn << " - " << setw(2) << minF << " min fra forrige (" << setw(3) << totMin << " min fra rutestart)\n"; - minF = (*it)->minutter; - totMin += minF; + minF = (*it)->minutter; // Henter antall minutter fra forrige stopp + totMin += minF; // Oppdaterer totalt antall minutter på ruten } } } /** - * @brief - sletter siste entry i stoppene. - * + * Sletter en ugyldig rute (mindre enn et stopp, tømmer listen) */ void Rute::slettData(){ - stoppene.clear(); + stoppene.clear(); // Tømmer listen for stopp } /** - * Leser og oppretter stopp for en ny rute + * Leser og oppretter stopp for en ny rute, så lenge bruker ønsker + * eller det finnes stopp som ikke allerede eksisterer + * på ruten * * @see Stoppesteder::byttBokstaver(...) - * @see Stoppesteder::finnesIndex(...) - * @see Stoppesteder::hentNavnVhaIndex(...) + * @see Rute::erTall(...) + * @see Stoppesteder::finnesIndeks(...) + * @see Stoppesteder::hentNavnVhaIndeks(...) * @see Stoppesteder::finnEntydig(...) + * @see Stoppesteder::hentIndeksVhaNavn(...) * @see Stoppesteder::finnDuplikat(...) * @see Rute::finnesStopp(...) * @see Stoppested::finnesNabo(...) @@ -379,69 +431,91 @@ void Rute::slettData(){ */ void Rute::lesData() { string navn, - fNavn, - nNavn; + fNavn; int stoppNr = 0, indeks = 0, naboIndeks = 0, - tidTilF = 0; - Stopp* nyStopp = nullptr; - Stoppested* fStopp = nullptr; - Stoppested* nStopp = nullptr; + tidTilF = 0; // Tid til forrige nabo + Stopp* nyStopp = nullptr; // Peker til nytt stopp på ruten + Stoppested* fStopp = nullptr; // Peker til forrige faktiske stoppested + Stoppested* nStopp = nullptr; // Peker til nåværende faktiske stoppested cout << "\nStoppested (entydig navn / tall / ENTER for å avslutte): "; getline(cin, navn); while (navn.size() > 0) { //Kjør så lenge ikke blank/enter er trykket. navn = gStoppestederBase.byttBokstaver(navn); // Fjerner æøåÆØÅ - if (erTall(navn)) { // SJekker om navn kun består av tall + if (erTall(navn)) { // Sjekker om navn kun består av tall stoppNr = stoi(navn); //Hvis kun tall, gjør om til int - if(gStoppestederBase.finnesIndeks(stoppNr-1)){ //@see finnesIndeks, funker dette? + // Hvis tallet som er oppgitt er et faktisk stoppstedsnr: + if (gStoppestederBase.finnesIndeks(stoppNr-1)) { navn = gStoppestederBase.hentNavnVhaIndeks(stoppNr); // Hent navn } - } + } fNavn = gStoppestederBase.finnEntydig(navn); // Sjekker for entydighet if (fNavn.size() > 0) { // Hvis entydig navn: cout << '\n' << fNavn << '\n'; + // Henter et stoppesteds faktiske indeks i vector: indeks = gStoppestederBase.hentIndeksVhaNavn(fNavn); - if (!finnesStopp(indeks+1)) { // Hvis stopp ikke finnes fra før på ruten - if (stoppene.size() > 0) { // Hvis ikke første stopp på ruten + // Hvis stopp ikke finnes fra før på ruten: + if (!finnesStopp(indeks+1)) { + + if (stoppene.size() > 0) { // Hvis ikke første stopp på ruten + // Henter peker til eget stoppested: nStopp = gStoppestederBase.finnDuplikat(fNavn); - if (nStopp->finnesNabo(naboIndeks+1)) { // Hvis nabo finnes fra før - naboIndeks = nStopp->hentNaboIndeks(naboIndeks+1); - tidTilF = nStopp->hentNaboTid(naboIndeks); - nyStopp = new Stopp(indeks+1, tidTilF); - stoppene.push_back(nyStopp); - naboIndeks = indeks; - cout << "\nTiden mellom stoppestedene er allerede registrert som " - << tidTilF << " minutter.\n"; - - - } else { // Hvis nabo ikke finnes fra før: - tidTilF = lesInt("Tid fra forrige stopp", 1, 10); // Leser tid til forrige nabo - nStopp = gStoppestederBase.finnDuplikat(fNavn); // Finner egen peker - fStopp->settNaboIndeks(indeks); // Oppdaterer forrige stopps nabovektor - fStopp->settNaboTid(tidTilF); // Oppdaterer forrige stopps tid til nabo - nStopp->settNaboIndeks(naboIndeks); // Oppdaterer nåværende stopps nabovektor - nStopp->settNaboTid(tidTilF); // Oppdaterer naværende stopps tid til nabo - nyStopp = new Stopp(indeks+1, tidTilF); // Oppretter ny stopp på ruten - stoppene.push_back(nyStopp); // Stoppen legges til ruten - naboIndeks = indeks; + // Hvis nabo finnes fra før: + if (nStopp->finnesNabo(naboIndeks+1)) { + // Henter naboens indeks + naboIndeks = nStopp->hentNaboIndeks(naboIndeks+1); + // Henter tid til naboen: + tidTilF = nStopp->hentNaboTid(naboIndeks); + // Oppretter en ny stopp på ruten: + nyStopp = new Stopp(indeks+1, tidTilF); + stoppene.push_back(nyStopp); // Legges i lista + // Oppdaterer naboindeks for videre bruk: + naboIndeks = indeks; + cout << "\nTiden mellom stoppestedene er allerede" + << " registrert som " + << tidTilF << " minutter.\n"; + + + } else { // Hvis nabo ikke finnes fra før: + // Leser tid til forrige nabo: + tidTilF = lesInt("Tid fra forrige stopp", 1, 10); + // Finner egen peker: + nStopp = gStoppestederBase.finnDuplikat(fNavn); + // Oppdaterer forrige stopps nabovektor + fStopp->settNaboIndeks(indeks); + // Oppdaterer forrige stopps tid til nabo + fStopp->settNaboTid(tidTilF); + // Oppdaterer nåværende stopps nabovektor + nStopp->settNaboIndeks(naboIndeks); + // Oppdaterer naværende stopps tid til nabo + nStopp->settNaboTid(tidTilF); + // Oppretter ny stopp på ruten: + nyStopp = new Stopp(indeks+1, tidTilF); + // Stoppen legges til ruten: + stoppene.push_back(nyStopp); + // Oppdaterer naboindeks for videre bruk: + naboIndeks = indeks; + } + + } else { // Hvis første stopp på ruten: + // Henter peker til eget stoppested: + nStopp = gStoppestederBase.finnDuplikat(fNavn); + nyStopp = new Stopp(indeks+1, 0); // Setter stopp sitt nr + // til å korrespondere med indeks i vector, og tid til + // 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; } - - } else { // Hvis første stopp på ruten - nStopp = gStoppestederBase.finnDuplikat(fNavn); // Peker til riktig - nyStopp = new Stopp(indeks+1, 0); // Setter stopp sitt nr - // til å korrespondere med indeks i vector, og tid til - // forrige nabo å være 0, da første stopp på ruten - stoppene.push_back(nyStopp); // Legges til listen - naboIndeks = indeks; - } - nNavn = fNavn; // Setter nåværende nabo til å være forrige navn - fStopp = nStopp; // Setter forrige stopp til å bli nåværende stopp - } else + // Setter peker til forrige stopp til å peke på riktig + // stoppested for videre bruk: + fStopp = nStopp; + } else // Stoppet finnes allerede på ruten: cout << "\nStoppet er allerede registrert på ruten!\n"; } else { // Hvis ikke entydig: cout << "\nIkke funnet (den entydige) stoppestedet!\n"; @@ -450,13 +524,13 @@ void Rute::lesData() { // Forsøker å lese evt. ny eller korrekt stopp: cout << "\nStoppested (entydig navn / tall / ENTER for å avslutte): "; getline(cin, navn); - } + } // Ved enter på første navn/tall for early "uthopp": cout << "\nOk, du angrer og ønsker ikke å legge til ny rute.\n"; } /** - * skrivBeskrivelse() - * skriver forlengs og baklengs + * Skriver hele ruten begge veier (forlengs) og (baklengs) + * ifm. menyvalg R B * * @see Rute::skrivRute(...) */ @@ -468,9 +542,9 @@ void Rute::skrivBeskrivelse() { } /** - * Skriver ut en rute - * Første-siste stopp + * Skriver ut en rutes startstoppested og sluttstoppested * + * @see Stopp::hentNr() * @see Stoppesteder::hentNavnVhaIndeks(...) */ void Rute::skrivData() const { @@ -488,23 +562,24 @@ void Rute::skrivData() const { } /** - * @brief skrivKort() (virtuell) - * + * Skriver ut kort informasjon om en rute (virtuell) */ void Rute::skrivKort() const { - + // Gjør ingenting, må være her så Buss og Bane kan bruke + // sin skrivKort funksjon } /** - * skriver rute til fil + * Skriver ut en rute til fil * * @param ut fila det skrives til * @see Stopp::skrivTilFil(...) */ void Rute::skrivTilFil(ofstream & ut) { - ut << stoppene.size() << '\n'; + ut << stoppene.size() << '\n'; // Skriver ut antall stopp på ruta + // For hver stopp: for (auto it = stoppene.begin(); it != stoppene.end(); it++) - (*it)->skrivTilFil(ut); + (*it)->skrivTilFil(ut); // Stopp skriver seg selv til fil } diff --git a/rute.h b/rute.h index 7a2fb28..7bbc43d 100644 --- a/rute.h +++ b/rute.h @@ -17,8 +17,7 @@ * Stopp (med unikt nummer og antall minutter fra stoppested) */ struct Stopp { - int nr, minutter; // Litt usikker på om denne skal deklareres slik - // Eller om den skal under public eller private i Rute + int nr, minutter; Stopp(const int stoppNr, const int antMin); int hentMin(); int hentNr(); @@ -38,8 +37,8 @@ class Rute { Rute(std::ifstream & inn); bool erListeGyldig(); bool erTall(std::string nvn); + bool finnesStopp(const int nr); bool gyldigTid(const int time, const int minutt); - bool finnesStopp(const int indeks); int finnDifferanse(const int nr, const Retning retning); std::string hentNavn(const Retning retning); void ruteTabell(const int diff, const std::string start, diff --git a/ruter.cpp b/ruter.cpp index ecc1c4b..28347c6 100644 --- a/ruter.cpp +++ b/ruter.cpp @@ -16,11 +16,15 @@ #include "stoppesteder.h" using namespace std; -extern Stoppesteder gStoppestederBase; +extern Stoppesteder gStoppestederBase; // Henter inn globalt objekt /** - * ruteNrFinnes(...) + * Sjekker om et gitt ruteNr finnes i datastrukturen + * + * @param ruteNr - Et ruteNr som skal sjekkes om finnes eller ei + * @return true - Rutenr finnes i datastrukturen + * @return false - Rutenr finnes ikke i datastrukturen */ bool Ruter::ruteNrFinnes(const int ruteNr) { return rutene.count(ruteNr); @@ -36,11 +40,12 @@ void Ruter::endreRute() { /** * Funksjon som håndterer ulike menyvalg fra bruker * - * @see nyRute() - * @see skrivAlle() - * @see endreRute() - * @see ruteBeskrivelse() - * @see ruteTabell() + * @see Ruter::skrivMeny() + * @see Ruter::nyRute() + * @see Ruter::skrivAlle() + * @see Ruter::endreRute() + * @see Ruter::ruteBeskrivelse() + * @see Ruter::ruteTabell() */ void Ruter::handling() { char valg; @@ -62,9 +67,9 @@ void Ruter::handling() { * Leser informasjon om ruter fra fil */ void Ruter::lesFraFil() { - int key, - antRuter; - char ruteType; + int key, // Rutenr, nøkkel til unik rute + antRuter; // antall ruter å lese + char ruteType; // U (=buss), A (=bane) ifstream innfil("ruter.dta"); // Åpner aktuell fil if (innfil) { // Hvis filen funnet: @@ -73,15 +78,15 @@ void Ruter::lesFraFil() { innfil >> key; // Prøver å lese første port while (!innfil.eof()) { // Så lenge ikke slutt på fil: innfil >> ruteType; innfil.ignore(); - switch (ruteType) { + switch (ruteType) { // Oppretter korrekt type objekt: case 'U': rutene[key] = new Buss(innfil); break; case 'A': rutene[key] = new Bane(innfil); break; } - innfil >> key; + innfil >> key; // Forsøker å lese neste post: } - innfil.close(); + innfil.close(); // Lukker aktuell fil - } else + } else // Filen finnes ikke / kunne ikke åpnes: cout << "\nFant ikke filen 'ruter.dta'...\n"; } @@ -92,8 +97,10 @@ void Ruter::lesFraFil() { * * @see Ruter::ruteNrFinnes(...) * @see Rute::lesData() + * @see Bane::lesData() + * @see Buss::lesData() * @see Rute::erListeGyldig() - * @see Ruter::ruteBeskrivelse + * @see Ruter::ruteBeskrivelse(...) * @see Rute::slettData() */ void Ruter::nyRute() { @@ -113,16 +120,17 @@ void Ruter::nyRute() { ruteType = lesChar("Rutetype b(A)ne eller b(U)ss"); } - switch (ruteType) { + switch (ruteType) { // Oppretter korrekt type objekt: case 'A': nyRute = new Bane; nyRute->lesData(); break; case 'U': nyRute = new Buss; nyRute->lesData(); break; } - if (nyRute->erListeGyldig()){ - rutene[ruteNr] = nyRute; + if (nyRute->erListeGyldig()) { // Hvis >1 stopp på ruten: + rutene[ruteNr] = nyRute; // Lagrer ruten cout << "\nNy rute er lagt til:\n"; - ruteBeskrivelse(ruteNr); - } else nyRute->slettData(); + ruteBeskrivelse(ruteNr); // Skriver ut ruten + } else + nyRute->slettData(); // <1 stopp, sletter ruten } else // Rutenummer er duplikat: cout << "\nRutenummeret finnes fra før. Kan ikke legge til rute.\n\n"; @@ -136,23 +144,27 @@ void Ruter::nyRute() { * Ber om et rutenummer, skriver ut gitt rute * * @see Rute::skrivBeskrivelse() + * @see Buss::skrivBeskrivelse() + * @see Bane::skrivBeskrivelse() */ void Ruter::ruteBeskrivelse() { int ruteNr; ruteNr = lesInt("\nRutenr", MINRUTER, MAXRUTER); - auto it = rutene.find(ruteNr); - if (it != rutene.end()) { + auto it = rutene.find(ruteNr); // Forsøker å finne aktuelt rutenr: + if (it != rutene.end()) { // Funn, skriver ut ruten it->second->skrivBeskrivelse(); - } else + } else // Hvis rutenr ikke finnes i datastrukturen: cout << "\nRuten med dette rutenr eksisterer ikke..\n"; } /** - * skriver ut rute fra med sent nummer. + * skriver ut rute fra medsendt nummer (som garantert finnes). * brukes for å skrive rute når den først blir laget. * - * @param ruteNr -rute som skal skrives ut - * @see Rute::skrivBeskrivelse + * @param ruteNr Rutenummeret til ruten som skal skrives ut + * @see Rute::skrivBeskrivelse() + * @see Bane::skrivBeskrivelse() + * @see Buss::skrivBeskrivelse() */ void Ruter::ruteBeskrivelse(const int ruteNr){ auto it = rutene.find(ruteNr); @@ -160,23 +172,40 @@ void Ruter::ruteBeskrivelse(const int ruteNr){ } /** - * ruteTabell() + * Tilbyr bruker å opprette en rutetabell for et angitt stoppested + * hvor tid skal regnes om fra rutens startstoppested uavhengig + * om ruten skrives "forlengs" eller "baklengs" + * + * @see Ruter::ruteNrFinnes(...) + * @see Rute::skriveRetninger() + * @see Rute::skrivKort() + * @see Bane::skrivKort() + * @see Buss::skrivKort() + * @see Rute:skrivRute(...) + * @see Rute::hentNavn(...) + * @see Stoppesteder::byttBokstaver(...) + * @see Stoppesteder::finnEntydig(...) + * @see Stoppesteder::hentIndeksVhaNavn(...) + * @see Rute::finnesStopp(...) + * @see Rute::finnDifferanse(...) + * @see Rute::ruteTabell(...) */ void Ruter::ruteTabell() { int ruteNr, stoppNr, - diff; + diff; // Antall min fra faktisk stoppested til startstoppested char valg; string navn, startSted; - //Rute* ruten = nullptr; if (!rutene.empty()) { // Hvis det er registrert ruter: ruteNr = lesInt("Rutenr", MINRUTER, MAXRUTER); + if (ruteNrFinnes(ruteNr)) { // Hvis rutenummeret finnes: auto ruten = rutene.find(ruteNr); // Iterator til riktig rute ruten->second->skrivRetninger(); // Skriver kort info om ruten valg = lesChar("Rutetabell for retningen (F/T)"); + // Looper til lovlig valg av retning: while (valg != 'F' && valg != 'T') { cout << "\nUgyldig valg, prøv igjen.\n"; @@ -185,7 +214,9 @@ void Ruter::ruteTabell() { ruten->second->skrivKort(); // Skriver info om rutetypen - switch (valg) { // Skriver hele ruten: + switch (valg) { // Skriver hele ruten og henter navn + // på første stoppested på ruten avhengig + // av retning bruker ønsker å se: case 'F': ruten->second->skrivRute(Fram); startSted = ruten->second->hentNavn(Fram); break; case 'T': ruten->second->skrivRute(Tilbake); @@ -212,16 +243,14 @@ void Ruter::ruteTabell() { break; // Henter differanse ved retning tilbake } - - //diff = ruten->second->finnDifferanse(stoppNr); - //startSted = ruten->second->hentNavn(Fram); + // Leser inn rutetabellen og skriver den ut: ruten->second->ruteTabell(diff, startSted, navn); } else // Hvis stoppet ikke finnes på ruten: cout << "\nStoppestedet " << navn << " finnes ikke " << "på denne ruten!\n\n"; - } else + } else // Ikke entydig stoppestedsnavn: cout << "\nIngen entydige stoppestedsnavn funnet\n\n"; @@ -232,22 +261,22 @@ void Ruter::ruteTabell() { } /** - * skriver alle ruter som finnes. + * Skriver alle rutene i datastrukturen * - * @see Rute::skrivData + * @see Rute::skrivData() */ void Ruter::skrivAlle() { cout << "\nFølgende ruter finnes:\n"; - for (const auto & [ruteNr, rute] : rutene) { - cout << ruteNr << ' '; - rute->skrivData(); + for (const auto & [ruteNr, rute] : rutene) { // For hver rute: + cout << ruteNr << ' '; // Skriver rutenr + rute->skrivData(); // Ruten skriver egne data cout << '\n'; } cout << '\n'; } /** - * skriver menyen + * Skriver rutermenyen */ void Ruter::skrivMeny() { cout << "\nFølgende kommandoer er tilgjengelige:\n" @@ -262,16 +291,18 @@ void Ruter::skrivMeny() { * Skriver informasjon om ruter til fil * * @see Rute::skrivTilFil(...) + * @see Bane::skrivTilFil(...) + * @see Buss::skrivTilFil(...) */ void Ruter::skrivTilFil() { ofstream utfil("ruter.dt2"); // Åpner aktuell fil for skriving cout << "\nSkriver til filen 'ruter.dt2'...\n"; - utfil << rutene.size() << '\n'; - for (const auto & val : rutene) { - utfil << val.first << ' '; - (val.second)->skrivTilFil(utfil); + utfil << rutene.size() << '\n'; // Skriver ut antall ruter + for (const auto & val : rutene) { // For hver rute: + utfil << val.first << ' '; // Skriver rutenr + (val.second)->skrivTilFil(utfil); // Ruten skriver seg selv til fil } - utfil.close(); + utfil.close(); // Lukker fil for skriving } diff --git a/stoppesteder.cpp b/stoppesteder.cpp index 6d6adc0..5585a51 100644 --- a/stoppesteder.cpp +++ b/stoppesteder.cpp @@ -9,7 +9,7 @@ #include <string> #include <vector> #include <fstream> -#include <algorithm> // transform +#include <algorithm> // any_of, transform #include "LesData3.h" #include "stoppested.h" #include "stoppesteder.h" @@ -25,7 +25,7 @@ using namespace std; bool Stoppesteder::finnesIndeks(const int nr){ // Sjekker om medsendt nr ikke er større enn vektorens størrelse: if (nr <= stopper.size()) { - for (int i = 0; i < stopper.size(); i++){ // For hver stoppested: + for (int i = 0; i < stopper.size(); i++) { // For hver stoppested: if (i == nr) //hopper ut hvis tall er funnet return true; // Funn } @@ -36,9 +36,9 @@ bool Stoppesteder::finnesIndeks(const int nr){ /** * sjekker om en string inneholder tall. * - * @param nvn - * @return true hvis ikke tall - * @return false hvis har tall + * @param nvn Streng fra bruker som skal sjekkes om inneholder tall + * @return true Hvis tall i strengen + * @return false Hvis ikke tall i strengen */ bool Stoppesteder::ikkeHarTall(const string nvn){ return any_of(nvn.begin(), nvn.end(), ::isdigit); @@ -311,8 +311,6 @@ void Stoppesteder::skrivStopp() { Stoppested* stoppestedet = nullptr; if (!stopper.empty()) { // Hvis det finnes stoppesteder i datastrukturen - // TODO: Lag en funksjon som sørger for at et stoppesteds navn ikke - // TODO: kun kan være tall! cout << "\nAlt om stoppestedet: "; getline(cin, navn); while (navn.size() < 1) { // Sørger for at navn være minst 1 tegn -- GitLab