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.