Sesión 4 - Ejemplos de Python Básico

En esta sección exploraremos varios problemas de programación que pueden resolverse utilizando los conceptos básicos que hemos aprendido: tipos de datos, operadores, estructuras condicionales y bucles. Estos ejemplos están diseñados para reforzar la comprensión de estos conceptos fundamentales.

Problema 1: Suma de dígitos de un número

Enunciado

Escribir un programa que solicite al usuario un número entero positivo y calcule la suma de sus dígitos.

Por ejemplo, si el usuario ingresa el número 123, el programa debe calcular 1 + 2 + 3 = 6.

Metodología

Para resolver este problema, podemos seguir estos pasos:

  1. Solicitar al usuario un número entero positivo.

  2. Inicializar una variable para almacenar la suma de los dígitos.

  3. Mientras el número sea mayor que cero:

    1. Obtener el último dígito del número usando la operación módulo (%).

    2. Añadir este dígito a la suma.

    3. Eliminar el último dígito del número mediante la división entera (//).

  4. Mostrar la suma de los dígitos.

# Solicitar el número al usuario
numero = int(input("Ingrese un número entero positivo: "))

# Validar que sea positivo
if numero < 0:
    print("El número debe ser positivo.")
else:
    # Inicializar la suma de dígitos
    suma_digitos = 0

    # Crear una copia del número original para mostrarlo al final
    numero_original = numero

    # Mientras queden dígitos por procesar
    while numero > 0:
        # Obtener el último dígito
        digito = numero % 10

        # Añadir el dígito a la suma
        suma_digitos += digito

        # Eliminar el último dígito
        numero //= 10

    # Mostrar el resultado
    print(f"La suma de los dígitos de {numero_original} es: {suma_digitos}")

Explicación

Este programa utiliza el operador módulo (%) para obtener el último dígito del número en cada iteración. Por ejemplo, 123 % 10 = 3. Luego, divide el número entre 10 con división entera (//), eliminando así el último dígito: 123 // 10 = 12. Este proceso se repite hasta que no queden dígitos (cuando el número llegue a 0).

Si el usuario ingresa 123:

  • Primera iteración: digito = 123 % 10 = 3, suma_digitos = 0 + 3 = 3, numero = 123 // 10 = 12

  • Segunda iteración: digito = 12 % 10 = 2, suma_digitos = 3 + 2 = 5, numero = 12 // 10 = 1

  • Tercera iteración: digito = 1 % 10 = 1, suma_digitos = 5 + 1 = 6, numero = 1 // 10 = 0

  • El bucle termina porque numero = 0, y la suma final es 6.

Problema 2: Calculadora Simple

Enunciado

Crear una calculadora simple que permita al usuario realizar operaciones básicas (suma, resta, multiplicación y división) con dos números.

Metodología

Para resolver este problema, seguiremos estos pasos:

  1. Mostrar al usuario un menú con las operaciones disponibles.

  2. Solicitar al usuario que elija una operación.

  3. Pedir al usuario que ingrese dos números.

  4. Realizar la operación seleccionada y mostrar el resultado.

  5. Manejar casos especiales como la división por cero.

# Mostrar el menú de opciones
print("Calculadora Simple")
print("1. Suma")
print("2. Resta")
print("3. Multiplicación")
print("4. División")

# Solicitar la opción al usuario
opcion = int(input("Seleccione una operación (1-4): "))

# Solicitar los números
num1 = float(input("Ingrese el primer número: "))
num2 = float(input("Ingrese el segundo número: "))

# Realizar la operación seleccionada
if opcion == 1:
    resultado = num1 + num2
    operacion = "suma"
elif opcion == 2:
    resultado = num1 - num2
    operacion = "resta"
elif opcion == 3:
    resultado = num1 * num2
    operacion = "multiplicación"
elif opcion == 4:
    # Verificar división por cero
    if num2 == 0:
        print("Error: No se puede dividir por cero.")
    else:
        resultado = num1 / num2
        operacion = "división"
else:
    print("Opción no válida. Por favor, seleccione una opción entre 1 y 4.")

# Mostrar el resultado (solo si la operación es válida y no hay división por cero)
if opcion >= 1 and opcion <= 4 and not (opcion == 4 and num2 == 0):
    print(f"El resultado de la {operacion} es: {resultado}")

Explicación

Este programa implementa una calculadora simple que permite realizar las cuatro operaciones aritméticas básicas. Primero muestra un menú con las opciones disponibles y solicita al usuario que elija una. Luego, pide los dos números para realizar la operación.

Dependiendo de la opción seleccionada, el programa realiza la operación correspondiente. En el caso de la división, se verifica primero si el segundo número es cero para evitar el error de división por cero.

Finalmente, si la operación es válida y no hay división por cero, se muestra el resultado al usuario con un mensaje claro.

Problema 3: Generador de tabla de multiplicar

Enunciado

Crear un programa que genere la tabla de multiplicar para un número ingresado por el usuario, desde 1 hasta un valor máximo también ingresado por el usuario. El programa debe mostrar la tabla de manera formateada y presentar la suma total de todos los resultados.

Metodología

Para resolver este problema, seguiremos estos pasos:

  1. Solicitar al usuario que ingrese el número para el cual se generará la tabla.

  2. Solicitar el valor máximo hasta el cual se multiplicará.

  3. Inicializar una variable para almacenar la suma de todos los resultados.

  4. Utilizar un bucle para generar cada línea de la tabla:

    1. Calcular el producto del número base por el multiplicador actual.

    2. Añadir este producto a la suma total.

    3. Mostrar la operación formateada.

  5. Mostrar la suma total de los resultados.

# Solicitar datos al usuario
numero = int(input("Ingrese el número para la tabla de multiplicar: "))
maximo = int(input("Ingrese hasta qué número desea multiplicar: "))

# Validar entrada
if numero <= 0 or maximo <= 0:
    print("Por favor, ingrese números positivos.")
else:
    # Inicializar la suma total
    suma_total = 0

    # Mostrar encabezado de la tabla
    print(f"\nTabla de multiplicar del {numero} hasta {maximo}:")
    print("=" * 30)

    # Generar la tabla usando un bucle for con range
    for i in range(1, maximo + 1):
        resultado = numero * i
        suma_total += resultado

        # Mostrar la operación formateada
        print(f"{numero} x {i} = {resultado}")

    # Mostrar la suma total
    print("=" * 30)
    print(f"Suma total de los resultados: {suma_total}")

Explicación

Este programa utiliza un bucle for con range(1, maximo + 1) para generar números del 1 hasta el máximo ingresado por el usuario. Para cada número, calcula el producto con el número base y lo añade a la suma total.

La línea print(«=» * 30) utiliza la multiplicación de cadenas para crear una línea divisoria de 30 caracteres «=», lo que mejora la presentación visual de la tabla.

Por ejemplo, si el usuario ingresa el número 5 y máximo 3:

  • Primera iteración: 5 x 1 = 5, suma_total = 0 + 5 = 5

  • Segunda iteración: 5 x 2 = 10, suma_total = 5 + 10 = 15

  • Tercera iteración: 5 x 3 = 15, suma_total = 15 + 15 = 30

  • El programa muestra que la suma total es 30.

Problema 4: Adivina el número

Enunciado

Crear un programa que genere un número aleatorio entre 1 y 100, y luego pida al usuario que lo adivine. Después de cada intento, el programa debe indicar si el número a adivinar es mayor o menor que el ingresado. El programa debe contar y mostrar el número de intentos realizados cuando el usuario adivine correctamente.

Metodología

Para resolver este problema, seguiremos estos pasos:

  1. Generar un número aleatorio entre 1 y 100.

  2. Inicializar el contador de intentos.

  3. Utilizar un bucle que se ejecute hasta que el usuario adivine el número:

    1. Solicitar un número al usuario.

    2. Incrementar el contador de intentos.

    3. Comparar el número ingresado con el número a adivinar.

    4. Dar pistas al usuario (mayor o menor).

  4. Cuando el usuario adivine, mostrar un mensaje de felicitación y el número de intentos.

# Importar el módulo random para generar el número aleatorio
import random

# Generar un número aleatorio entre 1 y 100
numero_secreto = random.randint(1, 100)

# Inicializar el contador de intentos y una bandera para el bucle
intentos = 0
adivinado = False

print("¡Bienvenido al juego de Adivina el Número!")
print("He pensado un número entre 1 y 100. ¿Puedes adivinarlo?")

# Bucle principal del juego
while not adivinado:
    # Pedir al usuario que adivine
    intento_texto = input("\nIngresa tu número: ")

    # Convertir el texto a número
    intento = int(intento_texto)

    # Incrementar el contador de intentos
    intentos += 1

    # Verificar si el usuario ha adivinado
    if intento == numero_secreto:
        adivinado = True
        print(f"¡Felicidades! Has adivinado el número {numero_secreto} en {intentos} intentos.")
    elif intento < numero_secreto:
        print("El número es mayor que", intento)
    else:
        print("El número es menor que", intento)

# Evaluar el desempeño
if intentos <= 5:
    print("¡Excelente desempeño! Lo lograste en muy pocos intentos.")
elif intentos <= 10:
    print("Buen trabajo. Has adivinado en un número razonable de intentos.")
else:
    print("Finalmente lo lograste. Sigue practicando para mejorar.")

Explicación

Este programa utiliza el módulo random para generar un número aleatorio con random.randint(1, 100). Luego, utiliza un bucle while que se ejecuta hasta que el usuario adivine el número correcto.

Después de cada intento, el programa proporciona retroalimentación, indicando si el número a adivinar es mayor o menor que el ingresado por el usuario. Esto permite al usuario emplear la técnica de «búsqueda binaria» para encontrar el número en menos intentos.

Finalmente, el programa evalúa el desempeño del usuario según la cantidad de intentos realizados, proporcionando un comentario motivador.

Problema 5: Número Primo

Enunciado

Crear un programa que determine si un número ingresado por el usuario es un número primo. Un número primo es aquel que solo es divisible por 1 y por sí mismo.

Metodología

Para resolver este problema, seguiremos estos pasos:

  1. Solicitar al usuario un número entero positivo.

  2. Validar casos especiales (0, 1 y negativos no son primos).

  3. Verificar si el número es divisible por algún entero entre 2 y la raíz cuadrada del número.

  4. Si encontramos algún divisor, el número no es primo.

  5. Si no encontramos ningún divisor, el número es primo.

# Solicitar el número al usuario
numero = int(input("Ingrese un número entero positivo: "))

# Validar casos especiales
if numero <= 1:
    es_primo = False
    mensaje = "no es un número primo, por definición."
else:
    # Inicialmente asumimos que el número es primo
    es_primo = True

    # Verificar si el número tiene divisores
    # Solo necesitamos verificar hasta la raíz cuadrada del número
    divisor = 2

    while divisor * divisor <= numero:
        # Si encontramos un divisor, el número no es primo
        if numero % divisor == 0:
            es_primo = False
            break

        # Probar con el siguiente divisor
        divisor += 1

    # Determinar el mensaje según el resultado
    if es_primo:
        mensaje = "es un número primo."
    else:
        mensaje = "no es un número primo."

# Mostrar el resultado
print(f"El número {numero} {mensaje}")

Explicación

Este programa determina si un número es primo verificando si tiene algún divisor entre 2 y la raíz cuadrada del número. Si encuentra algún divisor, el número no es primo.

La optimización de verificar solo hasta la raíz cuadrada se basa en el hecho de que si un número tiene un divisor mayor que su raíz cuadrada, también debe tener un divisor menor que su raíz cuadrada (su pareja en la multiplicación).

Por ejemplo, para verificar si 17 es primo:

  • 17 % 2 = 1 (no es divisible por 2)

  • 17 % 3 = 2 (no es divisible por 3)

  • 17 % 4 = 1 (no es divisible por 4)

  • No necesitamos verificar más, ya que 5² = 25 > 17

  • Como no encontramos divisores, 17 es primo.

Problema 6: Serie de Fibonacci

Enunciado

Crear un programa que muestre los primeros n términos de la serie de Fibonacci, donde n es un número ingresado por el usuario. La serie de Fibonacci comienza con 0 y 1, y cada término siguiente es la suma de los dos anteriores: 0, 1, 1, 2, 3, 5, 8, 13, 21, …

Metodología

Para resolver este problema, seguiremos estos pasos:

  1. Solicitar al usuario la cantidad de términos que desea ver.

  2. Validar que el número sea positivo.

  3. Inicializar los dos primeros términos de la serie (0 y 1).

  4. Utilizar un bucle para calcular y mostrar los términos restantes.

  5. En cada iteración, calcular el siguiente término sumando los dos anteriores.

# Solicitar al usuario la cantidad de términos
n = int(input("Ingrese la cantidad de términos de la serie de Fibonacci que desea ver: "))

# Validar la entrada
if n <= 0:
    print("Por favor, ingrese un número positivo.")
else:
    # Manejar los casos especiales para n=1 y n=2
    if n == 1:
        print("Serie de Fibonacci con 1 término:")
        print("0")
    else:
        # Mostrar el encabezado
        print(f"Serie de Fibonacci con {n} términos:")

        # Inicializar los primeros dos términos
        termino_actual = 0
        siguiente_termino = 1

        # Contador para llevar el registro de cuántos términos hemos mostrado
        contador = 1

        # Mostrar el primer término
        print(termino_actual, end="")

        # Bucle para mostrar los términos restantes
        while contador < n:
            # Agregar un separador entre términos
            print(", ", end="")

            # Mostrar el siguiente término
            print(siguiente_termino, end="")

            # Calcular el siguiente término en la serie
            temp = termino_actual + siguiente_termino
            termino_actual = siguiente_termino
            siguiente_termino = temp

            # Incrementar el contador
            contador += 1

        # Agregar un salto de línea al final
        print()

Explicación

Este programa genera y muestra los primeros n términos de la serie de Fibonacci. Maneja casos especiales para cuando el usuario solicita solo 1 término.

Para generar la serie, el programa mantiene un registro de los dos términos más recientes (termino_actual y siguiente_termino). En cada iteración, muestra el siguiente término y actualiza las variables para calcular el siguiente valor en la secuencia.

La secuencia se muestra en una sola línea, con los términos separados por comas, utilizando el parámetro end=»» en la función print() para evitar saltos de línea entre términos.

Por ejemplo, si el usuario ingresa n=6, el programa mostrará: 0, 1, 1, 2, 3, 5

Problema 7: Simulador de cajero automático

Enunciado

Crear un programa que simule un cajero automático. El programa debe permitir al usuario realizar depósitos, retiros, consultar su saldo y salir del sistema. El cajero debe imponer límites apropiados (por ejemplo, no permitir retiros mayores al saldo disponible o establecer un límite diario de retiro).

Metodología

Para resolver este problema, seguiremos estos pasos:

  1. Inicializar variables para el saldo y el límite diario de retiro.

  2. Crear un menú interactivo usando un bucle que se ejecute hasta que el usuario decida salir.

  3. Implementar cada operación:

    1. Depósito: añadir el monto al saldo.

    2. Retiro: verificar límites y restar el monto del saldo.

    3. Consulta de saldo: mostrar el saldo actual.

    4. Salir: terminar el programa.

  4. Proporcionar mensajes informativos al usuario después de cada operación.

# Inicializar variables
saldo = 1000.0  # Saldo inicial
limite_diario = 2000.0  # Límite diario de retiro
retiro_acumulado = 0.0  # Total retirado en la sesión

print("¡Bienvenido al Cajero Automático!")

# Variable para controlar el bucle principal
operando = True

while operando:
    # Mostrar menú de opciones
    print("\n==== MENÚ PRINCIPAL ====")
    print("1. Consultar saldo")
    print("2. Depositar dinero")
    print("3. Retirar dinero")
    print("4. Salir")

    # Solicitar opción al usuario
    opcion = int(input("\nSeleccione una opción (1-4): "))

    # Procesar la opción seleccionada
    if opcion == 1:  # Consultar saldo
        print(f"\nSu saldo actual es: ${saldo:.2f}")
        print(f"Retiro acumulado hoy: ${retiro_acumulado:.2f}")
        print(f"Límite diario de retiro restante: ${limite_diario - retiro_acumulado:.2f}")

    elif opcion == 2:  # Depositar dinero
        monto = float(input("Ingrese el monto a depositar: $"))

        if monto <= 0:
            print("El monto debe ser positivo.")
        else:
            saldo += monto
            print(f"Depósito exitoso. Su nuevo saldo es: ${saldo:.2f}")

    elif opcion == 3:  # Retirar dinero
        monto = float(input("Ingrese el monto a retirar: $"))

        if monto <= 0:
            print("El monto debe ser positivo.")
        elif monto > saldo:
            print("Error: Fondos insuficientes.")
        elif monto + retiro_acumulado > limite_diario:
            print(f"Error: Excede el límite diario de retiro (${limite_diario:.2f}).")
            print(f"Puede retirar hasta ${limite_diario - retiro_acumulado:.2f} más hoy.")
        else:
            saldo -= monto
            retiro_acumulado += monto
            print(f"Retiro exitoso. Su nuevo saldo es: ${saldo:.2f}")
            print(f"Retiro acumulado hoy: ${retiro_acumulado:.2f}")

    elif opcion == 4:  # Salir
        print("\n¡Gracias por utilizar nuestro Cajero Automático!")
        print("Que tenga un buen día.")
        operando = False

    else:
        print("Opción no válida. Por favor, seleccione una opción entre 1 y 4.")

print("\nFin de la sesión.")

Explicación

Este programa simula un cajero automático con cuatro funciones principales: consulta de saldo, depósito, retiro y salida del sistema. Utiliza un bucle while controlado por la variable operando para mantener el programa en ejecución hasta que el usuario elija salir.

El programa implementa restricciones realistas, como:

  • No permitir depósitos o retiros de montos negativos o cero.

  • No permitir retiros mayores al saldo disponible.

  • Imponer un límite diario de retiro.

Después de cada operación, el programa proporciona retroalimentación al usuario, mostrando el saldo actualizado y, en el caso de los retiros, el monto acumulado retirado en la sesión actual.

La presentación de valores monetarios se realiza con formato de dos decimales utilizando la sintaxis de f-strings: {valor:.2f}.

Conclusión

Estos siete problemas ilustran cómo combinar los conceptos básicos de Python (variables, operadores, condicionales y bucles) para crear programas útiles y funcionales. A medida que progresamos de un problema a otro, la complejidad aumenta, pero la lógica sigue siendo comprensible y aplicable.

Los conceptos clave que se han reforzado incluyen:

  • Operaciones aritméticas y manipulación de números

  • Estructuras condicionales para toma de decisiones

  • Bucles para repetición de tareas

  • Validación de entrada de usuario

  • Presentación clara de resultados

Estos ejemplos proporcionan una base sólida para avanzar hacia conceptos más complejos como estructuras de datos, funciones y programación orientada a objetos.