====================== 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: a. Obtener el último dígito del número usando la operación módulo (%). b. Añadir este dígito a la suma. c. Eliminar el último dígito del número mediante la división entera (//). 4. Mostrar la suma de los dígitos. .. toggle:: .. code-block:: python # 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. .. toggle:: .. code-block:: python # 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: a. Calcular el producto del número base por el multiplicador actual. b. Añadir este producto a la suma total. c. Mostrar la operación formateada. 5. Mostrar la suma total de los resultados. .. toggle:: .. code-block:: python # 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: a. Solicitar un número al usuario. b. Incrementar el contador de intentos. c. Comparar el número ingresado con el número a adivinar. d. Dar pistas al usuario (mayor o menor). 4. Cuando el usuario adivine, mostrar un mensaje de felicitación y el número de intentos. .. toggle:: .. code-block:: python # 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. .. toggle:: .. code-block:: python # 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. .. toggle:: .. code-block:: python # 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: a. Depósito: añadir el monto al saldo. b. Retiro: verificar límites y restar el monto del saldo. c. Consulta de saldo: mostrar el saldo actual. d. Salir: terminar el programa. 4. Proporcionar mensajes informativos al usuario después de cada operación. .. toggle:: .. code-block:: python # 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.