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