CS70, Spring 2004

A Note About the Honor Code

In CS70, you will often be working with code supplied by the professor as part of the assignments. Only code provided by the professor, or written by yourself and your pair-programming partner, may be used to complete assignments. Even if you think a particular bit of code is not central to the essence of the assignment, you may not use code written by anyone other than the professor or yourself. This includes code from the book.

If you have any questions about this policy, ASK FIRST. In the past, students have gotten into serious trouble because they assumed something was OK without asking first.

More information on the honor code can be found on the administrivia page.

Homework Assignment #1

The program for this assignment, and everything else except the README file, is due at 9 PM on Wednesday, January 28th, 2004. The README file is due at midnight on the same day (i.e., the moment Thursday begins). Refer to the homework policies page for general homework guidelines.

This assignment has several purposes:


You have been hired by a small company that develops Web sites. Your first job will be to make modifications to a system developed by the firm's star programmer, who was recently killed in a tragic unicycling accident.

The system that the programmer developed is large and complex, but the programmer did a good job of dividing it up into small pieces. He even wrote special test programs that exercise the fundamental classes that the system uses. You have determined that you will need to modify one of those classes, which performs arithmetic on rational numbers.

Unfortunately, when you look at the code for the class and its test program you are dismayed, for it seems that the star programmer was far more concerned with whether the code worked than whether it was maintainable. In fact, it seems that he religiously followed the unmaintainability rules. After a few minutes, you go to your boss and tell her that it will be quicker to first spend time cleaning up the programming style, and only make the necessary modifications after the program has been made readable. Your boss agrees, and because the original code is so bad, she will even allow you to do a bit of renaming that will have effects elsewhere (see Tricky Stuff).

Your task for homework #1 is to clean up the style of the rational-number class and its associated test program. There are no known bugs in the program, so you can concentrate on simply cleaning it up without changing the output produced by the test program.

The program is composed of three files:

is the test routine that verifies the correct operation of the class,
is the "header file" that describes the interface to the rational-number class, and
is the implementation of the rational-number class.

In addition, there is a so-called Makefile, which makes it easy to compile the program on Turing by simply typing make at the command prompt.

Getting Started

CS70 uses a CVS-based submission system to make it easy for you to work with your partner. To get started, go to wherever you plan to keep your CS70 assignments and type:

cs70checkout hw01
This will create a directory named hw01, containing the four files listed above. (NOTE: You can't use cs70checkout until the professor has created a group for you and your partner. A message will be sent to the class list when all groups have been created.)

When you have done some work, type cs70submit to submit what you've done so far. See the submissions documention for more information. (NOTE: If you decide that some of the file names are bad, and rename the files, you must use:

cs70submit new-name
once after you change the name.

What to Submit

Your final submission should consist of five files:

With one small exception, this can be the same as the file that was provided to you. The exception is that if you decide to change the names of the files that contain the rational-number class (rat.cc and rat.hh), you must make corresponding changes in the Makefile. It is up to you to decide whether to rename these files. If you do so, be sure to modify all places in the Makefile where they are mentioned.

Your Makefile must work correctly, and must produce an executable named assign_01. The graders will be using make to compile your program.

The C++ code for the the test program (commonly called a "test driver"). The name of this program must not be changed, no matter what you do to its internals.
The header file (interface definition) for the rational-number class. This file does not have to be named rat.hh. You are allowed to choose any name you like, so long as:
  1. The file has a .h or .hh suffix, and
  2. You remember to change the Makefile to match.
The code file (implementation) of the rational-number class. This file does not have to be named rat.cc. You are allowed to choose any name you like, so long as:
  1. The file has a .cc suffix (or another extension accepted by g++,
  2. You remember to change the Makefile to match, and
  3. You ensure that make still works with the name and suffix you choose.
  4. You remember to tell cs70submit about the file (you only need to do that once).
A documentation file, as specified in the homework policies page. Note that this file is not due until 3 hours after the other files in the assignment.

Use cs70submit to submit your solution. Remember to submit early and often. If you discover a mistake in your program, you can resubmit it using the same command. You can submit as many times as you like; only the last version will be used.

Since the README file is due later than the rest of the assignment, you must submit it separately (unless you have it done before the deadline). You can do this with the cs70submit command:

    cs70submit README
If you have changed any of your other files, DO NOT use cs70submit without arguments to submit the README file, or it will appear that you missed the deadline even though you were really on time. It's safest to use the command above.


The class defined by rat.hh and rat.cc implements a simple rational-number package. Rational numbers are represented as a pair of integers, the numerator and denominator. For convenience, the class ignores the fact that any real-life computer imposes a maximum value on integers.

The code you have been given is, to the best of our knowledge, correct and bug-free. However, it is written with very bad style. Your sole task is to improve the style, not to fix bugs. If you find any bugs, you should note them in the README file but should not fix them. (If you find no bugs, the README should mention that there are no known bugs.)

The requirement of no bug fixing is, perhaps surprisingly, very realistic. As a general rule, when you are correcting style in the real world, you should not fix bugs at the same time. If you follow this rule, it will be much easier to find out what happened after the fact, especially when you use a source-code control system (a subject you will study later, in CS121).

The revised class and test program must produce output identical to that from the original. You can check that the output is correct using the diff command. Before you start editing the program, do a test run and save the output, as follows (% represents your shell prompt, which will almost certainly be different on Turing):

    % make
    % ./assign_01 > original.out

The above commands will compile the program (make), run it (./assign_01), and save the output into a file named original.out (> original.out). You can use that file later to make sure the output hasn't changed.

How to attack the problem

There are a lot of things wrong with the program in this assignment. Here are some hints about what you might want to play with:

Compiling the program

As mentioned above, you can compile the program by simply typing make at the command prompt. One of the many advantages of using make is that it will run the compiler with switches that check for all sorts of simple errors. Your program must compile without any warning messages when the compiler is invoked with the -Wall -pedantic switches (as happens when you use make).

Running the program

If you are new to Unix, you may be wondering how you can test your program.

To run your program, simply type "./assign_01" (without the quotes). Since this program requires no input, you should immediately see the output on your terminal. If the program misbehaves badly, you can abort it by typing control-C.

You can look at the output of the original version by typing cat original.out. Alternatively, you can use the diff command to compare the output of the original with the output of the new version:

    % ./assign_01 | diff original.out -
If the two versions produce identical results, you will see no output on your screen. For example, if you changed "yup" to "yessss!", you would see something like:
    < yup
    > yessss!

The README file

Every assignment in CS70 must be accompanied by a README file. The file must be named README in all uppercase letters. A detailed specification of the README file can be found on the homework policies page. For this assignment, make sure the README file contains:

Some Useful C++ Hints

For the most part, you should be able to complete this assignment without knowing anything special about C++. However, it will help to know a few things:

Tricky Stuff

With every assignment, there are parts that can surprise you. Some of the "gotchas" in this assignment include:

Other Resources

There is more information on using C++ on Turing available in the departmental quick-reference guide and the C++ quick reference guide.

© 2004, Geoff Kuenning

This page is maintained by Geoff Kuenning.