$29
• Objectives
This homework aims to help you get familiar with the fundamental C++ programming concepts.
Keywords: Constructor/Copy Constructor/Destructor, Assignment/Move, Operator Overloading, Mem-ory Management
• Problem De nition
TL;DR: Implement the methods in the given 4 classes (Laptime, Car, Race, Championship). Cars have Laptimes, Races have Cars, Championships have Races. The details are on their way.
Another TA who watched Drive to Survive
...
Oh God show mercy to this boring soul.
F1 needs a new clear backbone for their visualisation system. As a Computer Engineering student from METU, they trusted you with the task. Your task is to keep track of the laptimes, cars, races and tracks. As situation requested shiny features of the latest C++ is not available to you. Therefore, you have to be careful with your programs memory management (You do not want to leave a program that is leaking memory as your legacy).
1
• Class De nitions
3.1 Laptime
Laptime is the most basic class in this homework. Basically, it’s the node in a linked-list which would keep the time information of the laps for each Car (not the best way to keep lap times of Cars, but let’s assume F1 is not paying you anything and you let this go).
c l a s s Laptime f
p r i v a t e :
i n t laptime ;
Laptime ∗next ;
• DO NOT MODIFY THE UPPER PART
• ADD OWN PRIVATE METHODS/PROPERTIES BELOW
p u b l i c :
• ∗ ∗
∗ C o n s t r u c t o r .
∗
∗ @param i n t v a l u e i n l a p t i m e .
∗/
Laptime( i n t laptime) ;
• ∗ ∗
∗ Copy C o n s t r u c t o r .
∗
∗ @param r h s The l a p t i m e t o be c o p i e d .
∗/
Laptime( c o n s t Laptime& rhs) ;
~Laptime ( ) ;
• ∗ ∗
∗ S e t s t h e next c h a i n f o r t h i s Laptime .
∗ You s h o u l d i n s e r t t h e g i v e n Laptime t o t h e o b j e c t which t h e method i s -
c a l l e d upon
∗
∗ @param next The next Laptime .
∗/
v o i d addLaptime(Laptime ∗next) ;
• ∗ ∗
∗ L e s s than o v e r l o a d .
∗
∗ True i f t h i s Laptime l e s s than t h e r h s Laptime .
∗
∗ @param r h s The Laptime t o compare .
∗ @return True i f t h i s l a p t i m e i s s m a l l e r , f a l s e o t h e r w i s e .
∗/
b o o l o p e r a t o r <( c o n s t Laptime& rhs) c o n s t ;
• ∗ ∗
∗ G r e a t e r than o v e r l o a d .
2
∗
∗ True i f t h i s Laptime g r e a t e r than t h e r h s Laptime .
∗
∗ @param r h s The Laptime t o compare .
∗ @return True i f t h i s l a p t i m e i s b i g g e r , f a l s e o t h e r w i s e .
∗/
b o o l o p e r a t o r >( c o n s t Laptime& rhs) c o n s t ;
• ∗ ∗
Plus o v e r l o a d
∗
Add two Laptime and r e t u r n t h e l h s Laptime
∗
∗ @param Laptime t o add
@returns Summation o f t h e two l a p t i m e
∗/
Laptime& o p e r a t o r +( c o n s t Laptime& rhs) ;
• ∗ ∗
∗ Stream o v e r l o a d .
∗
∗ What t o stream :
∗ minute : s ec o n d . m i l i s e c o n d s
∗
∗ Example : ∗ 1:19.125
∗
∗
@important Your l a p t i m e
v a r i a b l e
i s
r e p r e s e n t a t i o n
i n terms
o f m i l i s e c o n d s
∗
and you have t o t u r n
i t
t o d e s i r e d
outcome
type
∗
P r i n t t h e Laptime o f
t h e
o b j e c t
which t h e
method i s
c a l l e d
upon .
∗
@param o s Stream t o be used .
∗
@param l a p t i m e Laptime t o be streamed .
∗ @return The c u r r e n t Stream .
∗/
f r i e n d std : : ostream& o p e r a t o r <<(std : : ostream& os , c o n s t Laptime& laptime) ;
• DO NOT MODIFY THE UPPER PART
• ADD OWN PUBLIC METHODS/PROPERTIES BELOW
• ;
3.2 Cars
Cars are similar to Laptimes, but they contain the name of the driver which is up to you (LeClerc can be a good start. Bahrain 2019 :/ ). It is again a node in a linked-list, but every car contains the linked-list of Laptime class (Memory Problems 2019).
c l a s s Car f
p r i v a t e :
std : : string driver_name ;
d o u b l e performance ;
Laptime ∗head ;
3
Car ∗next ;
• DO NOT MODIFY THE UPPER PART
• ADD OWN PRIVATE METHODS/PROPERTIES BELOW
p u b l i c :
• ∗ ∗
∗ C o n s t r u c t o r .
∗
∗ @Important : s e t t h e p e r f o r m a n c e v a r i a b l e o f t h e c a r by u s i n g U t i l i z e r : : -
g e n e r a t e P e r f o r m a n c e ( )
∗
∗ @param s t d : : s t r i n g The Car ' s d r i v e r name .
∗/
Car(std : : string driver_name) ;
• ∗ ∗
∗ Copy C o n s t r u c t o r .
∗
∗ @param r h s The c a r t o be c o p i e d .
∗/
Car( c o n s t Car& rhs) ;
~Car ( ) ;
• ∗ ∗
∗ Gets t h e d r i v e r s name
∗
∗
∗ @returns : d r i v e r s name
∗/
std : : string getDriverName ( ) c o n s t ;
• ∗ ∗
∗
∗ Gets t h e p e r f o r m a n c e
∗
∗ @returns t h e p e r f o r m a n c e
∗
∗/
d o u b l e getPerformance ( ) c o n s t ;
• ∗ ∗
∗ S e t s t h e next c h a i n f o r t h i s Car .
∗ Adds a new c a r behind e x i s t i n g c a r
∗ You s h o u l d i n s e r t t h e g i v e n Car t o t h e o b j e c t which t h e method i s c a l l e d -
upon
∗ Important : Car d o e s NOT "own" next .
∗
∗ @param next The next Car .
∗/
v o i d addCar(Car ∗next) ;
• ∗ ∗
∗ L e s s than o v e r l o a d .
∗
4
∗ True i f t o t a l l a p t i m e o f t h i s Car i s l e s s than t h e r h s Car .
∗
∗ Important :
∗
∗ @param r h s The Car t o compare .
∗ @return True i f t h i s c a r ' s t o t a l l a p t i m e i s s m a l l e r , f a l s e o t h e r w i s e .
∗/
b o o l o p e r a t o r <( c o n s t Car& rhs) c o n s t ;
/∗ ∗
∗ G r e a t e r than o v e r l o a d .
∗
∗ True i f t o t a l l a p t i m e o f t h i s Car i s g r e a t e r than t h e r h s Car .
∗
∗ Important :
∗
∗ @param r h s The Car t o compare .
∗ @return True i f t h i s c a r ' s t o t a l l a p t i m e i s g r e a t e r , f a l s e o t h e r w i s e .
∗/
b o o l o p e r a t o r >( c o n s t Car& rhs) c o n s t ;
• ∗ ∗
∗ I n d e x i n g .
∗
∗
Find
t h e
l a p t i m e o f
t h e g i v e n
l a p .
∗
You
w i l l
u s e 0 based
i n d e x i n g .
∗
For example ,
a f t e r
20
l a p
your c a r
s h o u l d have
20 l a p t i m e s . To
g e t
15 th
-
l a p t i m e
you
w i l l
g i v e
14
a s
t h e i n p u t
parameter .
∗
∗
@return The Laptime
with t h e
g i v e n
l a p .
Laptime
with z e r o time
i f
g i v e n
-
l a p
d o e s
not
e x i s t s .
∗/
Laptime o p e r a t o r [ ] ( c o n s t i n t lap) c o n s t ;
• ∗ ∗
∗
Car
c o m p l e t e s one
l a p
and
r e c o r d s
i t s
l a p t i m e
∗
∗
@Important : Based
on
your
c a r s p e r f o r m a n c e c a l c u l a t e
some
v a r i a n c e
t o add -
a v e r a g e l a p t i m e
∗
Use
U t i l i z e r : : g e n e r a t e L a p t i m e V a r i a n c e ( p e r f o r m a n c e )
then
add i t t o
-
a v e r a g e l a p t i m e
∗
∗
@param : Car t a k e s
a v e r a g e
l a p t i m e
o f
t h e r a c e
∗
∗/
v o i d Lap( c o n s t Laptime& average_laptime) ;
• ∗ ∗
∗ Stream o v e r l o a d .
∗
∗ What t o stream :
F i r s t Three l e t t e r s o f t h e d r i v e r s surname ( C a p i t a l i z e d ) L a t e s t Laptime -
F a s t e s t Laptime T o t a l Laptime
∗ Example :
∗ For Lewis Hamilton
5
∗ HAM
1:19.235
1:18.832
90:03.312
∗
∗
@Important :
f o r
l a p
numbers s m a l l e r i n
s i z e
you have t o put z e r o s a s much -
a s n e c c a s a r y
∗
@Important :
you
can
u s e
Laptime ostream
when
n e c c e s s a r y
∗
∗
@param o s Stream t o be used .
∗
@param
c a r
Car
t o be
streamed .
∗ @return The c u r r e n t Stream .
∗/
f r i e n d std : : ostream& o p e r a t o r <<(std : : ostream& os , c o n s t Car& car) ;
• DO NOT MODIFY THE UPPER PART
• ADD OWN PUBLIC METHODS/PROPERTIES BELOW
• ;
3.3 Race
Race keeps a linked-list of Cars. You have to keep your cars in the order from fastest to slowest (Nobody wants to see some randomly ordered car info). The details are in the code itself below:
c l a s s Race f
p r i v a t e :
std : : string race_name ;
Laptime average_laptime ;
Car ∗head ;
• DO NOT MODIFY THE UPPER PART
• ADD OWN PRIVATE METHODS/PROPERTIES BELOW
p u b l i c :
• ∗ ∗
∗ C o n s t r u c t o r .
∗
∗ @Important : Generate a v e r a g e l a p t i m e by u s i n g U t i l i z e r : : -
g e n e r a t e A v e r a g e L a p t i m e ( )
∗
∗ @param s t d : : s t r i n g The name o f t h e Race .
∗/
Race(std : : string race_name) ;
• ∗ ∗
∗ Copy C o n s t r u c t o r .
∗
∗ @Important j u s t copy t h e names and p e r f o r m a n c e s o f t h e c a r s
∗ w i t h o u t any l a p t i m e .
∗ Cars s h o u l d be deep c o p i e d
∗
∗ @param r h s The r a c e t o be c o p i e d .
∗/
Race( c o n s t Race& rhs) ;
~Race ( ) ;
std : : string getRaceName ( ) c o n s t ;
6
• ∗ ∗
∗
Add a new c a r
t o r a c e .
∗
∗
@Important :
At
t h e
s t a r t o f
t h e
r a c e
t h e i r
o r d e r i n g
i s
not i m p or t a n t
∗
∗
No parameter
means
t h a t you
w i l l
g e n e r a t e
your
own
c a r
i n
∗
t h i s f u n c t i o n ( with
a random
name) and
add
i t
t o
your
Cars
∗/
v o i d addCartoRace ( ) ;
• ∗ ∗
∗
Add a new c a r t o r a c e .
∗
∗
@Important :
At
t h e s t a r t
o f
t h e r a c e t h e i r o r d e r i n g i s not i m p or t a n t
∗
∗
@param : c a r
Add
g i v e n Car
t o
o t h e r s
∗/
v o i d addCartoRace(Car& car) ;
• ∗ ∗
∗ I n f o r m a t i o n About how much c a r i s i n t h e r a c e
∗
∗ @returns number o f c a r s
∗
∗/
i n t getNumberOfCarsinRace ( ) ;
• ∗ ∗
∗
Return
s t a t e
o f e v e r y t h i n g t o
d e s i r e d l a p ' s
s t a t e
∗
∗
Your Race
w i l l
have
many
l a p s
i n
t h e
c o u r s e
o f
i t s
l i f e .
In
each
lap ,
your
-
c a r s
w i l l
have
new Laptimes
e t c .
∗
For example ,
i f you
have
20 Laps
i n
your
Race ,
but
l e t ' s
say
you
want
t o
-
r e d o
l a s t 10
l a p s
o f
i t .
By
u s i n g goBacktoLap ,
∗
you w i l l
t a k e
your
Race back
t o
10 th
Lap .
This
w i l l
a l s o
make c ha n g es
i n
-
your
Cars .
Your
c a r s
w i l l have
o n l y
t h e
i n f o r m a t i o n o f
t h e
f i r s t 10
l a p s .
∗
Lap numbers
s t a r t
from
z e r o .
I f
5 i s
g i v e n
a s
i n t lap , you w i l l
t a k e
Race
-
back
t o
6th
l a p .
∗
@Important :
t h i s
w i l l
a l s o apply
t o
c a r s
and l e a d e r b o a r d
t o o
∗
∗ @param l a p t o r e t u r n
∗
∗/
v o i d goBacktoLap( i n t lap) ;
• ∗ ∗
P r e f i x a d d i t i o n o v e r l o a d
∗
∗ add one more l a p t o a l l c a r s
∗
∗ @Important : Update t h e o r d e r o f t h e c a r s s o t h a t t h e f a s t e s t one s t a y s a t -
t h e f r o n t
∗
∗/
v o i d o p e r a t o r ++() ;
7
• ∗ ∗
P r e f i x decrement o v e r l o a d
∗
∗ remove one l a p from a l l c a r s
∗
∗ @Important : Update t h e o r d e r o f t h e c a r s s o t h a t t h e f a s t e s t one s t a y s a t -
t h e f r o n t
∗
∗/
v o i d o p e r a t o r () ;
• ∗ ∗
∗
∗ I n d e x i n g o v e r l o a d
∗
∗
This f u n c t i o n
w i l l
not
be t e s t e d
f o r t h e
c a s e s
i n which
Car i n g i v e n -
p o s i t i o n d o e s
not
e x i s t .
∗
∗
@param :
c a r
i n
p o s i t i o n
Car i n t h e g i v e n
p o s i t i o n
∗
@returns
t h e
c a r i n
t h e
d e s i r e d
p o s i t i o n
i n t h e
c u r r e n t
l a p
∗/
Car o p e r a t o r [ ] ( c o n s t i n t car_in_position) ;
• ∗ ∗
∗
∗ I n d e x i n g o v e r l o a d
∗
∗ This f u n c t i o n w i l l not be t e s t e d f o r t h e c a s e s i n which Car with g i v e n -
d r i v e r n a m e d o e s not e x i s t .
∗
∗ @param : d r i v e r n a m e d r i v e r ' s name o f t h e d e s i r e d c a r
∗ @returns t h e c a r whose d r i v e r named a s t h e g i v e n @param
∗/
Car o p e r a t o r [ ] ( std : : string driver_name) ;
• ∗ ∗
∗ Assignment
∗
∗ @param r h s The Race t o a s s i g n i n t o t h i s r a c e
∗ @return The a s s i g n e d Race
∗/
Race& o p e r a t o r =( c o n s t Race& rhs) ;
• ∗ ∗
∗ Stream o v e r l o a d .
∗
∗ What t o stream :
∗ P o s i t i o n ∗D r i v e r Name( l e a d e r o f t h e r a c e ) L a t e s t Laptime F a s t e s t -
Laptime o f t h e Dr ive r Sum o f Laptimes ( i n d i s p l a y Laptime format ) Po int s -
E xt r a Po i n t ( I f a p p l i c a b l e )
. . .
∗ P o s i t i o n ∗D r i v e r Name( l a s t p l a c e o f t h e r a c e ) L a t e s t Laptime F a s t e s t -
Laptime o f t h e Dr ive r Sum o f Laptimes ( i n d i s p l a y Laptime format ) Po int s -
E xt r a Po i n t ( I f a p p l i c a b l e )
∗
∗ Example :
8
∗
001
TUF
1:19.461
1:18.935
60:35.193
25
∗
002
UTA
1:19.335
1:18.335
60:37.321
18
1
∗
003
GRT
1:20.223
1:19.932
60:45.184
15
∗ ...
∗
099
CEI
1:21.005
1:19.867
63:47.293
∗
100
ECH
1:23.213
1:21.331
64:00.123
∗
∗
@Important :
f o r
d r i v e r numbers
s m a l l e r i n
s i z e
you have
t o
put
z e r o s
a s
-
much
a s
n e c c a s a r y
t o t h e i r
b e g i n n i n g
∗
Example :
i f
t h e r e
i s
11 r a c e r s
f i r s t p o s i t i o n
s h o u l d
be
01
∗
@Important . you can u s e Laptime ostream when n e c c e s s a r y
∗
@Important : You s h o u l d o r d e r
t h e r a c e r s a c c o r d i n g t o
t h e i r
t o t a l l a p t i m e
∗
@Important :
There
a r e
two
d i f f e r e n t p o i n t
t y p e s f o r
F1
∗
F i r s t
one
i s
t h e F a s t e s t
Lap
p o i n t which
i s
1
p o i n t
and
i t
i s
g i v e n
t h e
-
f a s t e s t
c a r
i f
i t
i s
i n
top
10
∗
Other
one
i s
normal r a c i n g p o i n t s and they
a r e
25 18
15
12
10864
2 1
i n -
t h i s
o r d e r
∗
∗
@param o s Stream t o be used .
∗
@param
c a r Car
t o be
streamed .
∗ @return The c u r r e n t Stream .
∗/
f r i e n d std : : ostream& o p e r a t o r <<(std : : ostream& os , c o n s t Race& race) ;
• DO NOT MODIFY THE UPPER PART
• ADD OWN PUBLIC METHODS/PROPERTIES BELOW
• ;
3.4 Championship
Championship is the nal part of this homework. They keep races with di erent names. Championship.
c l a s s Championship f
p r i v a t e :
std : : vector< Race > races ;
• DO NOT MODIFY THE UPPER PART
• ADD OWN PRIVATE METHODS/PROPERTIES BELOW
p u b l i c :
• ∗ ∗
∗ C o n s t r u c t o r .
∗
∗/
Championship ( ) ;
• ∗ ∗
∗ Copy C o n s t r u c t o r .
∗
∗ @param r h s The Championship t o be c o p i e d .
∗/
Championship( c o n s t Championship& rhs) ;
~Championship ( ) ;
9
• ∗ ∗
∗ Add a new Race t o Championship .
∗
∗ @Important : Purpose o f t h i s f u n c t i o n i s t o add t h e f i r s t r a c e .
∗
∗ @param r a c e Race t o add
∗/
v o i d addNewRace(Race& race) ;
• ∗ ∗
∗ Add a new Race t o Championship .
∗
∗
@Important :
You w i l l u s e
getAverageLaptime
f u n c t i o n
f o r t h i s
∗
@Important :
You can u s e
copy
c o n s t r u c t o r
o f
t h e
Race
c l a s s i n o r d e r
∗
t o j u s t copy
d r i v e r
names
f o r
your
new Race
∗
@Important :
D r i v e r
names
s h o u l d be
same
f o r
each
r a c e
∗
∗
@param race name c r e a t e
a
new
r a c e
with
g i v e n name
∗/
v o i d addNewRace(std : : string race_name) ;
• ∗ ∗
∗ Remove r a c e from by u s i n g i t s name
∗
∗ @param race name remove r a c e from championship
∗
∗/
v o i d removeRace(std : : string race_name) ;
• ∗ ∗
∗
∗ Add l a p t o r a c e with t h e g i v e n name
∗
∗ @param race name you w i l l f i n d t h e r a c e with t h i s name and add a l a p t o i t
∗/
v o i d addLap(std : : string race_name) ;
• ∗ ∗
∗
∗ I n d e x i n g o v e r l o a d
∗
∗
∗ @param : r a c e name
∗ @returns t h e d e s i r e d Race
∗/
Race o p e r a t o r [ ] ( std : : string race_name) ;
• ∗ ∗
10
∗ Stream o v e r l o a d .
∗
∗ What t o stream :
∗ Championship R e s u l t s
∗ D r i v e r Surname f i r s t t h r e e l e t t e r s i n c a p i t a l ( from winner ) T o t a l P o i n t s
∗ ...
∗ D r i v e r Surname f i r s t t h r e e l e t t e r s i n c a p i t a l ( t o l a s t p l a c e ) T o t a l P o i n t s ∗
∗ Example :
∗ Championship R e s u l t s
∗ 01 RAI 194
∗ 02 HAM 190
∗ 03 LEC 100
∗ 77 OCO 60
∗78RIC 1
∗79GRO 0
∗
∗
@Important :
f o r
d r i v e r p l a c e m e n t s numbers s m a l l e r i n
s i z e
you have t o put -
z e r o s a s
much
a s
n e c c a s a r y t o
t h e i r
s t a r t
∗
Example :
i f
t h e r e
i s
111 r a c e r s
f i r s t
p o s i t i o n
s h o u l d
be
001
∗
@Important :
You
w i l l
o r d e r d r i v e r s a c c o r d i n g t o
t h e i r
t o t a l p o i n t s
∗
∗
@param o s Stream t o be used .
∗
@param c a r
Car
t o
be
streamed .
∗ @return The c u r r e n t Stream .
∗/
f r i e n d std : : ostream& o p e r a t o r <<(std : : ostream& os , c o n s t Championship& - championship) ;
• DO NOT MODIFY THE UPPER PART
• ADD OWN PUBLIC METHODS/PROPERTIES BELOW
• ;
• Extras
While generating Cars you need to produce random double value for its performance. To do this, you MUST use Utilizer class. It’ll return random small double numbers.
The implementation of the the Utilizer is already provided to you. Hence, you just need to do this:
d o u b l e performance = Utilizer : : generatePerformance ( ) ;
You also MUST use Utilizer::generateLaptimeVariance() for generating a di erence to average lap-time. After that you will add this to calculate laptime of the car (You will do this for every lap). For generating average laptimes of the Races you again MUST use Utilizer::generateAverageLaptime() func-tion which will return an integer value (You will turn it to Laptime class).
The summary of the memory ownership:
• A Laptime WILL NOT own its nextLaptime.
• A Car WILL NOT own its nextCar.
• A Car WILL own the headLaptime when constructed with.
• A Race WILL own the headCar.
• CopyConstructers WILL not yield ownership of the old variables.
11
• assignment operator "=" WILL yield ownership of the old variables.
• Owning a Car/Laptime also means owning the nextCar/nextLaptime, and the nextCar/nextLaptim of the nextCar/nextLaptime, ...
• Grading
◦ Full grade for Laptime class implementation 15 points.
◦ Full grade for Car class implementation 30 points.
◦ Full grade for Race class implementation 30 points.
◦ Full grade for Championship class implementation 25 points.
In order to get full grade from each part your code should not have any memory leak. This will be checked with valgrind. While grading your classes will be used with the correct implementations, therefore they are expected to work as commented in the code.
• Regulations
◦ Programming Language: You must code your program in C++ (11). Your submission will be compiled with g++ with -std=c++11 ag on department lab machines.
◦ Allowed Libraries: You may include and use C++ Standard Library. Use of any other library (especially the external libraries found on the internet) is forbidden.
◦ Memory Management: When an instance of a class is destructed, the instance must free all of its owned/used heap memory. Any heap block, which is not freed at the end of the program will result in grade deduction. Please check your codes using valgrind {leak-check=full for memory-leaks.
◦ Late Submission: You have a total of 10 days for late submission. You can spend this credit for any of the assignments or distribute it for all. For each assignment, you can use at most 3 days-late.
◦ Cheating: In case of cheating, the university regulations will be applied.
◦ Newsgroup: It’s your responsibility to follow the cengclass forums for discussions and possible updates on a daily basis.
• Submission
Submission will be done via CengClass. Create a zip le named hw3.zip that contains:
• Laptime.h
• Laptime.cpp
• Car.h
• Car.cpp
• Race.h
• Race.cpp
12
• Championship.h
• Championship.cpp
Do not submit a le that contains a main function. Such a le will be provided and your code will be compiled with it. Also, do not submit a Make le.
Note: The submitted zip le should not contain any directories! The following command sequence is expected to run your program on a Linux system:
• unzip hw3.zip
• make clean
• make all
• make run
• -optional- make valgrind
13