Está en la página 1de 12

Estructura

• Agrupación de un n° fijo de valores (componentes)


• Ejemplo: creación y uso de una estructura de nombre par
con dos atributos (valores) de nombres x e y:

>>> import estructura


>>> estructura.crear("par","x y")
>>> par
struct par
>>> p=par(1,2)
>>> p
par(x=1, y=2)
>>> p.x
1
>>> p.y
2
Una estructura para fracciones
import estructura
#fraccion: numerador (int), denominador (int)
estructura.crear("fraccion","numerador denominador")

• Conviene guardar en un archivo (módulo) junto


con las funciones que operan fracciones
• Cada función según el siguiente patrón:
– Contrato: tipos parámetros->tipo resultado
– Objetivo (propósito) de la función
– Ejemplo(s)
– Cuerpo de la función
– Pruebas (test)
Suma de fracciones
#suma: fraccion fraccion -> fraccion
#suma de fracciones x e y
#ej: suma(fraccion(1,2),fraccion(3,4))->fraccion(10,8)

def suma(x,y):
assert esFraccion(x)
assert esFraccion(y)
num = x.numerador * y.denominador + \
x.denominador * y.numerador
den = x.denominador * y.denominador
return fraccion(num,den)

assert suma(fraccion(1,2),fraccion(3,4))==fraccion(10,8)
Comprobar que fracción está correcta
#esFraccion: fraccion->bool
#True si es una fraccion valida
#ej: esFraccion(fraccion(1,2))->True
#ej: esFraccion(fraccion(1,0))->False
def esFraccion(x):
return type(x)==fraccion \
and type(x.numerador)==int \
and type(x.denominador)==int \
and x.denominador!=0
assert esFraccion(fraccion(1,2))
assert not esFraccion(fraccion(1,0))
>>> pruebaSuma()
suma de fracciones a/b y c/d
a?1
b?2
c?3
d?4
suma=10/8
def pruebaSuma():
print "suma de fracciones a/b y c/d"
a=input("a?")
b=input("b?")
f1=fraccion(a,b)
f2=fraccion(input("c?"),input("d?"))
f3=suma(f1,f2)
print "suma=" + \
str(f3.numerador) + "/" + \
str(f3.denominador)
Resta de fracciones
#resta: fraccion fraccion -> fraccion
#resta de fracciones x e y
#ej: resta(fraccion(1,2),fraccion(3,4))->fraccion(-2,8)

def resta(x,y):
assert esFraccion(x)
assert esFraccion(y)
num=x.numerador*y.denominador - \
x.denominador*y.numerador
den=x.denominador*y.denominador
return fraccion(num,den)

assert resta(fraccion(1,2),fraccion(3,4))==fraccion(-2,8)
Producto de fracciones
#producto: fraccion fraccion -> fraccion
#producto de fracciones x e y
#ej: producto(fraccion(1,2),fraccion(3,4))
# ->fraccion(3,8)

def producto(x,y):
assert esFraccion(x)
assert esFraccion(y)
num=x.numerador*y.numerador
den=x.denominador*y.denominador
return fraccion(num,den)

assert producto(fraccion(1,2),fraccion(3,4)) \
== fraccion(3,8)
División de fracciones
#division: fraccion fraccion -> fraccion
#division fraccion x por fraccion y
#ej: division(fraccion(1,2),fraccion(3,4))
# ->fraccion(4,6)
def division(x,y):
assert esFraccion(x)
assert esFraccion(y)
num=x.numerador*y.denominador
den=x.denominador*y.numerador
f=fraccion(num,den)
assert esFraccion(f)
return f
assert division(fraccion(1,2),fraccion(3,4)) \

==fraccion(4,6)
Simplificar fracción
#simplificar: fraccion -> fraccion
#simplifica una fracción
#ej: simplificar(fraccion(2,4))->fraccion(1,2)

def simplificar(x):
assert esFraccion(x)

m=mcd(x.numerador,x.denominador)
return fraccion(x.numerador/m, x.denominador/m)

assert simplificar(fraccion(2,4))==fraccion(1,2)

>>> simplificar(fraccion(18,24))
fraccion(numerador=3, denominador=4)
Convertir fracción a string
#aString: fraccion -> str
#convierte fraccion a string
#ej: aString(fraccion(1,2))->"1/2“

def aString(x):
assert esFraccion(x)

return str(x.numerador)+"/"+str(x.denominador)

assert aString(fraccion(1,2)) == "1/2"

>>> aString(simplificar(fraccion(10,8)))
'5/4'
Prueba de operaciones entre fracciones
#prueba: None -> None
#lee 2 fracciones y escribe resultado
#simplificado de 4 operaciones
#ej: 1/2, 3/4 -> 5/4, -1/4, 3/8, 2/3
def prueba():
print "operaciones con fracciones a/b y c/d"
f1=fraccion(input("a?"),input("b?"))
f2=fraccion(input("c?"),input("d?"))
mostrar(“suma=",suma(f1,f2))
mostrar("resta=",resta(f1,f2))
mostrar("producto=",producto(f1,f2))
mostrar("division=",division(f1,f2))
def mostrar(x,f):
print x+aString(simplificar(f))
Ejercicio clase 8
Usar el módulo fraccion en un función que lea una cantidad
indeterminada de fracciones (que terminan con una fraccion de valor 0)
y entregue su promedio.
Diálogo:
numerador?n°
denominador?n°
cuenta=1 suma=n°/n°

numerador?n°
denominador?n°
cuenta=n° suma=n°/n°
numerador?0
n°/n° (promedio, resultado de la función)

También podría gustarte