5614. C++ Programming

M.Sc. in High-Performance Computing

5614. C++ Programming

Assignment 2

February 24, 2024

Instructions

.  Submit this tar-ball via Blackboard before 1stMar.

.  Gather all your code and pdf/text files into a single tar-ball.

.  Late submissions without prior arrangement or a valid explanation will result in reduced marks.

.  All non-code answers should be submitted in a single pdfor text file.  If you write and scan in, please make sure I can read it!

.  The non-code questions only need short answers - not an essay!

.  Read notes at end of this document.

.  Remember to use comments when appropriate.

Overview of Assignment 2

The assignment is in two parts.  The first part is for you to write a toy example on inheritance.

The purpose of the second part of the assignment is to introduce dynamic polymorphism in C++.

Some of you will be taking the Financial Applications course, but you don’t need to be taking it for the assignment.  The examples here are trivial.  Re- call that the basic principle when using OOP is that your class design should represent the real world problem you are solving.

The second part of the assignment has another toy example where you have a portfolio of three different types of financial instruments that you invested in. All three different types have different payoffs depending on their parameters. So we will have three different classes to represent each type.  Also, because each of the three is-a trade, we will also create a base Trade class.  We can then pass around pointers (or references) to the derived classes as pointers (or references) to the base class.

All of your trades will mature on the same day.  And you want to calculate the payoff from your portfolio, and the profit, given a particular level of the underlying.

Note on comments

10% of available marks will be allocated for comments where appropriate.  Sim- ilar to Assignment 1, please try to use some Doxygen comments.  You can see some basics here http://doxygen.nl/manual/docblocks.html. Doxygen is more useful for C++ than C. I can show my generated documentation for this code in the next class if you want to see it.  The generated class inheritance diagram for the first part is shown in Fig. 1 and for the second part Fig. 2.

General

The classes in this assignment are trivial.  In real-world code you might follow the rule of zero for these.  Because this is a assignment for practice, we will add destructors which print simple statements to screen.

It is better to follow the rule of five defaults.  For this assignment make sure to define (either explicitly, or default) or delete each of the five within your classes.

Note that because we mark some member variables as const, that means that the classes cannot be assigned to. So we will delete the assignment operators.

Forward Contract

A forward agreement is an agreement to pay a forward price F  in order to receive the underlying asset at maturity. The payoff is given by

ST  − F                                                      (1)

where ST  is the underlying asset price at maturity.

Call Option

A call option gives the owner the right, but not the obligation, to purchase the underlying asset for a fixed price called the strike prive K.  The payoff from a

max(ST  − K,0)                                               (2)

Put Option

A call option gives the owner the right,  but not the obligation,  to sell the underlying asset for a fixed price called the strike prive K.  The payoff from a put option is given by

max(K − ST , 0)                                             (3)

Q1. Makefile (5%)

Write a very simple Makefile to take care of your assignment.  Your file will have five targets:

1. assignment2a

2. assignment2b

3. assignment2b.o

4. portfolio.o

5. clean

(Although you can merge the second and third if you want) Don’t forget to mark clean as a phony target.

make  clean should just delete the executable and any intermediate files.  Don’t forget to mark it as a phony target. You can also add an additional all target which will build assignment2a and assignment2b.

For full marks, use some Makefile variables such as

CXX := g++
CXXFLAGS := −W −Wall −s t d=c++20

Try to use some automatic variables such as $@ and $< in your makefile com- mands. You can use pattern rules if you have covered them elsewhere but you will need to remember to take care of the header file dependencies (I didn’t cover any pattern rules).

Q2. Simple Inheritance (20%)

Download assignment2a.cc.  This contains the definition of struct Shape and a main function.  You should not need to change any of these.  Write your own function definitions for struct Cube and struct Cylinder in this file which inherit from Shape. Cube should have a const member variable side and a constructor which takes the length of the side as a parameter.  Cylinder should similarly have radius and height and a constructor which takes these as parameters.

Note 1: If you are having difficulty with the const member variables, it would be better to get it working with non-const than to not submit it.

Note 2:  If you have access to a compiler which supports C++20 then you can access a value for π via std::numbers::pi in the  header file. Else, you could do something like access M  PI in .

Possible output for Q2

s  g++  −o    assignment2a   assignment2a . cc    − Wall   −Wextra   −−std=c++20

s    . / assignment2a

Constructing    Shape    with    volume  =    1.728    and    surface   area  =    8.640 Constructing    Cube    with    side   =    1.200

Side   of    cube :                                                            1.200

Volume    of    cube :                                                      1.728

Surface   area    of    cube :                                  8.640

Constructing    Shape    with    volume  =    181.584    and    surface   area  =   179.448 Constructing    Cylinder    with    radius  =    3.400    and    height =5.000

Height    of    cylinder  :                                        5.000

Radius    of    cylinder  :                                        3.400

Volume    of    cylinder  :                                  181.584

Surface    area    of    cylinder  :               179.448

Destroying    Cylinder    with    radius  =    3.400    and    height =5.000

Destroying    Shape    with    volume  =    181.584    and    surface   area  =   179.448 Destroying    Cube    with    side   =    1.200

Destroying    Shape    with    volume  =    1.728    and    surface   area  =    8.640

Figure 1: Inheritance hierachy for Q2

Q3. Dynamic Polymorphism (30%)

Base class: Trade

You are given a partially complete definition of the Trade class in instruments.h

class    Trade

{

public  :

//   TODO:

//    (1)    Define    copy    and  move    constructors   as    default

//    (2)    Delete    assignment    operators

Trade ( )   :   cost    {0}{

std  : : cout  << ”Trade ( base class ) Constructor ( Default )/n” ; }

Trade    ( const    double    cost )   :   cost    { cost }  {

std  : : cout  << ”Trade ( base class ) Constructor ( overloaded )/n” ; }

virtual    ˜Trade    (){

std  : : cout  << ”Trade ( base class ) Destructor /n” ;

}

//   TODO:

//    (3)    declare    payoff    as    a  pure   virtual     constant    member    function

//    (4)    Grant    access    to    private    member    of    this   class

//                 to    any    non−member    functions    that    need    it

private  :

const    double    cost ;                     ///< Holds premium , or cost to enter the trad

};

You will need to add some lines where TODO is marked in the commments, but you will do this as you are completing the sections below.

The payoff constant member function takes ones parameter, ST , and cal- culates and returns the payoff for that trade at that underlying price.  Declare the function as a pure virtual function.

Figure 2: Inheritance hierachy for Q3

(A) Forward class

Write a class Forward which derives from Trade.  It should have one private member variable   const  double  forward_price    which stores the forward price. You should override the base class payoff function so that, when called, it returns the payoff.  from the contract (See Eq. 1). You do not want to further override this function in more derived classes if you later add any.

Explicitly delete the default Forward constructor.

The constructor which you write will take one parameter which is the forward price.   Forward   (double  fp)  . The forward contracts will have zero cost.

(B) Call class

Similarly, write a class Call which derives from Trade.   It  should have one private member variable   const  double  strike   which stores the strike price. You should override the base class payoff function so that, when called,  it returns the payoff from the contract (See Eq. 2).  You do not want to further override this function in more derived classes if you later add any.

Explicitly delete the default Call constructor.

The constructor which you write will take two parameters - strike price and cost.   Call  (double  cost,  double  k)  .

(C) Put class

Write a third class Put which also derives from Trade. It should have one private member variable   const  double  strike   which stores the strike price.  You should override the base class payoff function so that, when called, it returns the payoff from the contract (See Eq. 3).  You do not want to further override this function in more derived classes if you later add any.

Explicitly delete the default Put constructor.

The constructor which you write will take two parameters - strike price and cost.   Put  (double  cost,  double  k)  .

Q4. Non-member functions (10%)

Download the file portfolio.h which contains two function declarations. You will write the corresponding function definitions in portfolio.cc.

(A) Function to compute portfolio payoff (5)

Write

double    portfolio payoff ( const    std  : : vector &    trades  ,   const   double    S  T )

which iterates through the container of Trade*, and calculates, and returns, the overall payoff for the portfolio for a given underlying asset price ST .

(B) Function to calculate portfolio profit (5)

Write the function definition for

double     portfolio profit ( const    std  : : vector &    trades  ,   const    double    S  T )

which calculates the overall profit for the portfolio.

Q5. Putting it all together.  (5%)

The main function is provided in assignment2b.cc.  It is copied below.   Check that it compiles and works as expected.

assignment2b.cc

/* *

*    @ file   assignment2b . cc

*    @brief    Main    function   for    5614    Assignment    2    2024

*    @author   R .   M orrin

*    @version    4.0

*   @date   2024 − 02 − 24

*/

#include  

#include  

#include    ” instruments . h”

#include    ” portfo l io  . h”

in t    main ( )

{

std  : : vector    trades  ;

//   Add   some    trades

trades  . push  back (new    const    Forward   { 6 . 0 } ) ;

trades  . push  back (new    const    Forward   { 2 . 0 } ) ;

trades  . push  back (new    const   Call   {1.0 ,   6 . 0 } ) ;

trades  . push  back (new    const   Call   {5.5 ,   3 . 0 } ) ;

trades  . push  back (new    const    Put   {4.0 ,     7 . 0 } ) ;

trades  . push  back (new    const    Put   {4.5 ,   6 . 0 } ) ;

std  : : cout  << ” / n P ortfolio :/ nS  T”   << ’ / t ’ << ” Payoff ” << ’ / t ’ << ” P rofit /n” ; for ( in t stock  price  =    0 ;   stock  price  <= 15; ++stock  price )    {

std  : : cout  << stock  price  << ’ / t ’ << portfo l io  p ayoff ( trades  ,   stock  price ) << ’ / t ’ << p o rt fo l i o  p r o fit ( trades  ,   stock  price )  << ” /n” ;

}

std  : : cout   << ’ /n ’ ;

//    Delete     allocated    trades    manually

for   ( auto   i    =   0u ;   i    < trades . s ize ( ) ; ++i ) {

delete    trades  [ i  ] ;

}

return    0 ;

}

Sample output using provided main function

Output

>    . / assignment2b

Trade   ( base

class ) Constructor ( Default )

Constructor

for Forward with forward price 6

Trade   ( base

class ) Constructor ( Default )

Constructor

for Forward with forward price 2

Trade   ( base

class ) Constructor ( overloaded )

Creating Call with Trade ( base   class ) Creating Call with Trade ( base   class )

str ike 6 . Premium paid 1

Constructor ( overloaded )

str ike   3 . Premium paid   5.5 Constructor ( overloaded )

Creating    Put    with    str ike   7 .    Premium    paid    4

Trade    ( base    class )    Constructor   ( overloaded )    Creating    Put    with    str ike   6 .    Premium    paid    4.5

P o r t f o l i o  :

S - T                 Payoff        P rofit

0                       5                       − 10

1                       5                       − 10

2                       5                       − 10

3                       5                       − 10

4                       6                       − 9

5                       7                       − 8

6                       8                       − 7

7                       11                    −4

8                       15                    0

9                       19                    4

10                    23                    8

11                    27                    12

12                    31                    16

13                    35                    20

14                    39                    24

15                    43                    28

Trade    ( base    class )    Destructor

Deleting    Forward    with    forward    price 2

Trade    ( base    class )    Destructor

Destroying    Call    with    str ike 6

Trade    ( base    class )    Destructor

Destroying    Call    with    str ike 3

Trade    ( base    class )    Destructor

Destroying    Put    with    str ike 7

Trade    ( base    class )    Destructor

Destroying    Put    with    str ike 6

Trade    ( base    class )    Destructor

发表评论

电子邮件地址不会被公开。 必填项已用*标注