Skip to content
Snippets Groups Projects

Frederik

3 files
+ 143
25
Compare changes
  • Side-by-side
  • Inline

Files

+ 132
21
@@ -11,12 +11,14 @@
#include <fstream>
#include "const.h"
#include "rute.h"
#include "ruter.h"
#include "stoppested.h"
#include "stoppesteder.h"
#include "LesData3.h"
using namespace std;
extern Stoppesteder gStoppestederBase;
extern Ruter gRuterBase;
//********STOPP FUNKSJONER*******************
@@ -100,6 +102,40 @@ bool Rute::erListeGyldig() {
return false;
}
bool Rute::erNabo(Stopp* s1, Stopp* s2) {
int fPos,
aPos,
temp,
avstand;
auto it = find(stoppene.begin(), stoppene.end(), s1);
if (it != stoppene.end()) { // Funn av stoppNr
fPos = distance(stoppene.begin(), it);
}
auto it2 = find(stoppene.begin(), stoppene.end(), s2);
if (it2 != stoppene.end()) { // Funn av stoppNr
aPos = distance(stoppene.begin(), it2);
}
if (fPos < aPos) { // Hvis første er før på ruten enn andre
avstand = aPos-fPos; // Setter avstand mellom stopp på ruten
} else if (fPos > aPos) {
temp = fPos; // Gjør om slik at første stopp på ruten kommer først
fPos = aPos;
aPos = temp;
avstand = aPos-fPos;
} else if (fPos == aPos) { // Skal ikke skje
cout << "\nHer er det noe alvorlig galt.\n\n";
}
if (avstand == 1) { // Stoppene er naboer
return true;
}
// Stoppene er ikke naboer:
return false;
}
/**
* Går gjennom et medsendt navn fra bruker, sjekker
* alle tegn i strengen er tall eller ei
@@ -148,7 +184,7 @@ bool Rute::gyldigTid(const int time, const int minutt) {
/**
* 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
@@ -179,9 +215,23 @@ int Rute::finnDifferanse(const int nr, const Retning retning) {
return -1; // Skal ikke skje
}
/**
* Henter hvor et stopp er i rute listen stoppene.
*
* @param stoppNr
* @return int - returnerer hvor i lista stoppet er.
*/
int Rute::hentRuteIndeks(const int stoppNr) {
int indeks;
auto it = find(stoppene.begin(), stoppene.end(), stoppNr);
indeks = distance(stoppene.begin(), it);
return indeks;
}
/**
* 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(...)
@@ -195,21 +245,82 @@ string Rute::hentNavn(const Retning retning) {
startSted = gStoppestederBase.hentNavnVhaIndeks(stoppene.back()->hentNr());
return startSted; // Returnerer navnet på startstopp på ruten
}
} //må endres til å ta imot peker! return peker.
/**
* TODO: fjernStopp()
* TODO: fjernStopp()
* Husk at her må avstanden mellom stoppene være mer enn direkte naboer (>1)
* Skal fjerne de i mellom to stoppesteder ikke stoppestedene som blir oppgitt
*/
void Rute::fjernStopp() {
int stoppNr, sIndeks, lIndeks;
string navn, navn2, sNavn, lNavn; //start og last
Stopp* sStopp = nullptr;
Stopp* lStopp = nullptr;
auto itS = stoppene.begin();
cout << "\n\nMellom start\n"
<< "Stoppested (entydig navn / tall / ENTER for å avslutte): ";
getline(cin, navn);
while (navn.size() > 0) {
navn = gStoppestederBase.byttBokstaver(navn);
if (erTall(navn)) { stoppNr = stoi(navn); }
if (gStoppestederBase.finnesIndeks(stoppNr-1)) {
navn = gStoppestederBase.hentNavnVhaIndeks(stoppNr); }
sNavn = gStoppestederBase.finnEntydig(navn);
stoppNr=gStoppestederBase.hentIndeksVhaNavn(sNavn); //finner indeks fra vektor.
if (finnesStopp(stoppNr+1)){ //sjekker at stopp finnes på lista.
//peker? indeks? hvordan fikse???
sIndeks=hentRuteIndeks(stoppNr+1); //henter hvor på lista stoppet er
advance (itS, sIndeks+1); //setter iterator start til en forbi stoppet
navn = ""; //hopper ut av while.
}else {
cout << "\nStoppet finnes ikke på ruta!";
cout << "\n\nMellom start\n"
<< "Stoppested (entydig navn / tall / ENTER for å avslutte): ";
getline(cin, navn);
}
}
auto itL= stoppene.begin(); //setter slutt(last) stopper til start.
cout << "\n\nMellom slutt\nStopp kan ikke være nabo eller samme som start!"
<< "Stoppested (entydig navn / tall / ENTER for å avslutte): ";
getline(cin, navn2);
while (navn2.size() > 0) { // Så lenge ikke skrevet enter:
navn = gStoppestederBase.byttBokstaver(navn2); // fjerner æøåÆØÅ
if (erTall(navn2)) { // Sjekker om input kun er tall
stoppNr = stoi(navn2); // Hvis kun tall, gjør om til int
}
if (gStoppestederBase.finnesIndeks(stoppNr-1)) {
// Henter det faktiske navnet
navn2 = gStoppestederBase.hentNavnVhaIndeks(stoppNr);
}
lNavn = gStoppestederBase.finnEntydig(navn);
stoppNr=gStoppestederBase.hentIndeksVhaNavn(lNavn);
if (finnesStopp(stoppNr+1)){
lIndeks=hentRuteIndeks(stoppNr+1);
advance (itL, lIndeks);
navn = "";
}else {
cout << "\nStoppet finnes ikke på ruta!";
cout << "\nStopp kan ikke være nabo eller samme som start!";
cout << "\n\nMellom slutt\n"
<< "Stoppested (entydig navn / tall / ENTER for å avslutte): ";
getline(cin, navn);
}
stoppene.erase(itS, itL);
}
}
/**
* 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
* @param stSted - faktisk navn på aktuellt stoppested
@@ -241,12 +352,12 @@ void Rute::ruteTabell(const int diff, const string start, const string stSted) {
startTid = (startT*60)+startM; // Regner ut første avgangstid
// Sørger for at starttid er gyldig, samt ikke senere enn 23:53 (1433)
while (!gyldigTid(startT, startM) || startTid > 1433) {
while (!gyldigTid(startT, startM) || startTid > 1433) {
cout << "\nUlovlig klokkeslett. Prøv igjen (tt mm): ";
cin >> startT >> startM; cin.ignore();
startTid = (startT*60)+startM;
}
while (startT != 0 || startM != 0) { // Så lenge bruker ikke taster 0 0
avgangsTid = startTid+diff;
// Må ha en sjekk her for lang tid mellom stoppesteder, som
@@ -254,13 +365,13 @@ void Rute::ruteTabell(const int diff, const string start, const string stSted) {
// 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
// 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:
// Ny sjekk her for å sørge for riktig output til bruker
// basert på valgt "fra"-tid. Godtar ikke 6-120 min for
@@ -311,7 +422,7 @@ 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)) {
&& (startT != 0 || startM != 0)) {
cout << "\nUlovlig klokkeslett. Prøv igjen (tt mm): ";
cin >> startT >> startM; cin.ignore();
startTotal = (startT*60)+startM; // Omregning
@@ -319,10 +430,10 @@ void Rute::ruteTabell(const int diff, const string start, const string stSted) {
startTid = (startT*60)+startM; // Omregning
} else { // Avslutter innlesning fra bruker hvis slutttid er 23:53
// eller senere (da det må være +1 min minimum til neste
// avgang).
// avgang).
startT = 0; startM = 0; // Sørger for stopp av innlesning
}
}
cout << "\n\nRutetabell for stoppested: " << stSted << "\n\n";
// Sorterer vektoren, slik at man ikke får duplikat utskrift av
@@ -342,7 +453,7 @@ void Rute::ruteTabell(const int diff, const string start, const string stSted) {
} 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
cout << '\n' << ((timer%24 < 10) ? "0" : "") << timer%24
<< ": " << ((minutter < 10) ? "0" : "")
<< minutter;
}
@@ -445,7 +556,7 @@ void Rute::smettStopp() {
cout << "\n\nMellom start\n"
<< "Stoppested (entydig navn / tall / ENTER for å avslutte): ";
getline(cin, navn);
while (navn.size() > 0) { // Så lenge ikke skrevet enter:
navn = gStoppestederBase.byttBokstaver(navn); // fjerner æøåÆØÅ
@@ -531,13 +642,13 @@ void Rute::lesData() {
// Henter et stoppesteds faktiske indeks i vector:
indeks = gStoppestederBase.hentIndeksVhaNavn(fNavn);
// Hvis stopp ikke finnes fra før på ruten:
if (!finnesStopp(indeks+1)) {
if (!finnesStopp(indeks+1)) {
if (stoppene.size() > 0) { // Hvis ikke første stopp på ruten
// Henter peker til eget stoppested:
nStopp = gStoppestederBase.finnDuplikat(fNavn);
// Hvis nabo finnes fra før:
if (nStopp->finnesNabo(naboIndeks+1)) {
if (nStopp->finnesNabo(naboIndeks+1)) {
// Henter naboens indeks
naboIndeks = nStopp->hentNaboIndeks(naboIndeks+1);
// Henter tid til naboen:
@@ -546,7 +657,7 @@ void Rute::lesData() {
nyStopp = new Stopp(indeks+1, tidTilF);
stoppene.push_back(nyStopp); // Legges i lista
// Oppdaterer naboindeks for videre bruk:
naboIndeks = indeks;
naboIndeks = indeks;
cout << "\nTiden mellom stoppestedene er allerede"
<< " registrert som "
<< tidTilF << " minutter.\n";
@@ -581,11 +692,11 @@ void Rute::lesData() {
// 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;
naboIndeks = indeks;
}
// Setter peker til forrige stopp til å peke på riktig
// stoppested for videre bruk:
fStopp = nStopp;
fStopp = nStopp;
} else // Stoppet finnes allerede på ruten:
cout << "\nStoppet er allerede registrert på ruten!\n";
} else { // Hvis ikke entydig:
Loading