1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
# -*- coding: utf-8 -*-
"""
Contain the logic of fractions and comparations of fractions.
"""
import random
DENOMINATOR_MIN = 4
DENOMINATOR_MAX = 10
class Fraction(object):
def __init__(self):
self.numerator = None
self.denominator = None
def __eq__(self,other_fraction):
if (self.numerator * other_fraction.denominator == self.denominator * other_fraction.numerator) and type(other_fraction) is Fraction:
return True
else:
return False
def __ne__(self,other_fraction):
if (self.numerator * other_fraction.denominator != self.denominator * other_fraction.numerator):
return True
else:
return False
def __add__(self,other_fraction):
if not (type(other_fraction) is Fraction):
raise Exception("Fraction Objects only allow addition with other Fraction objects")
else:
return calculate(self,other_fraction,"+")
class FractionLogic(object):
def __init__(self):
self.fraction = Fraction()
def generate(self):
"""Generate new fraction"""
if DENOMINATOR_MIN < 1:
raise Exception("DENOMINATOR_MIN need be greather than 0")
self.fraction.denominator = random.randrange(DENOMINATOR_MIN, DENOMINATOR_MAX)
self.fraction.numerator = random.randrange(0, self.fraction.denominator+1)
def get_current(self):
"""Return the current fraction, raise an exception if generate_fraction
hasn't called before"""
if self.fraction.denominator is None:
raise Exception("generate_fraction must be called before get_current_fraction")
return (self.fraction.numerator, self.fraction.denominator)
def get_current_cake(self):
"""Return the current fraction, raise an exception if generate_fraction
hasn't called before"""
if self.fraction.denominator is None:
raise Exception("generate_fraction must be called before get_current_fraction")
return (self.fraction)
def is_equal(self, fraction):
"""DEPRECATED: Check if fraction is equal that the internal"""
if not(type(fraction) is Fraction and self.fraction.denominator is not None):
raise Exception("fraction must be a tuple of length 2")
if self.fraction.denominator is None:
raise Exception("generate_fraction must be called before is_equal")
return fraction.numerator * self.fraction.denominator == fraction.denominator * self.fraction.numerator
def __repr__(self):
if self.fraction.denominator is None:
return "<FractionLogic(Undefined)>"
return "<FractionLogic(%i,%i)>"%(self.fraction.numerator,self.fraction.denominator)
def calculate(fraction_1,fraction_2,operator):
"""Calls appropiate method depending on the operator received as an argument"""
"""Requires 2 fraction objects and a one character string with the operator (+,-,*,/)"""
result = ( )
if operator == "+" :
result = add(fraction_1,fraction_2)
elif operator == "-" :
result = substract(fraction_1,fraction_2)
elif operator == "*" :
result = multiply(fraction_1,fraction_2)
elif operator == "/" :
result = divide(fraction_1,fraction_2)
return result
def add(fraction_1,fraction_2):
result = Fraction()
if fraction_1.denominator == fraction_2.denominator :
result.numerator = fraction_1.numerator + fraction_2.numerator
result.denominator = fraction_1.denominator
return result
else:
mcm = fraction_1.denominator * fraction_2.denominator
result.denominator = mcm
alt_fraction_1 = fraction_1.numerator * fraction_2.denominator
alt_fraction_2 = fraction_2.numerator * fraction_1.denominator
result.numerator = alt_fraction_1 + alt_fraction_2
return result
def substract(fraction_1,fraction_2):
result_fraction = Fraction()
if fraction_1.denominator == fraction_2.denominator :
result.numerator = fraction_1.numerator - fraction_2.numerator
result.denominator = fraction_1.denominator
return result
else:
mcm = fraction_1.denominator * fraction_2.denominator
result.denominator = mcm
alt_fraction_1 = fraction_1.numerator * fraction_2.denominator
alt_fraction_2 = fraction_2.numerator * fraction_1.denominator
result.numerator = alt_fraction_1 - alt_fraction_2
return result
def multiply(fraction_1,fraction_2):
result = Fraction()
result.numerator = fraction_1.numerator * fraction_2.numerator
result.denominator = fraction_1.denominator * fraction_2.denominator
return result
def divide(fraction_1,fraction_2):
inverse_fraction = Fraction()
inverse_fraction.numerator = fraction_2.denominator
inverse_fraction.denominator = fraction_2.numerator
return multiply(fraction_1,fraction_2)
|