Mi primer codigo en Python (calculo con circunferencias)

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

Mi primer codigo en Python (calculo con circunferencias)

Notapor Nato » Mar Abr 22, 2008 8:29 pm

No se si es que no envié el otro mensaje, o que paso, pero bueno, lo escribo de nuevo que de todas formas tenia que corregir alguna cosas.

Aquí les presento mi primer código en Python, es un "programa" que halla el área y el perímetro de una circunferencia, es bastante sencillo, pero quería probar hacer un código completo por mi y es lo primero que se me ocurrió, quiero que critiquen todo lo que puedan para intentar mejorar dichos aspectos del código y como programador si se puede.

Código: Seleccionar todo
# -*- coding: utf-8 -*-

###########################################
#Proyecto: Geometría.
#Autor: Nato.
#Version: 0.1.
#####################

#importar el valor de pi desde el modulo math
from math import pi

#crear la variable para activar o desactivar el bucle principal
nuevo_valor=1

#presentación.
print "########################"
print "     CIRCUNFERENCIA"
print "########################\n"

#bucle principal
while (nuevo_valor == 1):

    seleccion = input("Que quieres hallar, área(1) o perímetro (2)? ")
    print ""
   
    #si el valor de "selección" retorna 1 se inicia el bucle del área
    while (seleccion == 1):

        print "Hallar área"

        r_circun = input("Cual es el radio de la circunferencia?: ")

        #calcula área de una circunferencia.
        def area_circunferencia(radio):
            return pi*radio**2
       
        if r_circun < (0.000000000001):
            print "Error, debes introducir un numero superior a 0"
        else:
            print "Área de la circunferencia: "+str(area_circunferencia(r_circun))+"\n"

        break
    #si el valor de "selección" retorna 2 se inicia el bucle del perímetro
    while (seleccion == 2):
       
        print "Hallar perímetro"

        r_circun = input("Cual es el radio de la circunferencia?: ")

        #calcula perímetro de una circunferencia
        def perimetro_circunferencia(radio):
            return 2*pi*radio

        if r_circun < (0.000000000001):
            print "Error, debes introducir un numero superior a 0"
        else:
            print "Perímetro de la circunferencia: "+str(perimetro_circunferencia(r_circun))+"\n"

        break
Imagen
Avatar de Usuario
Nato
 
Mensajes: 26
Registrado: Sab Jul 21, 2007 11:11 am
Ubicación: Las Palmas, España

Notapor Dokan » Mar Abr 22, 2008 11:16 pm

¿Cómo aprovecharías eso en otro programa? No lo pregunto por nada, sólo para que te calientes la cabeza un poco más.
Avatar de Usuario
Dokan
 
Mensajes: 143
Registrado: Lun Dic 03, 2007 10:40 pm

Re: Mi primer codigo en Python (calculo con circunferencias)

Notapor hugoruscitti » Lun Abr 28, 2008 1:42 am

Nato escribió:[...] quiero que critiquen todo lo que puedan para intentar mejorar dichos aspectos del código y como programador si se puede.
Para mí está muy bién, sobretodo si es tu primer
programa en python.

Aún así, para mejorarlo aún más sería bueno crear funciones para
hacer mas sencilla su lectura.

Muchas técnicas y recomendaciones sobre programación suelen
ir en dirección a hacer mas sencilla la lectura y seguimiento de los
programas. En tu código resulta un poco difícil saber "donde" se
está ejecutando el código. Debido a los bucles while, que cuesta
seguirlos cuando se anidan.

Considera la siguiente modificación de tu programa:

Código: Seleccionar todo
# -*- coding: utf-8 -*-
from math import pi

def area_circunferencia(radio):
    return (pi*radio) ** 2

def perimetro_circunferencia(radio):
    return 2*pi*radio

def calcultar_area():
    "Permite calcular el area de una circunferencia en base a su radio."

    radio = input("Cual es el radio de la circunferencia?: ")

    if radio > 0:
        print "Área de la circunferencia:", area_circunferencia(radio)
    else:
        print "Error, debes introducir un número superior a 0."

def calcular_perimetro():
    "Permite calcular el perímetro de una circunferencia."

    radio = input("Cual es el radio de la circunferencia?: ")

    if radio > 0:
        print "Perímetro de la circunferencia:", perimetro_circunferencia(radio)
    else:
        print "Error, debes introducir un número superior a 0."

# Programa principal

quit = False

while not quit:
    print ""
    seleccion = raw_input("¿Que quieres hacer, calcular área(1), perímetro(2) o salir(3)? ")

    if seleccion == '1':
        calcultar_area()
    elif seleccion == '2':
        calcular_perimetro()
    else:
        quit = True


viendo la última parte del código se puede ver como agregar
nueva funcionalidad, por ejemplo yo añadí la funcionalidad de
"salir", que si bien es sencilla no fue difícil añadirla.

En fin, algunas cosas las modifiqué sin reparar en detalles, como
usar "raw_input" (que evita que el programa falle si pulsan "a" por
ejemplo). Cualquier cosa preguntanos.

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor Nato » Lun Abr 28, 2008 7:41 pm

Voy a estudiar tu código Hugo a ver si aprendo algo, se ve muy limpio, eres un crack, estaba buscando la forma de implementar lo que dices del raw_input, cual es la diferencia entre este e input a secas?
Imagen
Avatar de Usuario
Nato
 
Mensajes: 26
Registrado: Sab Jul 21, 2007 11:11 am
Ubicación: Las Palmas, España

Notapor hugoruscitti » Mar Abr 29, 2008 12:10 am

Nato escribió:[...] cual es la diferencia entre este e input a secas?


La diferencia está en el tipo de objeto que devuelven, "input" intenta
evaluar lo que le escribes: si escribes un número intenta devolver
un objeto de tipo entero, si ingresas un nombre intenta retornar
la variable que tiene ese nombre, etc. Mientras que "raw_input"
siempre devuelve una cadena con todo lo que escribas.

En python puedes conocer el tipo de dato de los objetos usando
la función "type".

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor Nato » Dom Jul 27, 2008 4:43 pm

después de mucho tiempo quise ampliar el código, pero tengo un problema, no se porque pero al elegir cualquier opción sale del programa, es como si las tres diesen la salida, aquí dejo el código.

Código: Seleccionar todo
#!/usr/bin/env python
# -*- coding: utf-8 -*-

try:
    import sys
    from math import pi
except ImportError, error:
    print "No se pudo cargar el modulo: %s" % (error)
    sys.exit(2)

#===============================================================================

def area_circunferencia(radio):
    return (pi*radio)**2

def perimetro_circunferencia(radio):
    return 2*pi*radio

def area_cuadrado(lado):
    return lado**2

def perimetro_cuadrado(lado):
    return lado+lado+lado+lado

def calcultar_area_circun():
    radio = input("Cual es el radio de la circunferencia?: ")

    if radio > 0:
        print "Area de la circunferencia: ", area_circunferencia(radio)
    else:
        print "Error, debes introducir un numero superior a 0."

def calcular_perimetro_circun():
    radio = input("Cual es el radio de la circunferencia?: ")

    if radio > 0:
        print "Perimetro de la circunferencia: ", perimetro_circunferencia(radio)
    else:
        print "Error, debes introducir un numero superior a 0."

def calcultar_area_cua():
    radio = input("Cual es el lado del cuadrado?: ")

    if radio > 0:
        print "Area del cuadrado: ", area_cuadrado(lado)
    else:
        print "Error, debes introducir un numero superior a 0."

def calcular_perimetro_cua():
    radio = input("Cual es el lado del cuadrado?: ")

    if radio > 0:
        print "Perimetro del cuadrado: ", perimetro_cuadrado(lado)
    else:
        print "Error, debes introducir un numero superior a 0."

#===============================================================================

quit = False

while not quit:
    print "GEOMETRÍA\n"
    seleccion = input("Que quieres hacer, calcular area(1), perimetro(2) o salir(3)? ")

    if seleccion == "1":
        seleccion1 = input("Que area quieres calcular, circunferencia(1), cuadrado(2)? ")
        if seleccion1 == "1":
            calcultar_area_circun()
        elif seleccion1 == "2":
            calcular_area_cua()
    if seleccion == "2":
        seleccion2 = input("Que perimetro quieres calcular, circunferencia(1), cuadrado(2)? ")
        if seleccion2 == "1":
            calcultar_perimetro_circun()
        elif seleccion2 == "2":
            calcular_perimetro_cua()
    else:
        quit = True
Imagen
Avatar de Usuario
Nato
 
Mensajes: 26
Registrado: Sab Jul 21, 2007 11:11 am
Ubicación: Las Palmas, España

Notapor hugoruscitti » Lun Jul 28, 2008 12:30 am

Nato escribió:[..]no se porque pero al elegir cualquier opción sale del programa, es como si las tres diesen la salida[...]


Sí, resulta que en el código la función "input" retorna un valor
numérico, por lo tanto la comparación con una cadena siempre
será falsa, aunque el usuario pulse la tecla 1 y luego
Enter. Por ejemplo, sería como comparar:

Código: Seleccionar todo
if 1 == '1':
     pass


Por ello, sería bueno convertir el valor que ingresa el usuario antes
de compararlo, las funciones "int(x)" y "str(x)" sirven para entre
números y cadenas.

También aprovecho este mensaje para comentar que la función
"type(x)" de python te informa sobre el tipo de dato de cualquier
referencia, algo similar ocurre con "help(x)", por ejemplo:

Código: Seleccionar todo
>>> numero = '1'
>>> type(numero)
<type 'str'>
>>> numero_entero = int(numero)
>>> type(numero_entero)
<type 'int'>
>>> 1 == numero_entero
True
>>> 1 == numero
False
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor Nato » Lun Jul 28, 2008 7:37 pm

gracias por la respuestas, no se porque, pero había quitado el "raw_" delante del input y yo dándole vueltas a la cabeza, pensaba que era un error de sintaxis.
Imagen
Avatar de Usuario
Nato
 
Mensajes: 26
Registrado: Sab Jul 21, 2007 11:11 am
Ubicación: Las Palmas, España

Notapor hugoruscitti » Mar Jul 29, 2008 1:46 am

ah, sí. La función "raw_input" es un poco diferente a "input", dado que
"raw_input" siempre devuelve una cadena de texto... recuerda
ejecutar "help(input)" y "help(raw_input)" en caso de dudas para
recibir una descripción detallada de cada función.

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron