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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
|
# -*- coding: utf-8 -*-
"""
Contains the logic of fractions and comparations of fractions.
"""
import random
DENOMINATOR_MIN = 4
DENOMINATOR_MAX = 10
class Fraction(object):
def __init__(self,numerator=None,denominator=None):
self.numerator = numerator
self.denominator = denominator
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)
#<--Math methods for the Fraction object begin here-->
def calculate(fraction_1,fraction_2,operator,reduced_output=False):
"""Calls appropiate method depending on the operator received as an argument"""
"""Requires 2 fraction objects and a one character string with the operator (+,-,*,/)"""
result = Fraction()
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)
if reduced_output == False:
return result
else:
return reduce(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 = lcm(fraction_1.denominator,fraction_2.denominator)
result.denominator = mcm
alt_1 = fraction_1.numerator * (result.denominator / fraction_1.denominator)
alt_2 = fraction_2.numerator * (result.denominator / fraction_2.denominator)
result.numerator = alt_1 + alt_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 = lcm(fraction_1.denominator,fraction_2.denominator)
result.denominator = mcm
alt_1 = fraction_1.numerator * (result.denominator / fraction_1.denominator)
alt_2 = fraction_2.numerator * (result.denominator / fraction_2.denominator)
result.numerator = alt_1 - alt_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)
def reduce(fraction):
same_fraction = False
while not same_fraction:
same_fraction = True
for i in range(2,10):
if (fraction.numerator % i == 0 and fraction.denominator % i == 0):
fraction.numerator = fraction.numerator / i
fraction.denominator = fraction.denominator / i
same_fraction = False
i = 2
return fraction
# Function to calculate the GCD
def gcd(num1, num2):
if num1 > num2:
for i in range(1,num2+1):
if num2 % i == 0:
if num1 % i == 0:
result = i
return result
elif num2 > num1:
for i in range(1,num1+1):
if num1 % i == 0:
if num2 % i == 0:
result = i
return result
else:
result = num1*num2/num1
return result
# Function to calculate the LCM
def lcm(num1, num2):
result = num1*num2/gcd(num1,num2)
return result
|