Skip to content
Snippets Groups Projects
Commit 913426af authored by Frederik Simonsen's avatar Frederik Simonsen
Browse files

Merge branch 'frederik' into 'main'

Frederik

See merge request !4
parents 46747ca6 ac08e32d
Branches
No related tags found
1 merge request!4Frederik
...@@ -64,6 +64,11 @@ void Bane::skrivData() const { ...@@ -64,6 +64,11 @@ void Bane::skrivData() const {
Rute::skrivData(); // Rute skriver egne datamedlemmer Rute::skrivData(); // Rute skriver egne datamedlemmer
} }
void Bane::skrivKort() const {
cout << "\nBanen har " << antVogner << " vogner og banesettet er "
<< lengde << " meter langt.\n\n";
}
/** /**
* Skriver ut alle datamedlemmer for en bane til fil (virtuell) * Skriver ut alle datamedlemmer for en bane til fil (virtuell)
* *
......
...@@ -23,6 +23,7 @@ class Bane : public Rute { ...@@ -23,6 +23,7 @@ class Bane : public Rute {
virtual void lesData(); virtual void lesData();
virtual void skrivBeskrivelse(); virtual void skrivBeskrivelse();
virtual void skrivData() const; virtual void skrivData() const;
virtual void skrivKort() const;
virtual void skrivTilFil(std::ofstream & ut); virtual void skrivTilFil(std::ofstream & ut);
}; };
......
...@@ -64,8 +64,8 @@ void Buss::lesData() { ...@@ -64,8 +64,8 @@ void Buss::lesData() {
*/ */
void Buss::skrivBeskrivelse() { void Buss::skrivBeskrivelse() {
cout << "Bussen har " << antSitt << " sitteplasser, " << antStaa cout << "Bussen har " << antSitt << " sitteplasser, " << antStaa
<< " ståplasser og er " << (leddbuss ? "" : "ikke") << " ståplasser og er " << (leddbuss ? "" : "ikke ")
<< " en leddbuss.\n"; << "en leddbuss.\n";
Rute::skrivBeskrivelse(); // Rute skriver egen informasjon Rute::skrivBeskrivelse(); // Rute skriver egen informasjon
} }
...@@ -79,6 +79,16 @@ void Buss::skrivData() const { ...@@ -79,6 +79,16 @@ void Buss::skrivData() const {
Rute::skrivData(); Rute::skrivData();
} }
/**
* skrivKort() (virtuell)
*
*/
void Buss::skrivKort() const {
cout << "\nBussen har " << antSitt << " sitteplasser, " << antStaa
<< " ståplasser og er " << (leddbuss ? "" : "ikke ")
<< "en leddbuss.\n\n";
}
/** /**
* Skriver ut bussens datamedlemmer til fil (virtuell) * Skriver ut bussens datamedlemmer til fil (virtuell)
* *
......
...@@ -25,6 +25,7 @@ class Buss : public Rute { ...@@ -25,6 +25,7 @@ class Buss : public Rute {
virtual void lesData(); virtual void lesData();
virtual void skrivBeskrivelse(); virtual void skrivBeskrivelse();
virtual void skrivData() const; virtual void skrivData() const;
virtual void skrivKort() const;
virtual void skrivTilFil(std::ofstream & ut); virtual void skrivTilFil(std::ofstream & ut);
}; };
......
...@@ -18,5 +18,7 @@ const int MINSITT = 20; ///< Minimum antall sitteplasser på en buss ...@@ -18,5 +18,7 @@ const int MINSITT = 20; ///< Minimum antall sitteplasser på en buss
const int MAXSITT = 80; ///< Maksimum antall sitteplasser på en buss const int MAXSITT = 80; ///< Maksimum antall sitteplasser på en buss
const int MINSTAA = 10; ///< Minimum antall ståplasser på en buss const int MINSTAA = 10; ///< Minimum antall ståplasser på en buss
const int MAXSTAA = 40; ///< Maksimum antall ståplasser på en buss const int MAXSTAA = 40; ///< Maksimum antall ståplasser på en buss
const int MINTID = 6; ///< Minimum tid mellom avganger
const int MAXTID = 120; ///< Maksimum tid mellom avganger
#endif #endif
/** /**
* Kode-fil for rute-klassen * Kode-fil for rute-klassen
* *
* @file rute.cpp * @file rute.cpp
* @author Sondre Sand & Frederik Simonsen * @author Sondre Sand & Frederik Simonsen
*/ */
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <iomanip> #include <iomanip>
#include <list> #include <list>
#include <fstream> #include <fstream>
#include "const.h"
#include "rute.h" #include "rute.h"
#include "stoppested.h" #include "stoppested.h"
#include "stoppesteder.h" #include "stoppesteder.h"
...@@ -22,9 +23,9 @@ extern Stoppesteder gStoppestederBase; ...@@ -22,9 +23,9 @@ extern Stoppesteder gStoppestederBase;
/** /**
* Construct a new Stopp:: Stopp object * Construct a new Stopp:: Stopp object
* *
* @param stoppNr * @param stoppNr
* @param antMin * @param antMin
*/ */
Stopp::Stopp(const int stoppNr, const int antMin) { Stopp::Stopp(const int stoppNr, const int antMin) {
nr = stoppNr; minutter = antMin; nr = stoppNr; minutter = antMin;
...@@ -32,17 +33,26 @@ Stopp::Stopp(const int stoppNr, const int antMin) { ...@@ -32,17 +33,26 @@ Stopp::Stopp(const int stoppNr, const int antMin) {
/** /**
* Henter en stopps unike nr * Henter en stopps unike nr
* *
* @return Et stoppesteds unike nr * @return Et stoppesteds unike nr
*/ */
int Stopp::hentNr() { int Stopp::hentNr() {
return nr; return nr;
} }
/**
* @brief henter minutter fra forrige stopp
*
* @return int
*/
int Stopp::hentMin() {
return minutter;
}
/** /**
* skrivTilFil(...) * skrivTilFil(...)
* *
* @param ut * @param ut
*/ */
void Stopp::skrivTilFil(ofstream & ut) { void Stopp::skrivTilFil(ofstream & ut) {
ut << nr << ' ' << minutter << '\n'; ut << nr << ' ' << minutter << '\n';
...@@ -60,7 +70,7 @@ Rute::Rute() { ...@@ -60,7 +70,7 @@ Rute::Rute() {
/** /**
* Opretter en ny rute fra fil * Opretter en ny rute fra fil
* *
* @param inn filen det leses fra * @param inn filen det leses fra
*/ */
Rute::Rute(ifstream & inn) { Rute::Rute(ifstream & inn) {
...@@ -77,9 +87,9 @@ Rute::Rute(ifstream & inn) { ...@@ -77,9 +87,9 @@ Rute::Rute(ifstream & inn) {
/** /**
* -sjekker om lista er mer en 1 entry. * -sjekker om lista er mer en 1 entry.
* *
* @return true * @return true
* @return false * @return false
*/ */
bool Rute::erListeGyldig(){ bool Rute::erListeGyldig(){
if(stoppene.size() > 1){ if(stoppene.size() > 1){
...@@ -88,18 +98,24 @@ bool Rute::erListeGyldig(){ ...@@ -88,18 +98,24 @@ bool Rute::erListeGyldig(){
return false; return false;
} }
/**
* @brief
*
* @param nvn
* @return true
* @return false
*/
bool Rute::erTall(std::string nvn) { bool Rute::erTall(std::string nvn) {
return all_of(nvn.begin(), nvn.end(), ::isdigit); return all_of(nvn.begin(), nvn.end(), ::isdigit);
} }
/** /**
* Sjekker om stopp er lagt til i ruta allerede * Sjekker om stopp er lagt til i ruta allerede
* *
* @param nr * @param nr
* @return true * @return true
* @return false * @return false
* @see Stopp::hentNr() * @see Stopp::hentNr()
*/ */
bool Rute::finnesStopp(const int indeks) { bool Rute::finnesStopp(const int indeks) {
for (auto it = stoppene.begin(); it != stoppene.end(); it++) { for (auto it = stoppene.begin(); it != stoppene.end(); it++) {
...@@ -110,8 +126,173 @@ bool Rute::finnesStopp(const int indeks) { ...@@ -110,8 +126,173 @@ bool Rute::finnesStopp(const int indeks) {
} }
/** /**
* skriver rute forlengs eller baklengs * 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;
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
}
string Rute::hentNavn(const Retning retning) {
string startSted;
if (retning == Fram) {
startSted = gStoppestederBase.hentNavnVhaIndeks(stoppene.front()->hentNr());
} else if (retning == Tilbake)
startSted = gStoppestederBase.hentNavnVhaIndeks(stoppene.back()->hentNr());
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, // 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
antGanger, // omregning for å legge inn riktig antall avgangstider
startTid, // omregning for å legge inn starttid
n, // hjelpevariabel for linjeskift ved ny time
timer, // hjelpevariabel for å skrive ut time
minutter, // hjelpevariabel for å skrive ut minutter
avgangsTid, // omregning for å legge inn riktig avgangstid
mPrint; // hjelpevariabel for å sørge for korrekt utskrift av minutter
vector <int> avgangstider; // Hjelpevektor for å ta vare på avgangstider
cout << "\nRuteavganger fra startstedet (" << start << ") - "
<< "avslutt med 0 0):\n\n";
cout << "Fra kl. (00:01 - 23:59): ";
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();
}
startTid = (startT*60)+startM; // Regner ut første avgangstid
n = startT; // Setter indikator til å være første starttime
while (startT != 0 || startM != 0) { // Så lenge bruker ikke taster 0 0
avgangstider.push_back(startTid+diff); // Legger start tid i vector
// Leser tid mellom avganger
tidMellom = lesInt("Tid mellom avganger", MINTID, MAXTID);
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
}
antGanger = ((sluttT-startT)*60)/tidMellom; // Omregning for loop
avgangsTid = startTid+diff; // Setter på differanse en gang
for (int i = 0; i < antGanger; i++) { // Legger til riktig antall avgangstider:
avgangsTid = avgangsTid + tidMellom; // Omregning
avgangstider.push_back(avgangsTid); // Legges i vektor
}
tPrint = (sluttTotal+1)/60; // Regner ut gyldig utskrift:
mPrint = (sluttTotal+1)%60;
cout << "\n\nFra kl. (" << ((tPrint < 10) ? "0" : "") << tPrint
<< ':' << ((mPrint < 10) ? "0" : "") << mPrint
<< " - 23:59): ";
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; // Omregning
}
startTid = (startT*60)+startM; // Omregning
}
cout << "\n\nRutetabell for stoppested: " << stSted << "\n\n"
<< ((n < 10) ? "0" : "") << n << ':';
for (int i = 0; i < avgangstider.size(); i++) { // For hver avgangstid:
timer = avgangstider[i]/60; // Regner ut time
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
cout << '\n' << ((timer < 10) ? "0" : "")
<< timer << ':' << ' ' << ((minutter < 10) ? "0" : "")
<< minutter;
n = timer; // Oppdaterer indikator
}
}
}
/**
* skrivRetninger(...) brukes med R T
*
*/
void Rute::skrivRetninger() const {
// Hjelpevariabler for å hente stasjonsnavnene knyttet til ruten:
int startIndeks = stoppene.front()->hentNr(),
stoppIndeks = stoppene.back()->hentNr();
string startStasjon = gStoppestederBase.hentNavnVhaIndeks(startIndeks),
endeStasjon = gStoppestederBase.hentNavnVhaIndeks(stoppIndeks);
// Skriver ut start- og endestasjon for ruten i begge retninger:
cout << "\nFram: Retningen: " << startStasjon << " - "
<< endeStasjon << "\nTilbake: Retningen: "
<< endeStasjon << " - " << startStasjon << '\n';
}
/**
* skriver rute forlengs eller baklengs
*
* @param retning forlengs eller baklengs * @param retning forlengs eller baklengs
* @see Stoppesteder::hentNavnVhaIndeks(...) * @see Stoppesteder::hentNavnVhaIndeks(...)
*/ */
...@@ -120,7 +301,7 @@ void Rute::skrivRute(const Retning retning) { ...@@ -120,7 +301,7 @@ void Rute::skrivRute(const Retning retning) {
indeks = 0, indeks = 0,
totMin = 0; totMin = 0;
string navn; string navn;
if (retning == Fram) { if (retning == Fram) {
for (auto it = stoppene.begin(); it != stoppene.end(); it++) { for (auto it = stoppene.begin(); it != stoppene.end(); it++) {
indeks = (*it)->nr; indeks = (*it)->nr;
...@@ -148,7 +329,7 @@ void Rute::skrivRute(const Retning retning) { ...@@ -148,7 +329,7 @@ void Rute::skrivRute(const Retning retning) {
/** /**
* @brief - sletter siste entry i stoppene. * @brief - sletter siste entry i stoppene.
* *
*/ */
void Rute::slettData(){ void Rute::slettData(){
stoppene.clear(); stoppene.clear();
...@@ -156,7 +337,7 @@ void Rute::slettData(){ ...@@ -156,7 +337,7 @@ void Rute::slettData(){
/** /**
* Leser og oppretter stopp for en ny rute * Leser og oppretter stopp for en ny rute
* *
* @see Stoppesteder::byttBokstaver(...) * @see Stoppesteder::byttBokstaver(...)
* @see Stoppesteder::finnesIndex(...) * @see Stoppesteder::finnesIndex(...)
* @see Stoppesteder::hentNavnVhaIndex(...) * @see Stoppesteder::hentNavnVhaIndex(...)
...@@ -180,19 +361,19 @@ void Rute::lesData() { ...@@ -180,19 +361,19 @@ void Rute::lesData() {
Stopp* nyStopp = nullptr; Stopp* nyStopp = nullptr;
Stoppested* fStopp = nullptr; Stoppested* fStopp = nullptr;
Stoppested* nStopp = nullptr; Stoppested* nStopp = nullptr;
cout << "\nStoppested (entydig navn / tall / ENTER for å avslutte): "; cout << "\nStoppested (entydig navn / tall / ENTER for å avslutte): ";
getline(cin, navn); getline(cin, navn);
while (navn.size() > 0) { //Kjør så lenge ikke blank/enter er trykket. while (navn.size() > 0) { //Kjør så lenge ikke blank/enter er trykket.
navn = gStoppestederBase.byttBokstaver(navn); // Fjerner æøåÆØÅ 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 stoppNr = stoi(navn); //Hvis kun tall, gjør om til int
if(gStoppestederBase.finnesIndeks(stoppNr-1)){ //@see finnesIndeks, funker dette? if(gStoppestederBase.finnesIndeks(stoppNr-1)){ //@see finnesIndeks, funker dette?
navn = gStoppestederBase.hentNavnVhaIndeks(stoppNr); // Hent navn navn = gStoppestederBase.hentNavnVhaIndeks(stoppNr); // Hent navn
} }
} }
fNavn = gStoppestederBase.finnEntydig(navn); // Sjekker for entydighet fNavn = gStoppestederBase.finnEntydig(navn); // Sjekker for entydighet
if (fNavn.size() > 0) { // Hvis entydig navn: if (fNavn.size() > 0) { // Hvis entydig navn:
...@@ -209,7 +390,7 @@ void Rute::lesData() { ...@@ -209,7 +390,7 @@ void Rute::lesData() {
naboIndeks = indeks; naboIndeks = indeks;
cout << "\nTiden mellom stoppestedene er allerede registrert som " cout << "\nTiden mellom stoppestedene er allerede registrert som "
<< tidTilF << " minutter.\n"; << tidTilF << " minutter.\n";
} else { // Hvis nabo ikke finnes fra før: } else { // Hvis nabo ikke finnes fra før:
tidTilF = lesInt("Tid fra forrige stopp", 1, 10); // Leser tid til forrige nabo tidTilF = lesInt("Tid fra forrige stopp", 1, 10); // Leser tid til forrige nabo
...@@ -238,10 +419,10 @@ void Rute::lesData() { ...@@ -238,10 +419,10 @@ void Rute::lesData() {
} else { // Hvis ikke entydig: } else { // Hvis ikke entydig:
cout << "\nIkke funnet (den entydige) stoppestedet!\n"; cout << "\nIkke funnet (den entydige) stoppestedet!\n";
} }
// Forsøker å lese evt. ny eller korrekt stopp: // Forsøker å lese evt. ny eller korrekt stopp:
cout << "\nStoppested (entydig navn / tall / ENTER for å avslutte): "; cout << "\nStoppested (entydig navn / tall / ENTER for å avslutte): ";
getline(cin, navn); getline(cin, navn);
} }
cout << "\nOk, du angrer og ønsker ikke å legge til ny rute.\n"; cout << "\nOk, du angrer og ønsker ikke å legge til ny rute.\n";
} }
...@@ -249,7 +430,7 @@ void Rute::lesData() { ...@@ -249,7 +430,7 @@ void Rute::lesData() {
/** /**
* skrivBeskrivelse() * skrivBeskrivelse()
* skriver forlengs og baklengs * skriver forlengs og baklengs
* *
* @see Rute::skrivRute(...) * @see Rute::skrivRute(...)
*/ */
void Rute::skrivBeskrivelse() { void Rute::skrivBeskrivelse() {
...@@ -262,7 +443,7 @@ void Rute::skrivBeskrivelse() { ...@@ -262,7 +443,7 @@ void Rute::skrivBeskrivelse() {
/** /**
* Skriver ut en rute * Skriver ut en rute
* Første-siste stopp * Første-siste stopp
* *
* @see Stoppesteder::hentNavnVhaIndeks(...) * @see Stoppesteder::hentNavnVhaIndeks(...)
*/ */
void Rute::skrivData() const { void Rute::skrivData() const {
...@@ -270,7 +451,7 @@ void Rute::skrivData() const { ...@@ -270,7 +451,7 @@ void Rute::skrivData() const {
stoppIndeks; stoppIndeks;
string startNavn, string startNavn,
stoppNavn; stoppNavn;
startIndeks = stoppene.front()->hentNr(); // Henter startsteds unike nr startIndeks = stoppene.front()->hentNr(); // Henter startsteds unike nr
stoppIndeks = stoppene.back()->hentNr(); // Henter stopsteds unike nr stoppIndeks = stoppene.back()->hentNr(); // Henter stopsteds unike nr
startNavn = gStoppestederBase.hentNavnVhaIndeks(startIndeks); startNavn = gStoppestederBase.hentNavnVhaIndeks(startIndeks);
...@@ -279,9 +460,17 @@ void Rute::skrivData() const { ...@@ -279,9 +460,17 @@ void Rute::skrivData() const {
cout << startNavn << " - " << stoppNavn; cout << startNavn << " - " << stoppNavn;
} }
/**
* @brief skrivKort() (virtuell)
*
*/
void Rute::skrivKort() const {
}
/** /**
* skriver rute til fil * skriver rute til fil
* *
* @param ut fila det skrives til * @param ut fila det skrives til
* @see Stopp::skrivTilFil(...) * @see Stopp::skrivTilFil(...)
*/ */
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#define __RUTE_H #define __RUTE_H
#include <list> #include <list>
#include <string>
#include <fstream> #include <fstream>
#include "enum.h" #include "enum.h"
...@@ -19,6 +20,7 @@ struct Stopp { ...@@ -19,6 +20,7 @@ struct Stopp {
int nr, minutter; // Litt usikker på om denne skal deklareres slik int nr, minutter; // Litt usikker på om denne skal deklareres slik
// Eller om den skal under public eller private i Rute // Eller om den skal under public eller private i Rute
Stopp(const int stoppNr, const int antMin); Stopp(const int stoppNr, const int antMin);
int hentMin();
int hentNr(); int hentNr();
void skrivTilFil(std::ofstream & ut); void skrivTilFil(std::ofstream & ut);
...@@ -36,12 +38,19 @@ class Rute { ...@@ -36,12 +38,19 @@ class Rute {
Rute(std::ifstream & inn); Rute(std::ifstream & inn);
bool erListeGyldig(); bool erListeGyldig();
bool erTall(std::string nvn); bool erTall(std::string nvn);
bool gyldigTid(const int time, const int minutt);
bool finnesStopp(const int indeks); 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,
const std::string stSted);
void skrivRetninger() const;
void skrivRute(const Retning retning); void skrivRute(const Retning retning);
void slettData(); void slettData();
virtual void lesData(); virtual void lesData();
virtual void skrivBeskrivelse(); virtual void skrivBeskrivelse();
virtual void skrivData() const; virtual void skrivData() const;
virtual void skrivKort() const;
virtual void skrivTilFil(std::ofstream & ut); virtual void skrivTilFil(std::ofstream & ut);
......
...@@ -103,29 +103,29 @@ void Ruter::nyRute() { ...@@ -103,29 +103,29 @@ void Ruter::nyRute() {
if (!gStoppestederBase.tom()) { // Hvis det finnes stoppesteder registrert: if (!gStoppestederBase.tom()) { // Hvis det finnes stoppesteder registrert:
ruteNr = lesInt("Rutenr", MINRUTER, MAXRUTER); ruteNr = lesInt("Rutenr", MINRUTER, MAXRUTER);
// Looper til ikke duplikat rutenr blir skrevet inn // Hvis ikke duplikat rutenr blir skrevet inn:
while (ruteNrFinnes(ruteNr)) { if (!ruteNrFinnes(ruteNr)) {
cout << "\nDuplikat ruteNr, vennligst prøv igjen.\n";
ruteNr = lesInt("Rutenr", MINRUTER, MAXRUTER);
}
ruteType = lesChar("Rutetype b(A)ne eller b(U)ss");
// Looper til lovlig valg av rutetype blir lest inn:
while (ruteType != 'A' && ruteType != 'U') {
cout << "\nUgyldig valg, prøv igjen.\n";
ruteType = lesChar("Rutetype b(A)ne eller b(U)ss"); ruteType = lesChar("Rutetype b(A)ne eller b(U)ss");
} // Looper til lovlig valg av rutetype blir lest inn:
while (ruteType != 'A' && ruteType != 'U') {
cout << "\nUgyldig valg, prøv igjen.\n";
ruteType = lesChar("Rutetype b(A)ne eller b(U)ss");
}
switch (ruteType) { switch (ruteType) {
case 'A': nyRute = new Bane; nyRute->lesData(); break; case 'A': nyRute = new Bane; nyRute->lesData(); break;
case 'U': nyRute = new Buss; nyRute->lesData(); break; case 'U': nyRute = new Buss; nyRute->lesData(); break;
} }
if(nyRute->erListeGyldig()){ if (nyRute->erListeGyldig()){
rutene[ruteNr] = nyRute; rutene[ruteNr] = nyRute;
cout << "\nNy rute er lagt til:\n"; cout << "\nNy rute er lagt til:\n";
ruteBeskrivelse(ruteNr); ruteBeskrivelse(ruteNr);
}else nyRute->slettData(); } else nyRute->slettData();
} else // Rutenummer er duplikat:
cout << "\nRutenummeret finnes fra før. Kan ikke legge til rute.\n\n";
} else // Hvis ingen stoppesteder registrert: } else // Hvis ingen stoppesteder registrert:
cout << "\nIngen stopper registrert i datastrukturen, kan derfor ikke " cout << "\nIngen stopper registrert i datastrukturen, kan derfor ikke "
...@@ -163,7 +163,72 @@ void Ruter::ruteBeskrivelse(const int ruteNr){ ...@@ -163,7 +163,72 @@ void Ruter::ruteBeskrivelse(const int ruteNr){
* ruteTabell() * ruteTabell()
*/ */
void Ruter::ruteTabell() { void Ruter::ruteTabell() {
int ruteNr,
stoppNr,
diff;
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";
valg = lesChar("Rutetabell for retningen (F/T)");
}
ruten->second->skrivKort(); // Skriver info om rutetypen
switch (valg) { // Skriver hele ruten:
case 'F': ruten->second->skrivRute(Fram);
startSted = ruten->second->hentNavn(Fram); break;
case 'T': ruten->second->skrivRute(Tilbake);
startSted = ruten->second->hentNavn(Tilbake); break;
}
cout << "\n\nRutetabell for stoppestedet (navn): ";
getline(cin, navn);
navn = gStoppestederBase.byttBokstaver(navn); // bytter æøåÆØÅ
navn = gStoppestederBase.finnEntydig(navn); // Sjekker for entydighet
if (navn.size() > 0) { // Hvis navn er entydig:
// Henter stoppestedets unike nr:
stoppNr = gStoppestederBase.hentIndeksVhaNavn(navn) + 1;
//Hvis stoppestedet finnes på ruten:
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 "
<< "på denne ruten!\n\n";
} else
cout << "\nIngen entydige stoppestedsnavn funnet\n\n";
} else // Hvis rutenummeret ikke finnes:
cout << "\nDette rutenummeret er ikke registrert.\n\n";
} else // Hvis ingen ruter registrert:
cout << "\nIngen ruter registrert i programmet.\n\n";
} }
/** /**
......
...@@ -33,6 +33,16 @@ bool Stoppesteder::finnesIndeks(const int nr){ ...@@ -33,6 +33,16 @@ bool Stoppesteder::finnesIndeks(const int nr){
return false; // Ingen funn return false; // Ingen funn
} }
/**
* sjekker om en string inneholder tall.
*
* @param nvn
* @return true hvis ikke tall
* @return false hvis har tall
*/
bool Stoppesteder::ikkeHarTall(const string nvn){
return any_of(nvn.begin(), nvn.end(), ::isdigit);
}
/** /**
* Sjekker om Stoppesteder sin vektor er tom eller ei * Sjekker om Stoppesteder sin vektor er tom eller ei
* *
...@@ -224,6 +234,7 @@ void Stoppesteder::lesFraFil() { ...@@ -224,6 +234,7 @@ void Stoppesteder::lesFraFil() {
/** /**
* Legger til et nytt stoppested i datastrukturen, hvis mulig (ingen duplikat) * Legger til et nytt stoppested i datastrukturen, hvis mulig (ingen duplikat)
* *
* @see Stoppesteder::ikkeHarTall(...)
* @see Stoppesteder::byttBokstaver(...) * @see Stoppesteder::byttBokstaver(...)
* @see Stoppesteder::finnDuplikat(...) * @see Stoppesteder::finnDuplikat(...)
* @see Stoppested::Stoppested(...) * @see Stoppested::Stoppested(...)
...@@ -234,8 +245,9 @@ void Stoppesteder::nyStop() { ...@@ -234,8 +245,9 @@ void Stoppesteder::nyStop() {
// TODO: Lag en funksjon som sørger for at et stoppesteds navn ikke // TODO: Lag en funksjon som sørger for at et stoppesteds navn ikke
// TODO: kun kan være tall! // TODO: kun kan være tall!
cout << "\nNavn på stoppested: "; getline(cin,navn); // Leser navn cout << "\nNavn på stoppested: "; getline(cin,navn); // Leser navn
while (navn.size() < 2) { // Looper hvis navn er >2 tegn while (navn.size() < 2 || ikkeHarTall(navn)) { // Looper hvis navn er >2 tegn
cout << "\nNavn må være 2 tegn eller mer. Prøv igjen: "; cout << "\nNavn kan ikke inneholde tall, og må være 2 tegn eller mer."
<< " Prøv igjen: ";
getline(cin, navn); getline(cin, navn);
} }
...@@ -303,7 +315,7 @@ void Stoppesteder::skrivStopp() { ...@@ -303,7 +315,7 @@ void Stoppesteder::skrivStopp() {
// TODO: kun kan være tall! // TODO: kun kan være tall!
cout << "\nAlt om stoppestedet: "; getline(cin, navn); cout << "\nAlt om stoppestedet: "; getline(cin, navn);
while (navn.size() < 2) { // Sørger for at navn må ha mer enn 1 tegn while (navn.size() < 1) { // Sørger for at navn være minst 1 tegn
cout << "\nNavn må være 2 tegn eller mer. Prøv igjen: "; cout << "\nNavn må være 2 tegn eller mer. Prøv igjen: ";
getline(cin, navn); getline(cin, navn);
} }
......
...@@ -20,6 +20,7 @@ class Stoppesteder { ...@@ -20,6 +20,7 @@ class Stoppesteder {
std::vector <Stoppested*> stopper; std::vector <Stoppested*> stopper;
public: public:
bool finnesIndeks(const int nr); bool finnesIndeks(const int nr);
bool ikkeHarTall(const std::string nvn);
bool tom(); bool tom();
int hentIndeksVhaNavn(const std::string nvn); int hentIndeksVhaNavn(const std::string nvn);
std::string byttBokstaver(const std::string nvn); std::string byttBokstaver(const std::string nvn);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment