17 de mayo de 2016

32. Programa completo clase "punto"

# *-* coding:utf-8 *-*

# ======================================================
# FUNCIONES
# ======================================================
# Validaciones
def es_numero(num):
    # indica si es o no un valor numérico
    return isinstance (num, (int, float, complex, long))

# ======================================================
# CLASES
# ======================================================
# clase puntos
class punto(object):
    """ Clase que permite trabajar con puntos en el plano,
    en coordenadas cartesianas, x e y"""
   
    def __init__(self, x0=0.0, y0=0.0):
        """ pre: los puntos deben definirse con sus coordenadas x
        e y - tipo float - y pueden establecerse en la llamada inicial.
        La notación superior x0=0.0 e y0=0.0 indica los valores iniciales
        si no se define en la llamada """
        if es_numero(x0) and es_numero(y0):
            self.x = x0
            self.y = y0
        else:
            raise TypeError("x e y deben ser números")
   
    def imprimir(self):
        print self       
       
    def __str__(self):
        """ Muestra el punto como un par ordenado. """
        return "[" + str(self.x) + ", " + str(self.y) + "]"

    def __sub__(self, otro):
        """Devuelve un punto que es la resta de otros dos"""
        dx = self.x-otro.x
        dy = self.y-otro.y
        return punto(dx,dy)
       
    def __add__(self,otro):
        """Suma las coordenadas de dos puntos"""
        return self - otro * (-1)
       
    def __mul__(self, factor):
        """ Multiplicar un número o factor por un vector o punto """
        dx = factor * self.x
        dy = factor * self.y
        return punto (dx,dy)   
       
    def __eq__(self,otro):
        """ Determina si dos puntos son iguales """
        return (self.x == otro.x and self.y == otro.y)
       
    def __ne__(self,otro):
        """ Si dos puntos son distintos """
        return not self == otro
       
    def ordenar_por_y(self, otro):
        """ Ordenamos por coordenada y """
        diferencia = self.y - otro.y
        if diferencia>1:
            return 1
        elif diferencia<1:
            return -1
        else:
            return 0
       
    def norma(self):
        """Devuelve la norma de un vector"""
        return (self.x ** 2 + self.y ** 2) ** (0.5)
       
    def distancia(self, otro):
        """Devuelve la distancia entre dos puntos """
        vectorResta = self - otro
        return vectorResta.norma()
   
       

# ======================================================
# Programa principal
# ======================================================
# Punto A, # Defino valores al principio
A = punto(6,7)

# Punto B. Sin definir valores al principio.
B = punto(4,3)

# Imprime los puntos
print ("A = %s") % (A)
print ("B = %s") % (B)

#Cinco veces A
print ("5 veces el punto A %s es %s") % (A, A * 5)
print ("La norma de A es %.2f") % (A.norma())
print ("La norma de B es %.2f") % (B.norma())

C = punto(2,4)
D = punto(100,0.5)

print "¿Son iguales (2,4) y A - B?" , C == A - B, A - B
print "¿Son iguales (2,4) y A + B?" , C == A + B, A + B

lista = [A, B, C,D ]
lista.sort(cmp=punto.ordenar_por_y)

for i in lista:
    print i

No hay comentarios:

Publicar un comentario