# Project 3

## Objective:

The objective of this assignment is to practice writing functions for a pre-defined interface.

## Assignment:

Your assignment is to write a set of functions to work with fractions. Since a fraction consists of two numbers (a numerator and a denominator), you are provided with some functions that work with pairs of numbers. These functions work with a new type called pair which holds a pair of integers. Using this new type, you can declare variables of type pair, pass a pair variable as a parameter to a function, and return a pair value from a function. The functions provided to you are:

int FirstPart (pair p) ;
This function returns the first integer in the pair value p.

int SecondPart (pair p) ;
This function returns the second integer in the pair value p.

pair MakePair (int one, int two) ;
This function makes a pair value whose first part is the value contained in one and second part is the value contained in two.
The functions above are provided in the file pair.o which you can find in the directory:
``` ~chang/pub/cs201
```
You should copy this file as well as the files main3.o and proj3.h to your own directory. The file main3.o is a driver program that calls the functions that you will implement. The file proj3.h contains the predefined interface between main3.o, pair.o and the functions that you implement. You may not change any of these files. Your assignment is to implement the following functions.

int Numerator(pair p) ;
Return the numerator of the fraction stored in the pair p.

int Denominator(pair p) ;
Return the denominator of the fraction stored in the pair p.

pair MakeFraction(int numer, int denom) ;
Make a fraction with numerator numer and denominator denom.

pair ReduceFraction (pair p) ;
Given a fraction stored in p, reduce the fraction to the normal form by dividing the numerator and denominator by their greatest common divisor. For example, 6/8 becomes 3/4. You should use Euclid's GCD algorithm for this function. The function then returns the reduced fraction.

void PrintFraction (pair p) ;
Print out the numerator and denominator of the fraction p. We need this since printf does not print out pairs. The output is sent directly to the screen, so this function does not return any values. The output should be of the form numerator/denominator; for example, 3/4.

pair AddFraction (pair p, pair q) ;
Given two fractions, return the sum of the fractions. The result should be put in normal form, using ReduceFraction.

pair SubtractFraction (pair p, pair q) ;
Given two fractions p and q, return the result of p - q. The result should be put in normal form, using ReduceFraction.

pair MultiplyFraction (pair p, pair q) ;
Given two fractions, return the product of the fractions. The result should be put in normal form, using ReduceFraction.

pair DivideFraction(pair p, pair q) ;
Given two fractions p and q, return the result of p divided by q. The result should be put in normal form, using ReduceFraction.

## Implementation Notes:

Your final product is a set of functions. To compile your functions (saved in the file proj3.c) with the driver program in main3.o and the pair functions pair.o, use the UNIX command
```     % cc201 proj3.c main3.o pair.o
```
The output of the complete program should look like:
```    Testing: 2, 3, 3, 4
Reduce: 2/3 = 2/3
Reduce: 3/4 = 3/4
(2/3) + (3/4) = 17/12
(2/3) - (3/4) = -1/12
(2/3) * (3/4) = 1/2
(2/3) / (3/4) = 8/9

Testing: 3, 4, 1, 8
Reduce: 3/4 = 3/4
Reduce: 1/8 = 1/8
(3/4) + (1/8) = 7/8
(3/4) - (1/8) = 5/8
(3/4) * (1/8) = 3/32
(3/4) / (1/8) = 6/1
.
.
.
```

## Warning:

Take heed of these warnings.
• Read the assignment. A lot of you go to office hours to ask questions can be answered by reading the assignment. This is perfectly fine if you don't understand the assignment, but you will save yourself a lot of time by reading the assignment first.
• You should test your functions before you try to put them together with main3.o. To do this, you will have to write your own driver programs that call the functions.
• You will need to include the header files stdio.h and proj3.h in your file, even though your won't have a main function in this file.

## What to turn in:

When you are done, use the script command (see Project 2 description) to record the output of your program. Then, send the typescript file along with the file containing your functions to chang@gl.umbc.edu. Do not send a.out, main3.o, or any other files. Do not send your files in MIME format, your project will be returned unread.