Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/fracciones.activity/fractionlogic.py
blob: 57a6d004c7f141cc496ceb20e3c52055074c903b (plain)
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)