Python: listar números pares y validar entradas de usuario correctamente
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en
español con un tamaño de 5,45 KB
Números pares (bucle hasta -1, solo enteros positivos, listar pares al final)
Programa en Python que lee enteros positivos desde teclado hasta que el usuario ingrese -1. Se muestran mensajes indicando si cada número es par o impar y, al finalizar, se lista el conjunto de números pares ingresados en orden de entrada.
Código
def es_par(n: int) -> bool:
return n % 2 == 0
def leer_enteros_pares():
pares = []
while True:
try:
n = int(input("Ingresá un entero positivo (o -1 para finalizar): "))
except ValueError:
print("Entrada inválida. Debe ser un número entero.")
continue
if n == -1:
break
if n < 0:
print("Solo se aceptan enteros positivos (o -1 para salir).")
continue
if es_par(n):
print(f"{n} es par.")
pares.append(n)
else:
print(f"{n} no es par.")
# Listado final con el formato pedido
for i, valor in enumerate(pares, start=1):
print(f"Ingreso de par número {i}: {valor}")
# --- ejecutar ---
if __name__ == "__main__":
leer_enteros_pares()Validando datos (función genérica con mensaje, mínimo y máximo; y un main de prueba)
Función que lee un valor numérico por teclado y valida que esté dentro de un rango [mínimo, máximo]. Se devuelve el valor validado como float.
Código
def leer_validado(mensaje: str, minimo: float, maximo: float) -> float:
"""Lee un número por teclado y valida que esté en el rango [minimo, maximo]."""
while True:
try:
valor = float(input(mensaje))
except ValueError:
print("Entrada inválida. Ingresá un número (ej: 12.5).")
continue
if minimo <= valor <= maximo:
return valor
else:
print(f"Fuera de rango. Debe estar entre {minimo} y {maximo}.")
# --- ejemplo de uso ---
if __name__ == "__main__":
peso = leer_validado("Ingresá el peso de la caja en kg: ", 0.1, 50.0)
print(f"Peso aceptado: {peso} kg")A) Cinco errores en el código provisto y justificación (conciso)
Falta inicializar la lista
codigos: se usacodigos.append(codigo)sin haber declaradocodigos = []. → ProvocaNameErroroUnboundLocalError.Condición de rango invertida: aparece algo como
if es_codigo_valido(codigo) == True: print("Código fuera de rango"). Debería comprobar si NO es válido. → La lógica está al revés y se informa incorrectamente.No incrementa
errores_repetidoscuando el código ya existe. → No se contabiliza esa casuística y las estadísticas quedan erróneas.No se vuelve a pedir el código en los casos de error (fuera de rango o repetido); solo se pide dentro del
else. → Puede quedar bloqueado o usar el mismocodigoindefinidamente.nombres.append()sin argumento: debería sernombres.append(nombre_apellido). → ProvocaTypeErroro inserciones vacías.
Funciones de validación y código corregido (fragmentos)
def es_codigo_valido(codigo: int) -> bool:
return 1000 <= codigo <= 9999
def ya_existe(codigo: int, lista: list[int]) -> bool:
return codigo in lista
def main():
codigos = []
nombres = []
errores_rango = 0
errores_repetidos = 0
# Ingreso de códigos
while True:
try:
codigo = int(input("Ingresá un código de socio (1000 a 9999) o -1 para finalizar: "))
except ValueError:
print("Entrada inválida. Debe ser un número entero.")
continue
if codigo == -1:
break
if not es_codigo_valido(codigo):
print("Código fuera de rango.")
errores_rango += 1
continue
if ya_existe(codigo, codigos):
print("Código repetido.")
errores_repetidos += 1
continue
# si llega acá, es válido y no repetido
codigos.append(codigo)
# Listado de códigos ingresados en orden de ingreso
print("Lista de códigos ingresados:")
for c in codigos:
print(c, end=" ")
print()
print("Cantidad de errores por código fuera de rango:", errores_rango)
print("Cantidad de errores por código repetido:", errores_repetidos)
# Carga de nombres y apellidos
for c in codigos:
nombre_apellido = input(f"Socio {c} - Ingresá el Nombre y Apellido: ")
nombres.append(nombre_apellido)
# Listado final
print("Listado completo de socios:")
for c, nom in zip(codigos, nombres):
print(f"Socio: {c}, Nombre y Apellido: {nom}")
# --- ejecutar ---
if __name__ == "__main__":
main()Notas finales
- Mensajes de entrada: mantenga consistencia en el estilo y la ortografía de los mensajes al usuario.
- Validaciones: priorice comprobar errores y usar
continuecuando corresponda para volver a solicitar datos. - Listas y conteos: inicialice estructuras y contadores antes de usarlos para evitar excepciones y estadísticas erróneas.