$24
• 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
Summary of HW3: Implement the methods in the given 3 classes (Transaction, Account, Bank). Banks have Accounts and Accounts have Transactions. You can nd more detail in their respective sections.
In this homework you are a programmer and your supervisors want certain features in their Bank system. Your task is to implement Transaction, Account and Bank systems that are provided you with a header le(You will not edit header les). 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.
1
• Class De nitions
3.1 Transaction
Transaction is the most basic class in this homework. Basically, it holds a certain amount and date of the Transaction.
c l a s s Transaction f
p r i v a t e :
d o u b l e _amount ;
time_t _date ;
p u b l i c :
• ∗ ∗
∗ Empty c o n s t r u c t o r
g i v e 1 t o e v e r y t h i n g
∗/
Transaction ( ) ;
• ∗ ∗
∗ C o n s t r u c t o r
∗
∗ @param amount The v a l u e o f T r a n s a c t i o n (Can be n e g a t i v e o r p o s i t i v e )
∗ @param d a t e T r a n s a c t i o n d a t e
∗/
Transaction( d o u b l e amount , time_t date) ;
• ∗ ∗
∗ Copy C o n s t r u c t o r .
∗
∗ @param r h s The T r a n s a c t i o n t o be c o p i e d .
∗/
Transaction( c o n s t Transaction& rhs) ;
• ∗ ∗
∗ Compare two T r a n s a c t i o n based on t h e i r d a t e ∗
∗ @param r h s Compared T r a n s a c t i o n
∗ @return I f c u r r e n t T r a n s a c t i o n happened b e f o r e t h e g i v e n T r a n s a c t i o n -
r e t u r n t r u e
e l s e r e t u r n f a l s e
∗/
b o o l o p e r a t o r <( c o n s t Transaction& rhs) c o n s t ;
• ∗ ∗
∗ Compare two T r a n s a c t i o n based on t h e i r d a t e ∗
∗ @param d a t e Compared d a t e
∗
@return I f c u r r e n t T r a n s a c t i o n happened a f t e r t h e g i v e n T r a n s a c t i o n r e t u r n -
t r u e
∗
e l s e r e t u r n f a l s e
∗/
b o o l o p e r a t o r >( c o n s t Transaction& rhs) c o n s t ;
• ∗ ∗
∗ Compare a T r a n s a c t i o n with a g i v e n d a t e
∗
∗ @param d a t e Compared d a t e
2
∗ @return I f c u r r e n t T r a n s a c t i o n happened b e f o r e t h e g i v e n d a t e r e t u r n t r u e ∗ e l s e r e t u r n f a l s e
∗/
b o o l o p e r a t o r <( c o n s t time_t date) c o n s t ;
• ∗ ∗
∗ Compare a T r a n s a c t i o n with a g i v e n d a t e ∗
∗ @param d a t e Compared d a t e
∗ @return I f c u r r e n t T r a n s a c t i o n happened a f t e r t h e g i v e n d a t e r e t u r n t r u e ∗ e l s e r e t u r n f a l s e
∗/
b o o l o p e r a t o r >( c o n s t time_t date) c o n s t ;
• ∗ ∗
∗
Sum t h e
v a l u e
o f two
T r a n s a c t i o n amounts
∗
∗
@param
r h s
The
t r a n s a c t i o n
t o sum o v e r
∗
@return
The
output o f
t h e
summation i n
d o u b l e format
∗/
d o u b l e o p e r a t o r +( c o n s t Transaction& rhs) ;
• ∗ ∗
∗ Sum t h e v a l u e o f a T r a n s a c t i o n with a n o t h e r d o u b l e ∗
∗ @param add The amount t o sum o v e r
∗ @return The output o f t h e summation i n d o u b l e format
∗/
d o u b l e o p e r a t o r +( c o n s t d o u b l e add) ;
• ∗ ∗
∗ Assignment o p e r a t o r
∗
∗ @param r h s T r a n s a c t i o n t o a s s i g n
∗ @return t h i s T r a n s a c t i o n
∗/
Transaction& o p e r a t o r =( c o n s t Transaction& rhs) ;
• ∗ ∗
∗ Stream o v e r l o a d
∗
∗ What t o stream :
∗
T r a n s a c t i o n amount"tab
tab"hour : minute : second day/month/ y e a r ( i n l o c a l t i m e )
∗
∗
@param
o s Stream t o
be
used .
∗
@param
t r a n s a c t i o n
T r a n s a c t i o n t o be streamed .
∗ @return t h e 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 Transaction& - transaction) ;
• ;
3
3.2 Account
The account is de ned for a single user and users have their respective ids. Accounts also hold Transaction information of their user in a sorted manner.
c l a s s Account f
p r i v a t e :
i n t _id ;
Transaction∗∗ _activity ;
i n t ∗ _monthly_activity_frequency ;
p u b l i c :
• ∗ ∗
∗ Empty c o n s t r u c t o r
g i v e t h e i d a s 1
g i v e n u l l p t r f o r p o i n t e r s
∗/
Account ( ) ;
• ∗ ∗
∗ C o n s t r u c t o r
∗
∗
∗
Note : The g i v e n
a c t i v i t y
a r r a y
w i l l have
12
T r a n s a c t i o n ∗
∗
Each o f
t h e s e
T r a n s a c t i o n ∗ w i l l
r e p r e s e n t
a
month
from t h e
2019
∗
B a s i c a l y
a c t i v i t y [ 0 ]
w i l l
r e p r e s e n t January
∗
a c t i v i t y [ 1 1 ]
w i l l r e p r e s e n t
February
∗
a c t i v i t y [ 1 1 ]
w i l l r e p r e s e n t
March
∗
. . .
∗
a c t i v i t y [ 1 0 ]
w i l l r e p r e s e n t
November
∗
a c t i v i t y [ 1 1 ]
w i l l r e p r e s e n t
December
∗
a c t i v i t y [ 0 ]
w i l l o n l y
c o n t a i n T r a n s a c t i o n s happened i n January
∗
However ,
be
c a r e f u l
t h a t
T r a n s a c t i o n s
i n s i d e
o f
a c t i v i t y [ i ]
w i l l
not be
i n
-
s o r t e d o r d e r
∗
For Example : We
a r e
c e r t a i n t h a t
a c t i v i t y [ 0 ]
i s
c o n t a i n i n g
T r a n s a c t i o n s
-
happened i n January 2019
∗
But we a r e
not
s u r e which
o f
them
happened
f i r s t .
∗
I s t r o n g l y
s u g g e s t
you t o
u s e
a
s o r t i n g a l g o r i t h m
w h i l e
s t o r i n g
t h e s e
-
T r a n s a c t i o n t o
your
o b j e c t .
∗
( S o r t i n g
by
t h e
date ,
So
t h a t
you
can
d i r e c t l y
u s e
them
i n
stream
o v e r l o a d
-
)
∗
(You can
u s e
bubble
s o r t )
∗
∗
@param i d i d
o f
t h i s
Account
∗
@param
a c t i v i t y
2d
T r a n s a c t i o n
a r r a y
f i r s t
l a y e r s
l e n g h t
i s
12 f o r
each
-
month
∗
@param
m o n t h l y
a c t i v i t y f r e q u e n c y
how
many
t r a n s a c t i o n s
made i n
each month
∗/
Account( i n t id , Transaction∗∗ c o n s t activity , i n t ∗ monthly_activity_frequency -
) ;
• ∗ ∗
∗ D e s t r u c t o r
∗
∗ Do not f o r g e t t o f r e e t h e s p a c e you have c r e a t e d ( This a s s i g n m e n t d o e s not -
u s e smart p o i n t e r s )
∗/
4
~Account ( ) ;
• ∗ ∗
∗ Copy c o n s t r u c t o r ( Deep copy )
∗
∗ @param o t h e r The Account t o be c o p i e d
∗/
Account( c o n s t Account& rhs) ;
• ∗ ∗
∗
Copy
c o n s t r u c t o r ( Deep copy )
∗
∗
This
copy c o n s t r u c t o r s
t a k e s two
t i m e
t e l e m e n t s
∗
T r a n s a c t i o n s
o f
t h e
o l d
Account
w i l l
be c o p i e d
t o
new
Account
∗
i f and
o n l y
i f
they
a r e
between
t h e s e
g i v e n d a t e s
∗
Given
d a t e s
w i l l not
be
i n c l u d e d .
∗
∗
@param r h s The Account t o be c o p i e d
∗
@param
s t a r t
d a t e S t a r t i n g
d a t e
f o r t r a n s a c t i o n
t o
be
c o p i e d .
∗
@param
e n d d a t e
Ending
d a t e
f o r
t r a n s a c t i o n s t o
be
c o p i e d .
∗/
Account( c o n s t Account& rhs , time_t start_date , time_t end_date) ;
• ∗ ∗
∗ Move c o n s t r u c t o r
∗
∗ @param r h s Account which you w i l l move t h e r e s o u r c e s from
∗/
Account(Account&& rhs) ;
• ∗ ∗
∗ Move a s s i g n m e n t o p e r a t o r
∗
∗ @param r h s Account which you w i l l move t h e r e s o u r c e s from
∗ @return t h i s a c c o u n t
∗/
Account& o p e r a t o r =(Account&& rhs) ;
• ∗ ∗
∗ Assignment o p e r a t o r ∗ deep copy
∗
∗ @param r h s Account t o a s s i g n
∗ @return t h i s a c c o u n t
∗/
Account& o p e r a t o r =( c o n s t Account& rhs) ;
• ∗ ∗
∗ E q u a l i t y comparison o v e r l o a d
∗
∗ This o p e r a t o r c h e c k s o n l y i d o f t h e Account ∗
∗ @param r h s The Account t o compare
∗ @return r e t u r n s t r u e i f both i d s a r e same f a l s e o t h e r v i s e
∗/
b o o l o p e r a t o r==(c o n s t Account& rhs) c o n s t ;
• ∗ ∗
5
∗ E q u a l i t y comparison o v e r l o a d
∗
∗ This o p e r a t o r c h e c k s o n l y i d o f t h e Account ∗
∗ @param i d t o compare
∗ @return r e t u r n s t r u e i f both i d s a r e same f a l s e o t h e r v i s e
∗/
b o o l o p e r a t o r==(i n t id) c o n s t ;
• ∗ ∗
∗
sum and
e q u a l o p e r a t o r
∗
Add T r a n s a c t i o n s
o f
two Accounts
∗
You have
t o add
t r a n s a c t i o n s i n
c o r r e c t
p l a c e s i n
your
a c t i v i t y a r r a y
∗
Note : Remember t h a t
a c t i v i t y [ 0 ]
i s always January
and
a c t i v i t y [ 1 1 ] i s -
always
December
∗
( This i n f o r m a t i o n a l s o h o l d s f o r
e v e r y
o t h e r month)
∗
∗
You can
have T r a n s a c t i o n s with t h e same
d a t e
∗
∗
@param r h s Account which t a k e new T r a n s a c t i o n s from
∗
@return
t h i s Account
a f t e r adding new T r a n s a c t i o n s
∗/
Account& o p e r a t o r+=(c o n s t Account& rhs) ;
• ∗ ∗
∗ How much money Account has (Sum o f T r a n s a c t i o n amounts )
∗
∗
∗ @return t o t a l amount o f t h e money o f t h e a c c o u n t
∗/
d o u b l e balance ( ) ;
• ∗ ∗
∗ How much money Account has a t t h e end o f g i v e n d a t e
∗
∗ Given d a t e w i l l not be i n c l u d e d .
∗ @param e n d d a t e You w i l l count t h e amounts u n t i l t h i s g i v e n d a t e ( not -
i n c l u s i v e )
∗ @return T o t a l amount t h e Account has u n t i l g i v e n d a t e
∗/
d o u b l e balance(time_t end_date) ;
• ∗ ∗
∗ How much money Account between g i v e n d a t e s
∗ Given d a t e s w i l l not be i n c l u d e d .
∗
∗ @param e n d d a t e You w i l l count t h e amounts between g i v e n d a t e s ( not -
i n c l u s i v e )
∗ @return T o t a l amount t h e Account has between g i v e n d a t e s
∗ You w i l l o n l y count a T r a n s a c t i o n amount i f and o n l y i f i t o c c u r e d between -
g i v e n d a t e s
∗/
d o u b l e balance(time_t start_date , time_t end_date) ;
6
• ∗ ∗
∗ Stream o v e r l o a d .
∗
∗
∗
∗ What t o stream
∗ Id o f t h e u s e r
E a r l i e s t T r a n s a c t i o n amount"tab" "tab"hour : minute : second day/month/ y e a r ( i n -
l o c a l t i m e )
∗ Second e a r l i e s t T r a n s a c t i o n amount"tab" "tab"hour : minute : second day/month/ -
y e a r ( i n l o c a l t i m e )
∗ ...
∗ L a t e s t T r a n s a c t i o n amount"tab tab"hour : minute : second day/month/ y e a r ( i n - l o c a l t i m e )
∗
∗
Note :
a c t i v i t y
a r r a y w i l l o n l y
c o n t a i n
d a t e s
from January
2019 t o -
December
2019
∗
Note :
T r a n s a c t i o n s s h o u l d
be i n
o r d e r by
d a t e
∗
Note :
e i t h e r
o f
m o n t h l y
a c t i v i t y f r e q u e n c y o r
a c t i v i t y i s
n u l l p t r
∗
you w i l l
j u s t
stream
∗1
∗ @param o s Stream t o be used .
∗ @param Account t o be streamed . ∗ @return t h e 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 Account& account) ;
• ;
3.3 Bank
The bank keeps track of accounts.
c l a s s Bank f
p r i v a t e :
std : : string _bank_name ;
i n t _user_count ;
Account∗ _users ;
p u b l i c :
• ∗ ∗
∗ Empty c o n s t r u c t o r
g i v e t h e bank name a s " n o t d e f i n e d "
g i v e n u l l p t r f o r p o i n t e r s
g i v e 0 a s u s e r s c o u n t
∗/
Bank ( ) ;
• ∗ ∗
∗ C o n s t r u c t o r
∗
∗
∗
@param
bank name name o f
t h i s
bank
∗
@param
u s e r s
p o i n t e r t o
h o l d
u s e r s
o f
t h i s
bank
∗
@param
u s e r
c o u n t number
o f u s e r s
t h i s
bank
has
7
∗/
Bank(std : : string bank_name , Account∗ c o n s t users , i n t user_count) ;
• ∗ ∗
∗ D e s t r u c t o r
∗
∗ Do not f o r g e t t o f r e e t h e s p a c e you have c r e a t e d ( This a s s i g n m e n t d o e s not -
u s e smart p o i n t e r s )
∗/
~Bank ( ) ;
• ∗ ∗
∗ Copy c o n s t r u c t o r ( Deep copy )
∗
∗ @param r h s The Bank t o be c o p i e d
∗/
Bank( c o n s t Bank& rhs) ;
• ∗ ∗
∗ You s h o u l d deep copy t h e c o n t e n t o f t h e s e co n d bank
∗ Merge two banks
∗ I f both banks has a u s e r with t h e same id , T r a n s a c t i o n s o f t h e s e u s e r s - w i l l be merged i n t o t h e same Account
∗ For example :
∗
Bank1
has
[1 ,2]
i d u s e r s
∗
Bank2
has
[2 ,3]
i d u s e r s
∗
∗
Bank1
a f t e r
+=
o p e r a t o r
w i l l have [ 1 , 2 , 3 ]
i d u s e r s
∗
User
with
i d
2
w i l l
have
i t s t r a n s a c t i o n s
h i s t o r i e s merged
∗
∗
T r a n s a c t i o n s
with o f
t h e
u s e r s with t h e same i d s h o u l d be merged and -
updated
∗ @param r h s Merged Bank
∗ @return t h i s Bank
∗/
Bank& o p e r a t o r+=(c o n s t Bank& rhs) ;
• ∗ ∗
∗ Add a new a c c o u n t t o Bank
∗
I f t h e newly added u s e r a l r e a d y e x i s t s i n t h i s Bank merge t h e i r -
T r a n s a c t i o n s
∗
∗ @param new acc new a c c o u n t t o add t o bank
∗ @return t h i s Bank
∗/
Bank& o p e r a t o r+=(c o n s t Account& new_acc) ;
/∗ ∗ I n d e x i n g o p e r a t o r o v e r l o a d
∗
∗
Return t h e
Account with
t h e
g i v e n i d
∗
∗
I f t h e r e
i s
no Account
with
t h e g i v e n
i d r e t u r n
t h e f i r s t
e l e m e n t
∗
∗
@param a c c o u n t i d
i d
o f
t h e
Account
∗
@return
i f
g i v e n
i d
e x i s t i n
t h e bank
r e t u r n t h e
account ,
e l s e r e t u r n t h e -
f i r s t a c c o u n t
∗
∗/
Account& o p e r a t o r [ ] ( i n t account_id) ;
8
• ∗ ∗
∗ Stream o v e r l o a d .
a l l t h e a c c o u n t s w i l l be between 01 01 2019 and 31 12 2019
∗ What t o stream
∗
bank name"tab"number
o f u s e r s
who
a r e
e l i g i b l e
f o r
a l o a n "tab" t o t a l
-
b a l a n c e
o f
t h e
bank
∗
∗
A u s e r
i s
s a f e f o r
a
l o a n
i f
and
o n l y
i f
t h a t
u s e r
d i d
not
have any
-
n e g a t i v e b a l a n c e
f o r
2 o r more
c o n s e c u t i v e months
∗
For
example ,
l e t ' s
say our
bank
named
a s
"banana"
has
two
u s e r s
∗
∗
User
A ' s
b a l a n c e
f o r
each
month
i s
a s
g i v e n
∗
∗
January
0
∗
February
0
∗
March
100
∗
A p r i l
20
∗
May
30
∗
June
40
∗
J u l y
60
∗
August
0
∗
September
0
∗
October
0
∗
November
0
∗
December
0
∗
∗
This
u s e r
i s
not
e l i g i b l e
b e c a u s e
i n
A p r i l and
May
h i s / h e r
b a l a n c e
was -
n e g a t i v e ( c o n s e c u t i v e )
∗
You
s t i l l
have
t o
add
150
t o
t h e t o t a l
b a l a n c e
o f
t h e
bank
∗
User
B ' s
b a l a n c e
f o r
each
month i s a s
g i v e n
∗
∗
January
0
∗
February
0
∗
March
100
∗
A p r i l
20
∗
May
40
∗
June
30
∗
J u l y
60
∗
August
0
∗
September
0
∗
October
0
∗
November
0
∗
December
0
∗
∗
This u s e r
i s e l i g i b l e
b e c a u s e
n e g a t i v e
b a l a n c e s
were
not c o n s e c u t i v e
∗
You
w i l l
a l s o
add
150
t o
t h e
t o t a l b a l a n c e o f t h e
bank
∗
∗ your output w i l l be a s
∗ banana 1 300
∗/
f r i e n d std : : ostream& o p e r a t o r <<(std : : ostream& os , c o n s t Bank& bank) ;
• ;
9
• Extras
You have to check for memory leaks in your code. Any memory leak in certain class will result in point reduction.
You can test your code for any memory leak by using valgrind. (Provided MakeFile has valgrind option)
You can also test your implementation by using transaction test.cpp, account test.cpp, bank test.cpp, and compare your results with provided corresponding example *.txt les. (Some text editors might display tab character in a di erent format. To look at the output in the best way use gedit in Ubuntu, TextEdit in Mac or just open it with vi)
Note: You can test your classes with (ouputs of these runs also given to you)
• make transaction
• make run
• make valgrind
• make account
• make run
• make valgrind
• make bank
• make run
• make valgrind
• Grading
◦ Full grade for Transaction class implementation 15 points.
◦ Full grade for Account class implementation 60 points.
◦ Full grade for Bank class implementation 25 points.
To get a full grade from each part your code should not have any memory leak. This will be checked with Valgrind. If any of your classes have memory leak your grade will be reduced by 10 points from the overall points you get for that class. (Let say your Account class has memory leak because of some of your functions, in this case even if all your functions run correctly and passes all the tests you will get
50) If your code gives segmentation error in any part of the testing process you will not be graded for the remaining parts of the test.
Please remember that these classes require each other to function properly. If your Transaction functions have problems, your Account and Bank Functions can also have problems. This will be e ective in the testing process. For example, if your Account constructor does not work in a correct way(can be segmentation or any other run time error) we can not grade you for remaining functions.
• 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 can only use libraries provided inside of headers. 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.
10
• 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 cow 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:
• Transaction.cpp
• Account.cpp
• Bank.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
11