ECE2036_Lab5.htm



ECE
2036                                                                                                                   Spring 2015


Lab
5: Complex, Matrix, RealMatrix, and ComplexMatrix classes


Assigned:
March 14, 2015                                                      Section
B: Due March 30, 2015


Section A: Due
March 31, 2015


In this lab, you will use C++ to perform
calculations using complex numbers and complex matrices.  You must write classes containing overloaded
operators to achieve the following:


·       a
Complex
class
which stores the real and imaginary parts of a complex number as
double
private data members, whose overloaded operators can


o  
input and output complex numbers


o  
add a real (double)
number to a complex number, and vice versa


o  
add two complex numbers


o  
multiply a real (double)
number by a complex number, and vice versa


o  
multiply two complex numbers


·       a
RealMatrix class which stores the
real (
double)
matrix elements of a real matrix and a
ComplexMatrix class
which stores the
Complex matrix elements of a
complex matrix, whose overloaded operators and functions can


o  
input and output real and complex
matrices


o  
multiply a real matrix by a complex
matrix, and vice versa


o  
multiply two complex matrices


We could store a real matrix as a complex matrix
with zero imaginary parts, but that would waste memory.  It is more efficient to store only the real
matrix elements of real matrices. 
However, the
RealMatrix and
ComplexMatrix objects
are both matrices, and the two classes have some identical data members and
functions.  Therefore, you will be coding
four classes with overloaded operators: a
Complex
class to store and manipulate a complex number, an abstract
Matrix
class, a
RealMatrix class which
inherits from
Matrix and stores purely real matrices, and a ComplexMatrix
class which inherits from
Matrix and stores complex
matrices. In addition to inheritance, you must also use composition and
polymorphism; i.e. the
ComplexMatrix
class must include a private data member which is a 2d array or vector of
Complex
objects, and a
Matrix reference or pointer
must be compatible with both
RealMatrix and
ComplexMatrix objects
.
  You must also write the standalone function inputMatrix, which
reads and interprets the user inputted matrix as described in more detail
below.


The code you write should be contained in at least
seven files, named as follows: Complex.h, RealMatrix.h, and ComplexMatrix.h,
which will contain the class definitions; and Complex.cpp, Matrix.cpp,
RealMatrix.cpp, and ComplexMatrix.cpp, which will contain the function
implementations.  You may choose to place
inputMatrix in its own
separate file.  I have provided a Matrix.h file containing a
Matrix
class definition, and a main.cpp file which is designed to test the
functionality of your classes.  You can
download these files here:


http://users.ece.gatech.edu/~bklein/2036/lab5/main.cpp


http://users.ece.gatech.edu/~bklein/2036/lab5/Matrix.h


You can modify Matrix.h as
desired, it is only a ‘suggestion’.  However, for purposes of the check-off you
must use an unmodified copy of main.cpp. 
Feel free to modify main.cpp as needed while coding and testing your
classes.  When possible, you should write
and test a single function at a time, so I recommend commenting out most of
main.cpp and uncommenting only the parts that utilize the class components that
you have already written.  Alternatively,
you could write your own main.cpp to test your classes.  During check-off, the TA will compile the
combined program (my main.cpp and plus the eight class files) and test that it
provides the correct output in response to values they input.  Sample output is provided below; obviously
the TA or grader will use different inputs when testing your code.


Input
and output


For full credit, you must write your input functions
(the overloaded >> operator in the case of
Complex
class, the
inputMatrix
function in the case of the matrix classes) to be able to accept input similar
to Matlab.  A
complex number should be entered by the user in the form x + i y or x – i y, insensitive to extra
spaces.  A complex or real matrix should be
entered by the user inside square brackets, with rows separated by semicolons,
in the form [ x1 ±  i y1    x2  ±  i y2    x3  ±  i y3 ;  x4  ±  i y4     x5  ±  i y5     x6  ±  i y6   ] ,
which would create a 2 x 3 matrix of complex numbers.  This should also be insensitive to extra
spaces, and if the user wants to enter a purely real number they should be able
to entirely omit the imaginary part.  If
the user enters a matrix whose elements are all entirely real, your code must
automatically store this as a
RealMatrix object;
otherwise matrices should be stored as
ComplexMatrix objects.  However, you do NOT need to perform input checking to ensure the user has entered
proper data; we will make the (foolish) assumption that the user knows what
they’re doing.  The only input checking
that must be done is ensuring that the number of columns of the first matrix
entered equals the number of rows of the second matrix entered so that they can
be multiplied, but this has already been written for you in main.cpp.  


The complex and complex matrix outputs must be neat
and readable.


Checking
off


Please demonstrate your code for the TA or grader by
the end of office hours on the due date. 
Bring your checkoff sheet with your name
already written at the top.  If there are
students waiting to checkoff in Klaus 1446 at the end
of office hours on the due date, the grader or TA will write down the names of
the waiting students on a list.  Those
students will then upload their completed code to t-square,
and they will have three days afterwards to visit office hours, download their
(unmodified) code, and demonstrate it for the grader or TA.


http://users.ece.gatech.edu/~bklein/2036/lab5/Lab5_Checkoff_Sheet.pdf


Sample
output from completed code (user input indicated in red)


Initial variable values:


c1 = 1 + i5, c2 = 0 + i0


 


Please enter complex number c3, in the format X + iY, or X – iY: 4.2 + i 0.25


You entered c3 = 4.2 + i0.25


Please enter a double precision number d1: 7.1


d1 + c3 = 11.3 + i0.25


c3 + d1 = 11.3 + i0.25


 


d1 * c3 = 29.82 + i1.775


c3 * d1 = 29.82 + i1.775


 


Please enter another complex number c4, in the format X + iY, or X – iY: -3.7 – i 22.1


c3 + c4 = 0.5 – i21.85


c3 * c4 = -10.015 – i93.745


 


Please enter the first matrix to be multiplied:


[ 
0.55
-2 ; 2 + i
8  -1.1 + i 2;
56.1 – i 13.3 9 ]


The matrix you entered was:


      0.55 + i0        -2 + i0


         2 + i8      -1.1 + i2


      56.1 – i13.3      9 + i0


Please enter the second matrix to be multiplied:


[ 
77.1
+ i6 
3.5 90 –i 10; 32 33 – i0.01 10 ]


The matrix you entered was:


      77.1 + i6       3.5 + i0        90 – i10


        32 + i0        33 – i0.01     10 + i0


The product of the two matrices is:


   -21.595 + i3.3      -64.075 + i0.02    29.5 – i5.5


        71 + i692.8    -29.28 + i94.011    249 + i720


   4693.11 – i688.83   493.35 – i46.64     5006 – i1758


The memory allocated for the matrix has been deleted.


The memory allocated for the matrix has been deleted.


The memory allocated for the matrix has been deleted.