Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
G
Gruppe04
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Frederik Simonsen
Gruppe04
Commits
2bcc319e
Commit
2bcc319e
authored
3 years ago
by
Frederik Simonsen
Browse files
Options
Downloads
Patches
Plain Diff
R E smett
parent
b002d870
Branches
Branches containing commit
No related tags found
1 merge request
!6
Frederik
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
rute.cpp
+167
-78
167 additions, 78 deletions
rute.cpp
rute.h
+1
-0
1 addition, 0 deletions
rute.h
with
168 additions
and
78 deletions
rute.cpp
+
167
−
78
View file @
2bcc319e
...
...
@@ -87,6 +87,37 @@ Rute::Rute(ifstream & inn) {
}
}
/**
* Sjekker om et sluttsted ifm. smetting av stopper er før på ruten
* enn startstedet i intervallet for hvor stopper skal smettes
*
* @param s1 - Peker til startstopp i intervallet
* @param s2 - Peker til sluttstopp i intervallet
* @return true s2 er tidligere på ruten enn s1
* @return false s1 er før s2
*/
bool
Rute
::
erForst
(
Stopp
*
s1
,
Stopp
*
s2
)
{
int
fPos
,
// første posisjon
aPos
;
// andre posisjon
// finner posisjon i listen for startstopp i intervallet:
auto
it
=
find
(
stoppene
.
begin
(),
stoppene
.
end
(),
s1
);
if
(
it
!=
stoppene
.
end
())
{
fPos
=
distance
(
stoppene
.
begin
(),
it
);
}
// Finner posisjon i listen for stoppsted i intervallet:
auto
it2
=
find
(
stoppene
.
begin
(),
stoppene
.
end
(),
s2
);
if
(
it2
!=
stoppene
.
end
())
{
aPos
=
distance
(
stoppene
.
begin
(),
it2
);
}
// Hvis stoppsted faktisk er før startsted i intervall:
if
(
aPos
<
fPos
)
{
return
true
;
}
// Hvis startsted faktisk er før stoppsted i intervall:
return
false
;
}
/**
* Sjekker om en rute har mer enn en stopp (= gyldig rute)
*
...
...
@@ -101,36 +132,25 @@ bool Rute::erListeGyldig() {
}
/**
* Går gjennom et medsendt navn fra bruker, sjekker
* alle tegn i strengen er tall eller ei
* Sjekker om to stopp på en rute faktisk er nabo eller ei
*
* @param nvn - Mulig stoppestedsnavn eller stoppestedsnr
* @return true Hvis alle tegnene i strengen er tall
* @return false Hvis strengen inneholder tegn som ikke er tall
*/
bool
Rute
::
erTall
(
std
::
string
nvn
)
{
return
all_of
(
nvn
.
begin
(),
nvn
.
end
(),
::
isdigit
);
}
/**
* @brief
*
* @param fStoppNr
* @param aStoppNr
* @return true
* @return false
* @param s1 - Peker til startstopp i intervallet
* @param s2 - Peker til sluttstopp i intervallet
* @return true Hvis stoppene er naboer
* @return false Hvis stoppene ikke er naboer
*/
bool
Rute
::
erNabo
(
Stopp
*
s1
,
Stopp
*
s2
)
{
int
fPos
,
aPos
,
temp
,
avstand
;
int
fPos
,
// posisjon til første stopp i ruten
aPos
,
// posisjon til andre stopp i ruten
temp
,
// Hjelpevariabel for eventuelt bytte om fPos og aPos
avstand
;
// Avstand mellom stoppene på ruten (=1 hvis nabo)
// Finner posisjon til første stopp i intervallet
auto
it
=
find
(
stoppene
.
begin
(),
stoppene
.
end
(),
s1
);
if
(
it
!=
stoppene
.
end
())
{
// Funn av stoppNr
fPos
=
distance
(
stoppene
.
begin
(),
it
);
}
// Finner posisjon til andre stopp i intervallet
auto
it2
=
find
(
stoppene
.
begin
(),
stoppene
.
end
(),
s2
);
if
(
it2
!=
stoppene
.
end
())
{
// Funn av stoppNr
aPos
=
distance
(
stoppene
.
begin
(),
it2
);
...
...
@@ -138,22 +158,36 @@ bool Rute::erNabo(Stopp* s1, Stopp* s2) {
if
(
fPos
<
aPos
)
{
// Hvis første er før på ruten enn andre
avstand
=
aPos
-
fPos
;
// Setter avstand mellom stopp på ruten
// Hvis slutt stopp er før start stopp i intervallet, bytter plass:
}
else
if
(
fPos
>
aPos
)
{
temp
=
fPos
;
// Gjør om slik at første stopp på ruten kommer først
temp
=
fPos
;
fPos
=
aPos
;
aPos
=
temp
;
avstand
=
aPos
-
fPos
;
// Hvis man sjekker om samme stopp er først og sist i intervall:
}
else
if
(
fPos
==
aPos
)
{
// Skal ikke skje
cout
<<
"
\n
Her er det noe alvorlig galt.
\n\n
"
;
}
if
(
avstand
==
1
)
{
// Stoppene er naboer
// Hvis stoppene i intervallet er naboer:
if
(
avstand
==
1
)
{
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
*
* @param nvn - Mulig stoppestedsnavn eller stoppestedsnr
* @return true Hvis alle tegnene i strengen er tall
* @return false Hvis strengen inneholder tegn som ikke er tall
*/
bool
Rute
::
erTall
(
std
::
string
nvn
)
{
return
all_of
(
nvn
.
begin
(),
nvn
.
end
(),
::
isdigit
);
}
/**
* Går gjennom om alle Stopp på en rute for å sjekke om deres
* unike nr matcher en nr som bruker mener finnes på ruten
...
...
@@ -240,10 +274,12 @@ string Rute::hentNavn(const Retning retning) {
}
/**
*
Prøver å finne en pe
ker
til
e
t
stopp på en rute
*
Sjek
ker
om
e
n
stopp
er
på en
aktuell
rute
*
* @param nr
* @return Stopp*
* @param nr - Stoppens unike nr
* @return Stopp* - Peker til stopp ved funn (er på ruta)
* @return nullptr - Hvis stoppen ikke er på aktuell rute
* @see Stopp::hentNr()
*/
Stopp
*
Rute
::
finnStopp
(
int
nr
)
{
int
nummer
;
...
...
@@ -481,35 +517,61 @@ void Rute::slettData(){
}
/**
* TODO: smettStopp()
* Husk her må avstanden mellom de to stoppestedene være akkurat 1 (naboer)
* Hvis de ikke er naboer, skal man bli sendt tilbake til meny
* Smetter inn stoppesteder mellom et intervall hvis mulig
* Skal godta tall, navn så fort entydig, hoppe ut ved enter
* Skal sjekke at det kun går ann å smette inn mellom faktiske
* naboer på en rute (uavhengig av hvilken "vei" bruker har
* tastet inn disse) osv.
*
* @see Stoppesteder::byttBokstaver(...)
* @see Rute::erTall(...)
* @see Stoppesteder::finnesIndeks(...)
* @see Stoppesteder::hentNavnVhaIndeks(...)
* @see Stoppesteder::finnEntydig(...)
* @see Stoppesteder::hentIndeksVhaNavn(...)
* @see Rute::finnesStopp(...)
* @see Stoppesteder::finnDuplikat(...)
* @see Rute::finnStopp(...)
* @see Rute::erNabo(...)
* @see Rute::erForst(...)
* @see Stoppested::finnesNabo(...)
* @see Stoppested::hentNaboIndeks(...)
* @see Stoppested::hentNaboTid(...)
* @see Stopp::Stopp(...)
* @see Stoppested::settNaboIndeks(...)
* @see Stoppested::settNaboTid(...)
* @see Rute::skrivRute(...)
*/
void
Rute
::
smettStopp
()
{
string
navn
,
fNavn
,
aNavn
,
nNavn
;
int
stoppNr
,
fStoppNr
,
aStoppNr
,
nStoppNr
,
indeks
,
naboIndeks
,
fIndeks
,
aIndeks
,
tid
,
storrelse
=
stoppene
.
size
();
Stopp
*
fStopp
=
nullptr
;
Stopp
*
aStopp
=
nullptr
;
Stopp
*
nStopp
=
nullptr
;
Stoppested
*
fStoppested
=
nullptr
;
Stoppested
*
aStoppested
=
nullptr
;
Stoppested
*
nStoppested
=
nullptr
;
string
navn
,
// Hjelpevariabel for å lese brukerinput
fNavn
,
// Forrige stoppesteds navn
aNavn
,
// Siste stoppesteds navn i intervall
nNavn
,
// Nåværende stoppesteds navn
tempNavn
;
// Hjelpevariabel for evt. å endre rekkefølge
int
stoppNr
,
// Hjelpevariabel for å lese brukerinput
fStoppNr
,
// Forrige stoppesteds unike nr
aStoppNr
,
// Siste stoppesteds unike nr i intervall
nStoppNr
,
// Nåværende stoppesteds unike nr
tempStoppNr
,
// Hjelpevariabel for evt. å endre rekkefølge
indeks
,
// Hjelpevariabel for å lese bruker input
naboIndeks
,
// Nabostopp sin indeks
fIndeks
,
// Forrige stoppested sin indeks
aIndeks
,
// Siste stoppested sin indeks i intervall
tempIndeks
,
// Hjelpevariabel for evt. å endre rekkefølge
tid
,
// antall minutter mellom stopp
storrelse
=
stoppene
.
size
();
// Hjelpevariabel for å se om ruten har blitt lengre
Stopp
*
fStopp
=
nullptr
;
// Peker til forrige stopp-struct
Stopp
*
aStopp
=
nullptr
;
// Peker til siste stopp-struct i intervall
Stopp
*
nStopp
=
nullptr
;
// Peker til nåværende stopp-struct
Stopp
*
tempStopp
=
nullptr
;
// Hjelpevariabel for evt. å endre rekkefølge
Stoppested
*
fStoppested
=
nullptr
;
// Peker til forrige stoppested i vector
Stoppested
*
aStoppested
=
nullptr
;
// Peker til siste stoppested i vector fra intervall
Stoppested
*
nStoppested
=
nullptr
;
// Peker til nåværende stoppested i vector
Stoppested
*
tempStoppested
=
nullptr
;
// Hjelpevariabel for evt. å endre rekkefølge
cout
<<
"
\n\n
Mellom start
\n
"
<<
"Stoppested (entydig navn / tall / ENTER for å avslutte): "
;
getline
(
cin
,
navn
);
getline
(
cin
,
navn
);
// Leser navn fra bruker
while
(
navn
.
size
()
>
0
)
{
// Så lenge ikke skrevet enter:
navn
=
gStoppestederBase
.
byttBokstaver
(
navn
);
// fjerner æøåÆØÅ
...
...
@@ -539,7 +601,7 @@ void Rute::smettStopp() {
// Starte på neste while for å finne andre stopp?
navn
=
""
;
// Sørger for at man kommer seg ut av whilen
}
else
{
n
avn
=
""
;
//
TEST
fN
avn
=
""
;
//
Må være her hvis neste input er ENTER
cout
<<
"
\n
Stoppen finnes ikke på denne ruten.
\n
"
<<
"
\n
Stoppested (entydig navn / tall / ENTER"
<<
" for å avslutte): "
;
...
...
@@ -547,7 +609,7 @@ void Rute::smettStopp() {
//send inn i while igjen, stopp er ikke på ruta
}
}
else
{
n
avn
=
""
;
//
TEST
fN
avn
=
""
;
//
må være her hvis neste input er ENTER
cout
<<
"
\n
Ingen entydig stopp funnet.
\n
"
<<
"
\n
Stoppested (entydig navn / tall / ENTER"
<<
" for å avslutte): "
;
...
...
@@ -559,7 +621,7 @@ void Rute::smettStopp() {
if
(
fNavn
.
size
()
>
0
)
{
// Hvis suksessfull funn av startsted
cout
<<
"
\n\n
Mellom slutt
\n
"
<<
"Stoppested (entydig navn / tall / ENTER for å avslutte): "
;
getline
(
cin
,
navn
);
getline
(
cin
,
navn
);
// Leser navn fra bruker
while
(
navn
.
size
()
>
0
)
{
// Så lenge ikke skrevet enter:
navn
=
gStoppestederBase
.
byttBokstaver
(
navn
);
// fjerner æøå
...
...
@@ -581,19 +643,41 @@ void Rute::smettStopp() {
aStoppNr
=
aIndeks
+
1
;
// Setter eget stoppNr
if
(
aStoppNr
!=
fStoppNr
)
{
// Hvis ikke samme stopp 2x på rad
//
Finne
s stopp
en
på rut
a?
//
Hvi
s stopp
finnes
på rut
en:
if
(
finnesStopp
(
aStoppNr
))
{
// Sjekker om stoppene er nabo på ruta:
// Henter peker til egen stopp:
aStopp
=
finnStopp
(
aStoppNr
);
// Sjekker om stoppene er nabo på ruta:
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);
// Hvis sluttsted er før startsted, bytt alt:
if
(
erForst
(
fStopp
,
aStopp
))
{
tempNavn
=
fNavn
;
fNavn
=
aNavn
;
aNavn
=
tempNavn
;
tempIndeks
=
fIndeks
;
fIndeks
=
aIndeks
;
aIndeks
=
tempIndeks
;
tempStoppNr
=
fStoppNr
;
fStoppNr
=
aStoppNr
;
aStoppNr
=
tempStoppNr
;
tempStoppested
=
fStoppested
;
fStoppested
=
aStoppested
;
aStoppested
=
tempStoppested
;
tempStopp
=
fStopp
;
fStopp
=
aStopp
;
aStopp
=
tempStopp
;
tempNavn
=
""
;
tempIndeks
=
-
1
;
tempStoppNr
=
-
1
;
tempStoppested
=
nullptr
;
tempStopp
=
nullptr
;
}
navn
=
""
;
// Sørger for at man kommer seg ut av while
}
else
{
n
avn
=
""
;
//
TEST
aN
avn
=
""
;
//
må være her hvis neste input er ENTER
// Stoppene er ikke naboer på ruta
cout
<<
"
\n
Stoppene er ikke naboer på ruten.
\n
"
<<
"
\n
Stoppested (entydig navn / tall / "
...
...
@@ -602,7 +686,7 @@ void Rute::smettStopp() {
}
}
else
{
n
avn
=
""
;
//
TEST
aN
avn
=
""
;
//
må være her hvis neste input er ENTER
// stoppen er ikke på ruta
cout
<<
"
\n
Stoppen er ikke på ruten.
\n
"
<<
"
\n
Stoppested (entydig navn / tall / "
...
...
@@ -611,7 +695,7 @@ void Rute::smettStopp() {
}
}
else
{
n
avn
=
""
;
//
TEST
aN
avn
=
""
;
//
må være her hvis neste input er ENTER
// andre stopp er samme som første stopp
cout
<<
"
\n
Start- og sluttstopp kan ikke være lik.
\n
"
<<
"
\n
Stoppested (entydig navn / tall / "
...
...
@@ -620,8 +704,8 @@ void Rute::smettStopp() {
}
}
else
{
n
avn
=
""
;
//
TEST
//
IKKE ENTYDIG NAVN
aN
avn
=
""
;
//
Må være her hvis neste input er ENTER
//
Navnet er ikke entydig:
cout
<<
"
\n
Ingen entydig stopp funnet.
\n
"
<<
"Stoppested (entydig navn / tall / ENTER"
<<
" for å avslutte): "
;
...
...
@@ -634,7 +718,7 @@ void Rute::smettStopp() {
cout
<<
"
\n\n
Nye stoppested(er) etter "
<<
fNavn
<<
" og før "
<<
aNavn
<<
":
\n
"
<<
"Stoppested (entydig navn / tall / ENTER): "
;
getline
(
cin
,
navn
);
getline
(
cin
,
navn
);
// Leser navn fra bruker
while
(
navn
.
size
()
>
0
)
{
// Så lenge ikke tastet enter:
navn
=
gStoppestederBase
.
byttBokstaver
(
navn
);
// Fjerner æøå
...
...
@@ -647,7 +731,8 @@ void Rute::smettStopp() {
navn
=
gStoppestederBase
.
hentNavnVhaIndeks
(
stoppNr
);
}
}
nNavn
=
gStoppestederBase
.
finnEntydig
(
navn
);
// Sjekker for entydighet
// Sjekker for entydighet:
nNavn
=
gStoppestederBase
.
finnEntydig
(
navn
);
if
(
nNavn
.
size
()
>
0
)
{
// Hvis entydig navn
// Henter egen indeks
...
...
@@ -666,14 +751,13 @@ void Rute::smettStopp() {
naboIndeks
=
nStoppested
->
hentNaboIndeks
(
fStoppNr
);
// Henter tid til nabo:
tid
=
nStoppested
->
hentNaboTid
(
naboIndeks
);
// Oppretter nytt stopp på ruten:
nStopp
=
new
Stopp
(
nStoppNr
,
tid
);
// Hvordan får jeg satt dette i listen riktig???
// Insert evt., men skjønner ikke helt hvordan det
// fungerer
// Sørger for at stopp blir smettet inn på rett sted:
auto
it
=
find
(
stoppene
.
begin
(),
stoppene
.
end
(),
aStopp
);
stoppene
.
insert
(
it
,
nStopp
);
// Settes inn foran
// slutt stopp i intervall
// Oppdaterer peker og
fS
toppNr for videre bruk:
// Oppdaterer peker
, indeks
og
s
toppNr for videre bruk:
fStoppNr
=
nStoppNr
;
fStoppested
=
nStoppested
;
fIndeks
=
indeks
;
...
...
@@ -710,24 +794,27 @@ void Rute::smettStopp() {
getline
(
cin
,
navn
);
}
}
else
{
navn
=
""
;
// TEST
// Stoppen finnes allerede på ruten:
nNavn
=
""
;
// Må være her hvis neste input er ENTER
cout
<<
"
\n
Stoppet finnes allerede på ruten.
\n
"
<<
"
\n
Stoppested (entydig navn / tall / "
<<
"ENTER for å avslutte): "
;
getline
(
cin
,
navn
);
// Stoppen finnes allerede på ruten
}
}
else
{
navn
=
""
;
// TEST
// Stoppen er en av de som skal smettes inn mellom:
nNavn
=
""
;
// Må være her hvis neste input er ENTER
cout
<<
"
\n
Stoppet finnes allerede på ruten.
\n
"
<<
"
\n
Stoppested (entydig navn / tall / "
<<
"ENTER for å avslutte): "
;
getline
(
cin
,
navn
);
// Stoppen er en av de som skal smettes inn mellom
}
}
else
{
navn
=
""
;
// TEST
// Stopp er ikke entydig:
nNavn
=
""
;
// Må være her hvis neste input er ENTER
cout
<<
"
\n
Ingen entydig stopp funnet.
\n
"
<<
"Stoppested (entydig navn / tall / ENTER"
<<
" for å avslutte): "
;
...
...
@@ -740,9 +827,10 @@ void Rute::smettStopp() {
cout
<<
"
\n\n
Fra "
<<
nNavn
<<
" til "
<<
aNavn
<<
":
\n
"
;
// Hvis nabo finnes fra før:
if
(
aStoppested
->
finnesNabo
(
nStoppNr
))
{
// Henter nabo sin indeks og allerede registrert tid:
naboIndeks
=
aStoppested
->
hentNaboIndeks
(
nStoppNr
);
tid
=
nStoppested
->
hentNaboTid
(
naboIndeks
);
aStopp
->
n
r
=
tid
;
// oppdaterer tid til forrige nabo
aStopp
->
minutte
r
=
tid
;
// oppdaterer tid til forrige nabo
på ruten
cout
<<
"
\n
Tiden mellom stoppestedene er allerede "
<<
"registrert som "
<<
tid
<<
" minutter.
\n\n
"
;
...
...
@@ -759,7 +847,8 @@ void Rute::smettStopp() {
aStoppested
->
settNaboIndeks
(
indeks
);
// Oppdaterer egen stopps tid til nabo vektor
aStoppested
->
settNaboTid
(
tid
);
aStopp
->
nr
=
tid
;
// oppdaterer tid til forrige nabo
aStopp
->
minutter
=
tid
;
// oppdaterer tid til forrige nabo
cout
<<
'\n'
;
skrivRute
(
Fram
);
// skriver oppdatert rute forlengs
}
}
...
...
@@ -786,7 +875,7 @@ void Rute::smettStopp() {
*/
void
Rute
::
lesData
()
{
string
navn
,
fNavn
;
fNavn
;
// faktisk navn (entydig)
int
stoppNr
=
0
,
indeks
=
0
,
naboIndeks
=
0
,
...
...
This diff is collapsed.
Click to expand it.
rute.h
+
1
−
0
View file @
2bcc319e
...
...
@@ -35,6 +35,7 @@ class Rute {
public:
Rute
();
Rute
(
std
::
ifstream
&
inn
);
bool
erForst
(
Stopp
*
s1
,
Stopp
*
s2
);
bool
erListeGyldig
();
bool
erNabo
(
Stopp
*
s1
,
Stopp
*
s2
);
bool
erTall
(
std
::
string
nvn
);
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment