Due: Wednesday, December 13, 2023, at 11:59pm
In this assignment you will supply the implementation of a C++ type
for fractional numbers. You should do this assignment alone. We will
supply you with a small calculator program that evaluates arithmetic
expressions using your code. You can use this to experiment with and
test your implementation. But your only job is to provide an
implementation of type Rational
, as it is specified in
Rational.h
, and to complete a Makefile
to build the system.
To get started copy the file rational.tar
from the CSE374-Materials repository.
This file contains the starter code. (To learn more about tar files, read this.)The header file
Rational.h
contains the specification of the Rational class. The
archive also contains the source code for a small calculator program
that uses Rational
s and a simple Makefile
to
build it. You will need to fill in some details of the Makefile in order to use it.
Rational
is specified in file Rational.h
.
You will need to create a file called Rational.cpp, and implement the class
as it is specifed in the header file.
Your implementation of Rational
should return values in
lowest (i.e., factored) terms. In other words, the greatest common
divisor of the numerator and denominator of a Rational
should be 1, as far as can be detected by a program using type
Rational
. Furthermore, as far as an observer can tell, the
denominator of a Rational
should always be non-negative;
the numerator may be positive or negative as appropriate. This does not
constrain how Rationals
are actually represented, just how
they can be observed to behave.
You should implement type Rational
as defined in
Rational.h
. You may not modify the contents of this header
file or add or delete anything from it. (You should not modify any of the
other source code files, either.) You are free, of course, to
include additional helper functions and data in your
Rational.cpp
implementation file if these are useful.
You do not need to check for or deal with rationals that have a denominator
of 0 or similar issues. If a client of type Rational
creates a
Rational
with a denominator of 0, or if a calculation produces
such a result, simply create that result and return it.
You should use good style in your code, just like in our C programs, including using clint.py to check for issues.
The calculator program (supplied) is a simple line-oriented calculator for expressions involving rational numbers. Rationals can be entered as either a positive integer n, meaning n/1, or as a pair of positive integers separated by a slash: n/d. Numbers can be combined in expressions in the usual way with the operators +, -, *, and % (for divide - the / isn't used to indicate division of two rationals since it is used to enter a single rational value). Spaces may separate parts of expressions, and subexpressions can be surrounded by parentheses. One limitation is that the calculator only implements binary operators; in particular it doesn't support unary minus. To compute -r, you can evaluate 0-r. All expressions must be entered on a single line, and the calculator evaluates the expression on each input line and prints the result. The end of input is indicated by typing the usual end-of-file character (ctrl-D in Linux shell windows). The calculator makes no effort to detect or report errors such as illegal input, additional characters on the input line following a complete expression, or rationals with a denominator of 0. If it is unable to make sense out of something, it usually generates the result 0/0 (or 0/1) and goes on to process the next input line. Example input, showing the results of bad parsing on the last line:
$ 3/4-5/13 19/52 $ 4/0 1/0 $ gh 0/1 $ 7*(0-1)/3 -7/1
Remember that your job in this assignment is only to implement type
Rational
. The calculator program is intended as a way of
testing and demonstrating that your Rational
type works
properly, but you are not responsible for any of its quirks or for
fixing any odd behavior that you may discover.
The Makefile contains comments prompting you to fill in some portions.
You will create a phony target to clean the directory, and also fill in
the object file targest. Remember that you can use the g++ -MM
flag to help you here. Do this part first so you can use your Makefile
during the rest of the assignment.
One step budding fraction experts learn is to always reduce their fractions. You should make sure that your answers are always reported in their reduced format. A tip is to ensure that your parameterized constructor results in a fraction that has been entirely reduced. When this is done intermediate arithmetic calculations do not need to be reduced becuase the final fraction is reduced upon creation.
You can complete this assignment entirely on the stack; no dynamic memory needed.
You should turn in only the files Rational.cpp
containing your
implementation of type Rational
, and your modified
Makefile
. Be sure to include your name
at the top of each file. We will submit via Gradescope, which is linked
from Canvas.
This assignment is worth a total of 30 points. You will recieve 5 points for
a working Makefile. Your Rational.cpp
code will be evaluated
according to how well it meets the spec noted above, as well as the style and
efficiency of implementation.