diff --git a/rute.cpp b/rute.cpp index d97283eb75dc0597ddda86ecae551a3999600aa0..cfa5f54210e1698651322bcc8740caa84c5831b3 100644 --- a/rute.cpp +++ b/rute.cpp @@ -4,7 +4,7 @@ * @file rute.cpp * @author Sondre Sand & Frederik Simonsen */ -#include <algorithm> +#include <algorithm> //all_of #include <iostream> #include <iomanip> #include <list> @@ -17,7 +17,40 @@ using namespace std; extern Stoppesteder gStoppestederBase; -// TODO: Fyll på her etter som header-fila tar mer form +//********STOPP FUNKSJONER******************* + + +/** + * Construct a new Stopp:: Stopp object + * + * @param stoppNr + * @param antMin + */ +Stopp::Stopp(const int stoppNr, const int antMin) { + nr = stoppNr; minutter = antMin; +} + +/** + * Henter en stopps unike nr + * + * @return Et stoppesteds unike nr + */ +int Stopp::hentNr() { + return nr; +} + +/** + * skrivTilFil(...) + * + * @param ut + */ +void Stopp::skrivTilFil(ofstream & ut) { + ut << nr << ' ' << minutter << '\n'; +} + +//********RUTE FUNKSJONER******************* + + /** * Rute() */ @@ -26,7 +59,9 @@ Rute::Rute() { } /** - * Rute::Rute(...) + * Opretter en ny rute fra fil + * + * @param inn filen det leses fra */ Rute::Rute(ifstream & inn) { int antStopp, @@ -41,17 +76,98 @@ Rute::Rute(ifstream & inn) { } /** - * @brief Construct a new Stopp:: Stopp object + * -sjekker om lista er mer en 1 entry. * - * @param stoppNr - * @param antMin + * @return true + * @return false */ -Stopp::Stopp(const int stoppNr, const int antMin) { - nr = stoppNr; minutter = antMin; +bool Rute::erListeGyldig(){ + if(stoppene.size() > 1){ + return true; + } + return false; +} + + +bool Rute::erTall(std::string nvn) { + return all_of(nvn.begin(), nvn.end(), ::isdigit); } /** - * lesData() + * Sjekker om stopp er lagt til i ruta allerede + * + * @param nr + * @return true + * @return false + * @see Stopp::hentNr() + */ +bool Rute::finnesStopp(const int indeks) { + for (auto it = stoppene.begin(); it != stoppene.end(); it++) { + if ((*it)->hentNr() == indeks) + return true; + } + return false; +} + +/** + * skriver rute forlengs eller baklengs + * + * @param retning forlengs eller baklengs + * @see Stoppesteder::hentNavnVhaIndeks(...) + */ +void Rute::skrivRute(const Retning retning) { + int minF = 0, + indeks = 0, + totMin = 0; + string navn; + + if (retning == Fram) { + for (auto it = stoppene.begin(); it != stoppene.end(); it++) { + indeks = (*it)->nr; + minF = (*it)->minutter; + navn = gStoppestederBase.hentNavnVhaIndeks(indeks); + totMin += minF; + cout << setw(25) << navn << " - " << setw(2) << minF + << " min fra forrige (" << setw(3) << totMin + << " min fra rutestart)\n"; + } + } + + if (retning == Tilbake) { + for (auto it = stoppene.rbegin(); it != stoppene.rend(); it++) { + indeks = (*it)->nr; + 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; + } + } +} + +/** + * @brief - sletter siste entry i stoppene. + * + */ +void Rute::slettData(){ + stoppene.clear(); +} + +/** + * Leser og oppretter stopp for en ny rute + * + * @see Stoppesteder::byttBokstaver(...) + * @see Stoppesteder::finnesIndex(...) + * @see Stoppesteder::hentNavnVhaIndex(...) + * @see Stoppesteder::finnEntydig(...) + * @see Stoppesteder::finnDuplikat(...) + * @see Rute::finnesStopp(...) + * @see Stoppested::finnesNabo(...) + * @see Stoppested::hentNaboIndeks(...) + * @see Stoppested::hentNaboTid(...) + * @see Stoppested::settNaboIndeks(...) + * @see Stoppested::settNaboTid(...) */ void Rute::lesData() { string navn, @@ -66,17 +182,15 @@ void Rute::lesData() { Stoppested* nStopp = nullptr; cout << "\nStoppested (entydig navn / tall / ENTER for å avslutte): "; - getline(cin, navn); //TODO fortsette her + 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 stoppNr = stoi(navn); //Hvis kun tall, gjør om til int - // Trenger en sjekk om stoppnr faktisk finnes, hvis det gjør det, gjør neste linje * if(gStoppestederBase.finnesIndeks(stoppNr-1)){ //@see finnesIndeks, funker dette? navn = gStoppestederBase.hentNavnVhaIndeks(stoppNr); // Hent navn } - //}else cout << "Stopp finnes ikke!"; //kanskje gjøres til en loop? } fNavn = gStoppestederBase.finnEntydig(navn); // Sjekker for entydighet @@ -90,10 +204,8 @@ void Rute::lesData() { if (nStopp->finnesNabo(naboIndeks+1)) { // Hvis nabo finnes fra før naboIndeks = nStopp->hentNaboIndeks(naboIndeks+1); tidTilF = nStopp->hentNaboTid(naboIndeks); - // Stemmer naboindeks, eller må vi bruke en ny int her e.l. * - //Sjekker foreløping bare etter 1 nabo, må endres så den kan finne alle. nyStopp = new Stopp(indeks+1, tidTilF); - stoppene.push_back(nyStopp); // Disse kan gjøres etter ?* + stoppene.push_back(nyStopp); naboIndeks = indeks; cout << "\nTiden mellom stoppestedene er allerede registrert som " << tidTilF << " minutter.\n"; @@ -101,7 +213,6 @@ void Rute::lesData() { } else { // Hvis nabo ikke finnes fra før: tidTilF = lesInt("Tid fra forrige stopp", 1, 10); // Leser tid til forrige nabo - //indeks = gStoppestederBase.hentIndeksVhaNavn(fNavn); // Finner egen indeks nStopp = gStoppestederBase.finnDuplikat(fNavn); // Finner egen peker fStopp->settNaboIndeks(indeks); // Oppdaterer forrige stopps nabovektor fStopp->settNaboTid(tidTilF); // Oppdaterer forrige stopps tid til nabo @@ -113,7 +224,6 @@ void Rute::lesData() { } } else { // Hvis første stopp på ruten - // indeks = gStoppestederBase.hentIndeksVhaNavn(fNavn); // Riktig indeks 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 @@ -121,10 +231,7 @@ void Rute::lesData() { stoppene.push_back(nyStopp); // Legges til listen naboIndeks = indeks; } - // ?* nNavn = fNavn; // Setter nåværende nabo til å være forrige navn - //naboIndeks = indeks; // Setter nabos indeks til å være forrige indeks - //tidTilE = tidTilF; // Setter tid til neste stopp, til å være egen tid fStopp = nStopp; // Setter forrige stopp til å bli nåværende stopp } else cout << "\nStoppet er allerede registrert på ruten!\n"; @@ -140,7 +247,23 @@ void Rute::lesData() { } /** - * skrivData() + * skrivBeskrivelse() + * skriver forlengs og baklengs + * + * @see Rute::skrivRute(...) + */ +void Rute::skrivBeskrivelse() { + cout << "Ruten:\n"; + skrivRute(Fram); + cout << "\n\n"; + skrivRute(Tilbake); +} + +/** + * Skriver ut en rute + * Første-siste stopp + * + * @see Stoppesteder::hentNavnVhaIndeks(...) */ void Rute::skrivData() const { int startIndeks, @@ -154,20 +277,13 @@ void Rute::skrivData() const { stoppNavn = gStoppestederBase.hentNavnVhaIndeks(stoppIndeks); cout << startNavn << " - " << stoppNavn; - // MÅ finne en eller annen måte å få ut navn i stoppested vha hjelp - // av nummeret som er i structen } /** - * skrivTilFil(...) + * skriver rute til fil * - * @param ut - */ -void Stopp::skrivTilFil(ofstream & ut) { - ut << nr << ' ' << minutter << '\n'; -} -/** - * skrivTilFil(...) + * @param ut fila det skrives til + * @see Stopp::skrivTilFil(...) */ void Rute::skrivTilFil(ofstream & ut) { ut << stoppene.size() << '\n'; @@ -175,93 +291,15 @@ void Rute::skrivTilFil(ofstream & ut) { (*it)->skrivTilFil(ut); } -/** - * Henter en stopps unike nr - * - * @return Et stoppesteds unike nr - */ -int Stopp::hentNr() { - return nr; -} -/** - * skrivBeskrivelse() - */ -void Rute::skrivBeskrivelse() { - cout << "Ruten:\n"; - skrivRute(Fram); - cout << "\n\n"; - skrivRute(Tilbake); -} -/** - * skrivRute(...) - * @param retning - */ -void Rute::skrivRute(const Retning retning) { - int minF = 0, - indeks = 0, - totMin = 0; - string navn; - - if (retning == Fram) { - for (auto it = stoppene.begin(); it != stoppene.end(); it++) { - indeks = (*it)->nr; - minF = (*it)->minutter; - navn = gStoppestederBase.hentNavnVhaIndeks(indeks); - totMin += minF; - cout << setw(25) << navn << " - " << setw(2) << minF - << " min fra forrige (" << setw(3) << totMin - << " min fra rutestart)\n"; - } - } - if (retning == Tilbake) { - for (auto it = stoppene.rbegin(); it != stoppene.rend(); it++) { - indeks = (*it)->nr; - 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; - } - } -} -bool Rute::erTall(std::string nvn) { - return all_of(nvn.begin(), nvn.end(), ::isdigit); -} -/** - * @brief -sjekker om lista er mer en 1 entry. - * - * @return true - * @return false - */ -bool Rute::erListeGyldig(){ - if(stoppene.size() > 1){ - return true; - } - return false; -} -/** - * @brief - sletter siste entry i stoppene. - * - */ -void Rute::slettData(){ - stoppene.clear(); -} -/** - * @brief finnesStopp(...) - * - */ -bool Rute::finnesStopp(const int nr) { - for (auto it = stoppene.begin(); it != stoppene.end(); it++) { - if ((*it)->hentNr() == nr) - return true; - } - return false; -} \ No newline at end of file + + + + + diff --git a/rute.h b/rute.h index 6e95c2ccabe892dcf21c3f4a584dbd133da39d82..320a9a6fba8bcd7767d9d61a3e0abba724124071 100644 --- a/rute.h +++ b/rute.h @@ -19,8 +19,9 @@ struct Stopp { int nr, minutter; // Litt usikker på om denne skal deklareres slik // Eller om den skal under public eller private i Rute Stopp(const int stoppNr, const int antMin); - void skrivTilFil(std::ofstream & ut); int hentNr(); + void skrivTilFil(std::ofstream & ut); + }; /** @@ -33,15 +34,17 @@ class Rute { public: Rute(); Rute(std::ifstream & inn); - bool erTall(std::string nvn); bool erListeGyldig(); - bool finnesStopp(const int nr); + bool erTall(std::string nvn); + bool finnesStopp(const int indeks); + void skrivRute(const Retning retning); + void slettData(); virtual void lesData(); + virtual void skrivBeskrivelse(); virtual void skrivData() const; virtual void skrivTilFil(std::ofstream & ut); - virtual void skrivBeskrivelse(); - void skrivRute(const Retning retning); - void slettData(); + + }; diff --git a/ruter.cpp b/ruter.cpp index 4f43e3612ebc475c4be6b119eb0d465682e9d698..56e3914b61d5278eb68b8642b37e02677c9f375b 100644 --- a/ruter.cpp +++ b/ruter.cpp @@ -18,6 +18,14 @@ using namespace std; extern Stoppesteder gStoppestederBase; + +/** + * ruteNrFinnes(...) + */ +bool Ruter::ruteNrFinnes(const int ruteNr) { + return rutene.count(ruteNr); +} + /** * endreRute() */ @@ -26,7 +34,13 @@ void Ruter::endreRute() { } /** - * TODO: Funksjon som skal håndtere ulike menyvalg fra bruker + * Funksjon som håndterer ulike menyvalg fra bruker + * + * @see nyRute() + * @see skrivAlle() + * @see endreRute() + * @see ruteBeskrivelse() + * @see ruteTabell() */ void Ruter::handling() { char valg; @@ -73,7 +87,14 @@ void Ruter::lesFraFil() { } /** - * nyRute() + * Lager ny rute og putter den inn der det skal + * så lenge ruten har mer enn 1 stopp. + * + * @see Ruter::ruteNrFinnes(...) + * @see Rute::lesData() + * @see Rute::erListeGyldig() + * @see Ruter::ruteBeskrivelse + * @see Rute::slettData() */ void Ruter::nyRute() { int ruteNr; @@ -82,7 +103,7 @@ void Ruter::nyRute() { if (!gStoppestederBase.tom()) { // Hvis det finnes stoppesteder registrert: ruteNr = lesInt("Rutenr", MINRUTER, MAXRUTER); - // Looper til ikke duplikat rutenr blir skrevet inn, evt gjør denne til en if-else + // Looper til ikke duplikat rutenr blir skrevet inn while (ruteNrFinnes(ruteNr)) { cout << "\nDuplikat ruteNr, vennligst prøv igjen.\n"; ruteNr = lesInt("Rutenr", MINRUTER, MAXRUTER); @@ -100,23 +121,21 @@ void Ruter::nyRute() { case 'U': nyRute = new Buss; nyRute->lesData(); break; } - // En funksjon for å sjekke om ruten er gyldig (list.size() > 1, return true) - // Hvis ruten er gyldig, legg til i mappet - // Hvis ugyldig rute, rydd opp i pekere * if(nyRute->erListeGyldig()){ rutene[ruteNr] = nyRute; cout << "\nNy rute er lagt til:\n"; ruteBeskrivelse(ruteNr); }else nyRute->slettData(); - } else // Hvis ingen stoppesteder registrert: cout << "\nIngen stopper registrert i datastrukturen, kan derfor ikke " << "opprette ny rute for øyeblikket.\n\n"; } /** - * ruteBeskrivelse() + * Ber om et rutenummer, skriver ut gitt rute + * + * @see Rute::skrivBeskrivelse() */ void Ruter::ruteBeskrivelse() { int ruteNr; @@ -128,6 +147,13 @@ void Ruter::ruteBeskrivelse() { cout << "\nRuten med dette rutenr eksisterer ikke..\n"; } +/** + * skriver ut rute fra med sent nummer. + * brukes for å skrive rute når den først blir laget. + * + * @param ruteNr -rute som skal skrives ut + * @see Rute::skrivBeskrivelse + */ void Ruter::ruteBeskrivelse(const int ruteNr){ auto it = rutene.find(ruteNr); it->second->skrivBeskrivelse(); @@ -141,7 +167,9 @@ void Ruter::ruteTabell() { } /** - * skrivAlle() + * skriver alle ruter som finnes. + * + * @see Rute::skrivData */ void Ruter::skrivAlle() { cout << "\nFølgende ruter finnes:\n"; @@ -154,7 +182,7 @@ void Ruter::skrivAlle() { } /** - * skrivMeny() + * skriver menyen */ void Ruter::skrivMeny() { cout << "\nFølgende kommandoer er tilgjengelige:\n" @@ -167,6 +195,8 @@ void Ruter::skrivMeny() { /** * Skriver informasjon om ruter til fil + * + * @see Rute::skrivTilFil(...) */ void Ruter::skrivTilFil() { ofstream utfil("ruter.dt2"); // Åpner aktuell fil for skriving @@ -180,9 +210,3 @@ void Ruter::skrivTilFil() { utfil.close(); } -/** - * ruteNrFinnes(...) - */ -bool Ruter::ruteNrFinnes(const int ruteNr) { - return rutene.count(ruteNr); -} \ No newline at end of file diff --git a/ruter.h b/ruter.h index 33d7ea7aa22aed0f171afa378712478d1e357406..744747db7e23b9734799ed5888294e6a0478aef7 100644 --- a/ruter.h +++ b/ruter.h @@ -17,6 +17,7 @@ class Ruter { private: std::map <int, Rute*> rutene; public: + bool ruteNrFinnes(const int ruteNr); void endreRute(); void handling(); void lesFraFil(); @@ -27,7 +28,7 @@ class Ruter { void skrivAlle(); void skrivMeny(); void skrivTilFil(); - bool ruteNrFinnes(const int ruteNr); + }; #endif \ No newline at end of file