Python - Repetir todo un bloque

 
Vista:

Repetir todo un bloque

Publicado por Tarken (6 intervenciones) el 24/10/2007 21:17:18
He empezado con un programa simple de poligonos y tengo una pregunta
Para que el usuario elija poligono, introduzco:
#Elección del Usuario
poligono = input('> ')

Después de algunos 'if' y 'elif' para calcular areas, llego al 'else' y aqui viene mi duda.
Yo escribo por si el input no es el esperado:
else:
print 'Datos erróneos.'
poligono = input('> ') #Pero con esto no me repite todos mis 'if' y 'elif' que habrian funcionado de haber introducido el valor correcto en el primer input de poligono.

¿Alguien me puede ayudar? Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Repetir todo un bloque

Publicado por Cyrus (54 intervenciones) el 25/10/2007 15:05:50
No he entendido muy bien el problema, si pones el código igual lo entendemos mejor, pero aparte de eso, yo creo que lo normal seria:

* Pides los datos del polígono

* Validas que sean correctos, es decir que estén todos los datos bien

* Si no lo son muestras el mensaje de error y los pides otra vez o se acaba o lo que sea

* Si son datos buenos, haces los cálculos con los if, o como sean.

* Muestras el resultado

Tu lo haces al revés, primero calculas el área, y luego miras si los datos son buenos.
Espero que te sirva.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Repetir todo un bloque

Publicado por Tarken (6 intervenciones) el 25/10/2007 18:14:36
Gracias por responder
¿Como valido los datos antes? Mi python es muy basico.
El codigo es el siguiente. Quito algunos poligonos para que sea mas facil de leer:

#Mostrar Selección:
print 'Por favor escoja un polígono por su número.'
print '1 -> Círculo'
print '5 -> Pentagono'
print '6 -> Hexágono'
print '8 -> Octógono'
print 'Etc'
#Elección del Usuario
poligono = input('> ')
#Calcular Área
n = [5, 7, 9]#Se usa en poligonos que necesitan apotema
if poligono > 9:
n.append(poligono)
from math import pi
if poligono == 1:
radio = float(input("Radio: "))
area = pi*radio**2
print "El area es", area
elif poligono == 6:#Para el hexagono no es necesaria apotema
lado = float(input("Lado: "))
perimetro = lado*6
area = (perimetro*(lado**2+(lado/2)**2)**(1/2))/2
print "El area es", area
elif poligono == 8:#Para el octogono no es necesaria apotema
lado = float(input('Lado: '))
perimetro = lado*8
area = perimetro*((lado**2)/2)**(1/2)
print 'El área es', area
elif poligono in n:
lado = float(input('Lado: '))
apotema = float(input('Apotema: '))
area = ((lado*poligono)*apotema)/2
print 'El área es', area
else:
print 'Datos erróneos.'
poligono = input('> ') #Se que esto esta mal. Que hay que hacer?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Repetir todo un bloque

Publicado por Cyrus (54 intervenciones) el 25/10/2007 18:24:03
Bien, varias cosas que he visto:

La ultima linea, entiendo que lo que quieres es volver a mostrar el menú, ¿cierto?, si es asi, efectivamente con eso no sirve, porque pedirá los datos, pero el programa termina.

Para validar la entrada muy sencillo, supon que tenemos 13 polígonos, pues hacemos:
if poligono>0 and poligono<14:
......
else:
____print "Error en los datos"
____pedirDatos()

Esto lo hacemos justo después de pedir el dato, antes de empezar con los IFs, que irian donde van los puntos suspensivos.

¿Que es pedirDatos?, en una función, que contiene todo, es decir desde que pides, valida, elige,etc entonces si hay un error en lo que han introducido, pues el programa volvería a empezar por así decirlo.

En principio con esto esta, mira a ver si te sirve.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Repetir todo un bloque

Publicado por Tarken (6 intervenciones) el 25/10/2007 19:25:22
No me acepta la función(or lo que sea) pedir datos. ¿Seguro que existe? A lo mejor estoy haciendo algo mal. Pero lo he buscado(F1, google) y no parece.
De momento he conseguido que vuelva a pedir el poligono si introduces un numero negativo o cero, pero nada con letras o simbolos:

m = [1]
if poligono > 1:
__m.append(poligono)
while poligono not in m:
__poligono = int(input('> '))

Poniendo todo esto antes de los IF.
Necesito que lo vuelva a preguntar si escribes algo como: k,¿,++z

¿Porque se consideraran las letras mayores que los numeros? Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Repetir todo un bloque

Publicado por Cyrus (54 intervenciones) el 26/10/2007 10:15:08
Solo te lo pide con números menores a 1, porque el if lo dice asi:
if poligono > 1:
Es decir, si polígono es mayor que uno, en python las letras las compara con números, asi que si no quieres que pueda meter letras, le vamos a decir que solo números:
if poligono > 1 and poligono.isdigit():

Con esto ya solo nos vales los números mayores a 1, nada de letras.

En cuanto a lo de pedirDatos() no existe porque es una función que me he inventado, el programa quedaría algo así:

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

def pedirDatos():
____poligono=input(">")
____if poligono >= 1 and str(poligono).isdigit():
________-----el resto de ifs, ect
____else:
________pedirDatos()

pedirDatos()

Le pongo el str porque si metes un numero, da error, ya que la función isdigit solo sirve con cadenas. Y el último pedir datos es para que el programa empiece, ya que no hay función main()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar