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
theyre 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.