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)

  1. Falta inicializar la lista codigos: se usa codigos.append(codigo) sin haber declarado codigos = []. → Provoca NameError o UnboundLocalError.

  2. 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.

  3. No incrementa errores_repetidos cuando el código ya existe. → No se contabiliza esa casuística y las estadísticas quedan erróneas.

  4. 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 mismo codigo indefinidamente.

  5. nombres.append() sin argumento: debería ser nombres.append(nombre_apellido). → Provoca TypeError o 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 continue cuando corresponda para volver a solicitar datos.
  • Listas y conteos: inicialice estructuras y contadores antes de usarlos para evitar excepciones y estadísticas erróneas.

Entradas relacionadas: