Skip to content
Snippets Groups Projects

Frederik

Merged Frederik Simonsen requested to merge frederik into main
2 files
+ 288
3
Compare changes
  • Side-by-side
  • Inline

Files

+ 286
2
@@ -148,6 +148,48 @@ bool Rute::erTall(std::string nvn) {
return all_of(nvn.begin(), nvn.end(), ::isdigit);
}
/**
* @brief
*
* @param fStoppNr
* @param aStoppNr
* @return true
* @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 om alle Stopp på en rute for å sjekke om deres
* unike nr matcher en nr som bruker mener finnes på ruten
@@ -247,6 +289,25 @@ string Rute::hentNavn(const Retning retning) {
return startSted; // Returnerer navnet på startstopp på ruten
} //må endres til å ta imot peker! return peker.
/**
* Prøver å finne en peker til et stopp på en rute
*
* @param nr
* @return Stopp*
*/
Stopp* Rute::finnStopp(int nr) {
int nummer;
if (!stoppene.empty()) { // Hvis det finnes stopp på ruten:
// For alle stopp i ruten:
for (auto it = stoppene.begin(); it != stoppene.end(); it++) {
nummer = (*it)->hentNr(); // Henter stoppNr
if (nummer == nr) // Sammenligner
return (*it); // Funn, returnerer peker til rett stopp
}
}
return nullptr; // Ikke funn, returnerer nullptr
}
/**
* TODO: fjernStopp()
* Husk at her må avstanden mellom stoppene være mer enn direkte naboer (>1)
@@ -538,14 +599,18 @@ void Rute::slettData(){
void Rute::smettStopp() {
string navn,
fNavn,
aNavn;
aNavn,
nNavn;
int stoppNr,
fStoppNr,
aStoppNr,
nStoppNr,
indeks,
naboIndeks,
fIndeks,
aIndeks;
aIndeks,
tid,
storrelse = stoppene.size();
Stopp* fStopp = nullptr;
Stopp* aStopp = nullptr;
Stopp* nStopp = nullptr;
@@ -577,19 +642,238 @@ void Rute::smettStopp() {
fStoppNr = fIndeks+1; // Setter eget stoppNr
if (finnesStopp(fStoppNr)) { // Hvis stoppen finnes på ruta
// Henter peker til eget stoppested i vectoren
fStoppested = gStoppestederBase.finnDuplikat(fNavn);
// Henter peker til eget stopp i listen
fStopp = finnStopp(fStoppNr);
// Finne riktige pekere til stoppested og stopp
// Starte på neste while for å finne andre stopp?
navn = ""; // Sørger for at man kommer seg ut av whilen
} else {
navn = ""; // TEST
cout << "\nStoppen finnes ikke på denne ruten.\n"
<< "\nStoppested (entydig navn / tall / ENTER"
<< " for å avslutte): ";
getline(cin, navn);
//send inn i while igjen, stopp er ikke på ruta
}
} else {
navn = ""; // TEST
cout << "\nIngen entydig stopp funnet.\n"
<< "\nStoppested (entydig navn / tall / ENTER"
<< " for å avslutte): ";
getline(cin, navn);
//send inn i while igjen, ikke entydig
}
}
if (fNavn.size() > 0) { // Hvis suksessfull funn av startsted
cout << "\n\nMellom slutt\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 æøå
if (erTall(navn)) {
stoppNr = stoi(navn); // Hvis kun tall, konverter til int
// Hvis tallet er et faktisk stoppested:
if (gStoppestederBase.finnesIndeks(stoppNr-1)) {
// Henter det faktiske navnet:
navn = gStoppestederBase.hentNavnVhaIndeks(stoppNr);
}
}
// Sjekker entydighet:
aNavn = gStoppestederBase.finnEntydig(navn);
if (aNavn.size() > 0) { // Hvis entydig navn:
// Henter faktisk indeks for stoppested:
aIndeks = gStoppestederBase.hentIndeksVhaNavn(aNavn);
aStoppNr = aIndeks+1; // Setter eget stoppNr
if (aStoppNr != fStoppNr) { // Hvis ikke samme stopp 2x på rad
// Finnes stoppen på ruta?
if (finnesStopp(aStoppNr)) {
// Sjekker om stoppene er nabo på ruta:
// Henter peker til egen stopp:
aStopp = finnStopp(aStoppNr);
if (erNabo(fStopp, aStopp)) {
// Henter peker til eget stoppested i vector
aStoppested = gStoppestederBase.finnDuplikat(aNavn);
// Henter peker til eget stopp i ruten
//aStopp = finnStopp(aStoppNr);
navn = ""; // Sørger for at man kommer seg ut av while
} else {
navn = ""; // TEST
// Stoppene er ikke naboer på ruta
cout << "\nStoppene er ikke naboer på ruten.\n"
<< "\nStoppested (entydig navn / tall / "
<< "ENTER for å avslutte): ";
getline(cin, navn);
}
} else {
navn = ""; // TEST
// stoppen er ikke på ruta
cout << "\nStoppen er ikke på ruten.\n"
<< "\nStoppested (entydig navn / tall / "
<< "ENTER for å avslutte): ";
getline(cin, navn);
}
} else {
navn = ""; // TEST
// andre stopp er samme som første stopp
cout << "\nStart- og sluttstopp kan ikke være lik.\n"
<< "\nStoppested (entydig navn / tall / "
<< "ENTER for å avslutte): ";
getline(cin, navn);
}
} else {
navn = ""; // TEST
// IKKE ENTYDIG NAVN
cout << "\nIngen entydig stopp funnet.\n"
<< "Stoppested (entydig navn / tall / ENTER"
<< " for å avslutte): ";
getline(cin, navn);
}
}
}
if (aNavn.size() > 0) { // Hvis suksessfullt funn av stoppsted
cout << "\n\nNye stoppested(er) etter " << fNavn
<< " og før " << aNavn << ":\n"
<< "Stoppested (entydig navn / tall / ENTER): ";
getline (cin, navn);
while (navn.size() > 0) { // Så lenge ikke tastet enter:
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
// Hvis faktisk stoppested:
if (gStoppestederBase.finnesIndeks(stoppNr-1)) {
// Henter navn
navn = gStoppestederBase.hentNavnVhaIndeks(stoppNr);
}
}
nNavn = gStoppestederBase.finnEntydig(navn); // Sjekker for entydighet
if (nNavn.size() > 0) { // Hvis entydig navn
// Henter egen indeks
indeks = gStoppestederBase.hentIndeksVhaNavn(nNavn);
nStoppNr = indeks+1; // Setter eget stoppNr
// Hvis ikke stoppen er en av de som skal smettes inn mellom:
if (nStoppNr != aStoppNr && nStoppNr != fStoppNr) {
// Hvis stoppen ikke finnes på ruta fra før:
if (!finnesStopp(nStoppNr)) {
// Finner peker til eget stoppested i vector
nStoppested = gStoppestederBase.finnDuplikat(nNavn);
// Hvis nabo finnes fra før:
if (nStoppested->finnesNabo(fStoppNr)) {
// Henter naboens indeks:
naboIndeks = nStoppested->hentNaboIndeks(fStoppNr);
// Henter tid til nabo:
tid = nStoppested->hentNaboTid(naboIndeks);
nStopp = new Stopp(nStoppNr, tid);
// Hvordan får jeg satt dette i listen riktig???
// Insert evt., men skjønner ikke helt hvordan det
// fungerer
auto it = find(stoppene.begin(), stoppene.end(), aStopp);
stoppene.insert(it, nStopp); // Settes inn foran
// slutt stopp i intervall
// Oppdaterer peker og fStoppNr for videre bruk:
fStoppNr = nStoppNr;
fStoppested = nStoppested;
fIndeks = indeks;
cout << "\nTiden mellom stoppestedene er allerede"
<< " registrert som " << tid
<< " minutter.\n"
<< "\nStoppested (entydig navn / tall / "
<< "ENTER for å avslutte): ";
getline(cin, navn);
} else { // Hvis nabo ikke finnes fra før
// Leser tid mellom stopp
tid = lesInt("Tid fra forrige stopp", 1, 10);
// Oppdaterer forrige stopps nabovektor
fStoppested->settNaboIndeks(indeks);
// Oppdaterer forrige stopps tid til nabo vektor
fStoppested->settNaboTid(tid);
// Oppdaterer egen stopps nabovektor
nStoppested->settNaboIndeks(fIndeks);
//Oppdaterer nåværende stopps tid til nabo vektor
nStoppested->settNaboTid(tid);
// Oppretter ny stopp på ruten
nStopp = new Stopp(nStoppNr, tid);
// Setter inn på rett sted (1 foran bakerst i intervall):
auto it = find(stoppene.begin(), stoppene.end(), aStopp);
stoppene.insert(it, nStopp);
// Oppdaterer variabler for videre bruk:
fStoppNr = nStoppNr;
fStoppested = nStoppested;
fIndeks = indeks;
cout << "\n\nStoppested (entydig navn / tall / "
<< "ENTER for å avslutte): ";
getline(cin, navn);
}
} else {
navn = ""; // TEST
cout << "\nStoppet finnes allerede på ruten.\n"
<< "\nStoppested (entydig navn / tall / "
<< "ENTER for å avslutte): ";
getline(cin, navn);
// Stoppen finnes allerede på ruten
}
} else {
navn = ""; // TEST
cout << "\nStoppet finnes allerede på ruten.\n"
<< "\nStoppested (entydig navn / tall / "
<< "ENTER for å avslutte): ";
getline(cin, navn);
// Stoppen er en av de som skal smettes inn mellom
}
} else {
navn = ""; // TEST
cout << "\nIngen entydig stopp funnet.\n"
<< "Stoppested (entydig navn / tall / ENTER"
<< " for å avslutte): ";
getline(cin, navn);
}
}
}
// Hvis minimum et nytt stopp lagt til på ruten:
if (stoppene.size() > storrelse) {
cout << "\n\nFra " << nNavn << " til " << aNavn << ":\n";
// Hvis nabo finnes fra før:
if (aStoppested->finnesNabo(nStoppNr)) {
naboIndeks = aStoppested->hentNaboIndeks(nStoppNr);
tid = nStoppested->hentNaboTid(naboIndeks);
aStopp->nr = tid; // oppdaterer tid til forrige nabo
cout << "\nTiden mellom stoppestedene er allerede "
<< "registrert som " << tid << " minutter.\n\n";
skrivRute(Fram); // Skriver oppdaterte ruten forlengs
} else { // Nabo finnes ikke fra før:
// Leser tid mellom stopp
tid = lesInt("Tid fra forrige stopp", 1, 10);
// Oppdaterer forrige stopps nabovektor
nStoppested->settNaboIndeks(aIndeks);
// Oppdaterer forrige stopps tid til nabo vektor
nStoppested->settNaboTid(tid);
// Oppdaterer egen stopps nabovektor
aStoppested->settNaboIndeks(indeks);
// Oppdaterer egen stopps tid til nabo vektor
aStoppested->settNaboTid(tid);
aStopp->nr = tid; // oppdaterer tid til forrige nabo
skrivRute(Fram); // skriver oppdatert rute forlengs
}
}
}
/**
Loading