Fraction Class

The Fraction Class

Python knows int. Python knows float.  It doesn't know frac. You'll teach it!

How? Create a frac class of course. (That's short for "fraction"; and yes, I want you not to capitalize.)

What should that class contain? The Tests below are your best guide. Study them closely. But do let me give you a bit of direction:

A final note about the project structure. It will consists of two files, one named "frac.py" and the other (probably) "main.py". Put the frac class in "frac.py"; the first line of code in "main.py" should be import frac.

Fraction Tests

import frac


print('A Few Fractions')

f1 = frac.frac(12, 15) # Reduce to 4/5

f2 = frac.frac(27, 8) # Irreducible

f3 = frac.frac(5, -2) # Neg fraction is always neg numer over pos denom

f4 = frac.frac(-5, -2) # Represent as 5/2

f5 = frac.frac(42) # Represent as 42/1

f6 = frac.frac(0) # Represent as 0/1

print(f1, f2, f3, f4, f5, f6)

print(type(f1), type(f5)) # Should be type frac.

print()


print("Negation and Absolute Value")

print(-f1, --f1)

print(abs(f1), abs(f3))

print()


print('Two-Frac Operations')

f0 = frac.frac(1)

f1 = frac.frac(1, 2)

f2 = frac.frac(-2, 3)

print(f1, '+', f2, '=', f1 + f2)

print(f1, '-', f2, '=', f1 - f2)

print(f1, '*', f2, '=', f1 * f2)

print(f1, '/', f2, '=', f1 / f2)

print(1, '//', f1, '=', 1 // f1)

print(f2, '%', f1, '=', f2 % f1)

print(f1, '** 3 =', f1 ** 3)

print(f1, '** -3 = ', f1 ** -3)

f2 = -f2

print()


print('Chained Operations')

f3 = frac.frac(5, 4)

print(f1, '+', f2, '*', f3, '=', f1 + f2 * f3)

print(f3, '/', f1, '-', f3, '=', f3 / f1 - f3)

print()


print('Operations with Ints and Floats')

# handle a non-frac on the left and on the right

# if an operand is a float, the output is a float

print('3 + ', f2, '=', 3 + f2)

print('3.0 + ', f2, '=', 3.0 + f2)

print(f2, '+ 3 =', f2 + 3)

print(f2, '+ 3.0 =', f2 + 3.0)

print('3 - ', f2, '=', 3 - f2)

print('3.0 - ', f2, '=', 3.0 - f2)

print(f2, '- 3 =', f2 - 3)

print(f2, '- 3.0 =', f2 - 3.0)

print('3 *', f2, '=', 3 * f2)

print('3.0 *', f2, '=', 3.0 * f2)

print(f2, '* 3 =', f2 * 3)

print(f2, '* 3.0 =', f2 * 3.0)

print('3 /', f2, '=', 3 / f2)

print('3.0 /', f2, '=', 3.0 / f2)

print(f2, '/ 3 =', f2 / 3)

print(f2, '/ 3.0 =', f2 / 3.0)

print('3 //', f1, '=', 3 // f1)

print('3 %', f3, '=', 3 % f3)

print

print()


print('Comparison')

f1 = frac.frac(2, 3)

f2 = frac.frac(3, 4)

print(f1 == f1, f1 != f1, f1 != f2)

print(f1 == 1, 1 == f1, f1 != 1, 1 != f1, f2 == 0.75, 0.75 == f2, f2 != 0.75, 0.75 != f2)

print(f1 < f2, f2 < f1, f1 < 1, f1 < 1.0, f1 <= f1, f2 <= f1, f2 <= 0.75, f2 <= 0.7)

print(0.7 < f1, 0.7 <= f2, 0 < f1, 1 <= f2)

print()


print("Type Conversion")

f1 = frac.frac(2, 3)

f2 = frac.frac(15, 4)

print(float(f1), float(f2))

print(int(f1), int(f2))

print()


print("Nasty fracs")

f1 = frac.frac(127, 2985)

f2 = frac.frac(3981, 371)

print(f1 ** 2 + f2)

f3 = frac.frac(1, 2)

f4 = frac.frac(2, 3)

f5 = frac.frac(3, 4)

print((f3 ** 2 + f4 ** 3) / (f5 - 5))

f6 = frac.frac(510510, 44100)

f7 = frac.frac(6636630, 573302)

print(f6 == f7, f6 < f7, f6 > f7, f6 - f7, float(f6 - f7))

Output:

A Few Fractions

4/5 27/8 -5/2 5/2 42 0

<class 'frac.frac'> <class 'frac.frac'>


Negation and Absolute Value

-4/5 4/5

4/5 5/2


Two-Frac Operations

1/2 + -2/3 = -1/6

1/2 - -2/3 = 7/6

1/2 * -2/3 = -1/3

1/2 / -2/3 = -3/4

1 // 1/2 = 2

-2/3 % 1/2 = 1/3

1/2 ** 3 = 1/8

1/2 ** -3 =  8


Chained Operations

1/2 + 2/3 * 5/4 = 4/3

5/4 / 1/2 - 5/4 = 5/4


Operations with Ints and Floats

3 +  2/3 = 11/3

3.0 +  2/3 = 3.6666666666666665

2/3 + 3 = 11/3

2/3 + 3.0 = 3.6666666666666665

3 -  2/3 = 7/3

3.0 -  2/3 = 2.3333333333333335

2/3 - 3 = -7/3

2/3 - 3.0 = -2.3333333333333335

3 * 2/3 = 2

3.0 * 2/3 = 2.0

2/3 * 3 = 2

2/3 * 3.0 = 2.0

3 / 2/3 = 9/2

3.0 / 2/3 = 4.5

2/3 / 3 = 2/9

2/3 / 3.0 = 0.2222222222222222

3 // 1/2 = 6

3 % 5/4 = 1/2


Comparison

True False True

False False True True True True False False

True False True True True False True False

False True True False


Type Conversion

0.6666666666666666 3.75

0 3


Nasty fracs

35477589584/3305693475

-59/459

False False True 2431/60196710 4.038426684780613e-05