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

Merge branch 'frederik' into 'main'

Frederik

See merge request !5
parents 913426af 50246e31
No related branches found
No related tags found
1 merge request!5Frederik
......@@ -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";
......
......@@ -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
......
This diff is collapsed.
......@@ -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,
......
......@@ -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
}
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment