CODEZEROINTERACTIVE

Chapter 7 / 15

Parte 21 — MiniFinance del capítulo

Entrada de datos con input(), conversiones, respuestas del usuario y formulario interactivo de MiniFinance.

Lesson 2240%

22 / 22 lessons in this chapter

Parte 21 — MiniFinance del capítulo

1 / 1 in this part

Current chapter

Chapter 7 — input(): recibir información del usuario

Self-paced

Parte 21 — MiniFinance del capítulo

Versión interactiva

python terminal
# Configuración de la aplicación

NOMBRE_APLICACION = "MINIFINANCE"
VERSION = "0.3"


# Encabezado

print("=" * 36)
print(f"          {NOMBRE_APLICACION}")
print("=" * 36)
print(f"Versión: {VERSION}")
print()
print("Configura tu primera cuenta")
print()


# Datos del usuario

nombre_usuario = input("Nombre del usuario: ").strip()
nombre_cuenta = input("Nombre de la cuenta: ").strip()
numero_cuenta = input("Número de cuenta: ").strip()
moneda = input("Moneda, por ejemplo CRC o USD: ").strip().upper()


# Datos financieros

print()
print("Registra tus primeros movimientos")
print()

saldo_inicial = int(input("Saldo inicial: "))
ingreso_1 = int(input("Primer ingreso: "))
ingreso_2 = int(input("Segundo ingreso: "))
gasto_1 = int(input("Primer gasto: "))
gasto_2 = int(input("Segundo gasto: "))


# Cálculos

total_ingresos = ingreso_1 + ingreso_2
total_gastos = gasto_1 + gasto_2
saldo_actual = saldo_inicial + total_ingresos - total_gastos


# Estado temporal

cuenta_activa = True
datos_guardados = False
ultimo_movimiento = None


# Resumen

print()
print("=" * 36)
print("         RESUMEN FINANCIERO")
print("=" * 36)
print()
print(f"Usuario: {nombre_usuario}")
print(f"Cuenta: {nombre_cuenta}")
print(f"Número: {numero_cuenta}")
print(f"Moneda: {moneda}")
print()
print(f"Saldo inicial: {saldo_inicial} {moneda}")
print(f"Total de ingresos: {total_ingresos} {moneda}")
print(f"Total de gastos: {total_gastos} {moneda}")
print(f"Saldo disponible: {saldo_actual} {moneda}")
print()
print(f"Cuenta activa: {cuenta_activa}")
print(f"Datos guardados: {datos_guardados}")
print(f"Último movimiento: {ultimo_movimiento}")
print()

input("Presiona Enter para cerrar...")

Posible ejecución

text terminal
====================================
          MINIFINANCE
====================================
Versión: 0.3

Configura tu primera cuenta

Nombre del usuario: Andrea
Nombre de la cuenta: Cuenta principal
Número de cuenta: 001234
Moneda, por ejemplo CRC o USD: crc

Registra tus primeros movimientos

Saldo inicial: 1000
Primer ingreso: 500
Segundo ingreso: 250
Primer gasto: 200
Segundo gasto: 100

====================================
         RESUMEN FINANCIERO
====================================

Usuario: Andrea
Cuenta: Cuenta principal
Número: 001234
Moneda: CRC

Saldo inicial: 1000 CRC
Total de ingresos: 750 CRC
Total de gastos: 300 CRC
Saldo disponible: 1450 CRC

Cuenta activa: True
Datos guardados: False
Último movimiento: None

Presiona Enter para cerrar...

Qué puede hacer ahora MiniFinance

MiniFinance ya puede:

  • Preguntar el nombre del usuario.
  • Recibir el nombre de una cuenta.
  • Conservar un número de cuenta como texto.
  • Recibir una moneda.
  • Normalizar la moneda a mayúsculas.
  • Solicitar montos.
  • Convertirlos a números.
  • Calcular ingresos.
  • Calcular gastos.
  • Calcular un saldo.
  • Mostrar un resumen personalizado.
  • Esperar antes de cerrar.

Qué todavía no puede hacer

Todavía no puede:

  • Detectar nombres vacíos.
  • Rechazar números negativos.
  • Recuperarse de texto escrito en un monto.
  • Decidir qué opción del menú fue seleccionada.
  • Repetir el menú.
  • Registrar una cantidad ilimitada de movimientos.
  • Guardar datos después de cerrar.
  • Mostrar una interfaz gráfica.

Cada una de esas limitaciones se resolverá en capítulos posteriores.


Reto del capítulo

Crea una versión interactiva de MiniFinance que solicite:

text terminal
Nombre del usuario
Nombre de la cuenta
Número de cuenta
Moneda
Saldo inicial
Tres ingresos
Tres gastos
Una descripción opcional
Una opción del menú

La aplicación debe calcular:

text terminal
Total de ingresos
Total de gastos
Saldo final

Debe mostrar:

text terminal
====================================
          MINIFINANCE
====================================

Usuario: Andrea
Cuenta: Ahorros
Número: 001234
Moneda: CRC
Descripción: Fondo para proyectos

Saldo inicial: 2000 CRC
Total de ingresos: 1500 CRC
Total de gastos: 700 CRC
Saldo final: 2800 CRC

Opción seleccionada: 3

Utiliza estos valores para comprobar el resultado:

text terminal
Saldo inicial: 2000

Ingreso 1: 500
Ingreso 2: 750
Ingreso 3: 250

Gasto 1: 300
Gasto 2: 250
Gasto 3: 150

Cálculos:

text terminal
Total de ingresos:
500 + 750 + 250 = 1500

Total de gastos:
300 + 250 + 150 = 700

Saldo final:
2000 + 1500 - 700 = 2800

Requisitos:

  • Utiliza input().
  • Convierte los montos a int.
  • Conserva el número de cuenta como str.
  • Utiliza .strip() en los textos.
  • Convierte la moneda a mayúsculas.
  • Conserva la opción del menú como str.
  • Utiliza al menos tres f-strings.
  • No escribas directamente los totales.
  • Incluye una pausa final.
  • Ejecuta el programa desde la terminal.

Posible solución

python terminal
# Configuración

NOMBRE_APLICACION = "MINIFINANCE"
VERSION = "0.3"


# Encabezado

print("=" * 36)
print(f"          {NOMBRE_APLICACION}")
print("=" * 36)
print(f"Versión: {VERSION}")
print()


# Información de la cuenta

nombre_usuario = input("Nombre del usuario: ").strip()
nombre_cuenta = input("Nombre de la cuenta: ").strip()
numero_cuenta = input("Número de cuenta: ").strip()
moneda = input("Moneda: ").strip().upper()
descripcion = input("Descripción opcional: ").strip()


# Información financiera

print()
print("Registra los ingresos")
print()

saldo_inicial = int(input("Saldo inicial: "))

ingreso_1 = int(input("Ingreso 1: "))
ingreso_2 = int(input("Ingreso 2: "))
ingreso_3 = int(input("Ingreso 3: "))

print()
print("Registra los gastos")
print()

gasto_1 = int(input("Gasto 1: "))
gasto_2 = int(input("Gasto 2: "))
gasto_3 = int(input("Gasto 3: "))


# Cálculos

total_ingresos = ingreso_1 + ingreso_2 + ingreso_3
total_gastos = gasto_1 + gasto_2 + gasto_3
saldo_final = saldo_inicial + total_ingresos - total_gastos


# Menú temporal

print()
print("1. Registrar ingreso")
print("2. Registrar gasto")
print("3. Ver movimientos")
print("4. Salir")

opcion = input("Selecciona una opción: ").strip()


# Resumen

print()
print("=" * 36)
print(f"          {NOMBRE_APLICACION}")
print("=" * 36)
print()
print(f"Usuario: {nombre_usuario}")
print(f"Cuenta: {nombre_cuenta}")
print(f"Número: {numero_cuenta}")
print(f"Moneda: {moneda}")
print(f"Descripción: {descripcion}")
print()
print(f"Saldo inicial: {saldo_inicial} {moneda}")
print(f"Total de ingresos: {total_ingresos} {moneda}")
print(f"Total de gastos: {total_gastos} {moneda}")
print(f"Saldo final: {saldo_final} {moneda}")
print()
print(f"Opción seleccionada: {opcion}")
print()

input("Presiona Enter para cerrar...")

Esta versión todavía confía en que el usuario escribirá correctamente todos los montos.

En capítulos posteriores aprenderemos a protegerla contra entradas inválidas.


Preguntas frecuentes

¿Por qué input() siempre devuelve texto?

Porque recibe caracteres escritos mediante el teclado y no sabe qué significado tienen.


¿Siempre debo utilizar int(input())?

No.

Úsalo cuando necesites un número entero.

Para nombres, monedas, teléfonos o identificadores debes conservar texto.


¿Cuándo utilizo float(input())?

Cuando necesitas aceptar decimales:

python terminal
precio = float(input("Precio: "))

Recuerda utilizar punto decimal.


¿Puedo convertir después?

Sí.

python terminal
saldo_texto = input("Saldo: ")
saldo = int(saldo_texto)

¿Qué pasa si el usuario no escribe nada?

input() devuelve un texto vacío:

python terminal
""

Más adelante comprobaremos este caso mediante condiciones.


¿Qué pasa si escribe letras en un int()?

Python produce un ValueError y el programa se detiene.

Más adelante utilizaremos try y except.


¿Puedo recibir varios datos con un solo input()?

Sí, pero separarlos correctamente requiere más conceptos.

Por ahora utiliza una pregunta por dato.


¿Por qué la opción del menú puede quedarse como texto?

Porque no necesitamos realizar cálculos con ella.

Además, recibirla como texto evita una conversión inmediata que podría fallar.


¿input() guarda automáticamente la información?

No de manera permanente.

La respuesta se guarda en una variable durante la ejecución.

Al cerrar el programa, desaparece.


¿Cómo hago para que permanezca guardada?

Más adelante utilizaremos:

  • Archivos.
  • JSON.
  • SQLite.

¿Puedo cambiar el mensaje según la respuesta?

Sí, pero necesitamos condiciones con if, elif y else.


¿Puedo repetir una pregunta si el dato es incorrecto?

Sí.

Para hacerlo correctamente utilizaremos bucles y manejo de errores.


¿Por qué utilizamos .strip()?

Para eliminar espacios innecesarios al inicio y al final de una respuesta.


¿Por qué utilizamos .upper() en la moneda?

Para guardar formatos consistentes como:

text terminal
CRC
USD
JPY

aunque el usuario los escriba en minúsculas.


¿Las f-strings cambian el valor de las variables?

No.

Solo crean texto utilizando sus valores.


¿Puedo colocar operaciones dentro de {}?

Sí:

python terminal
print(f"Saldo: {ingresos - gastos}")

Pero puede ser más claro calcular primero el resultado.


Errores comunes del capítulo

Antes de continuar, comprueba que no estés haciendo alguna de estas cosas:

  • Utilizar input() sin guardar su resultado.
  • Suponer que input() devuelve números.
  • Sumar montos sin convertirlos.
  • Convertir números de cuenta a int.
  • Escribir booleanos con input() y creer que ya son bool.
  • Utilizar bool("no") esperando obtener False.
  • Dejar dos paréntesis abiertos al usar int(input()).
  • Convertir texto no numérico.
  • Utilizar coma para decimales.
  • Reemplazar accidentalmente el nombre input.
  • Olvidar guardar el archivo antes de ejecutarlo.
  • Pensar que input() guarda datos después de cerrar.
  • No limpiar espacios en campos de texto.
  • Confundir un texto vacío con None.

Lista de comprobación

Antes de continuar, deberías poder marcar:

text terminal
[ ] Sé qué hace input().
[ ] Sé guardar una respuesta en una variable.
[ ] Entiendo que el programa espera hasta que presiono Enter.
[ ] Sé que input() siempre devuelve str.
[ ] Puedo convertir una respuesta con int().
[ ] Puedo convertir una respuesta con float().
[ ] Sé cuándo conservar un dato como texto.
[ ] Puedo solicitar un número de cuenta sin perder ceros.
[ ] Sé qué ocurre si escribo letras dentro de int().
[ ] Entiendo la diferencia entre recibir, convertir y validar.
[ ] Sé utilizar .strip().
[ ] Sé utilizar .upper() y .lower().
[ ] Entiendo que "True" no es igual a True.
[ ] Sé por qué bool("no") produce True.
[ ] Puedo recibir una opción de menú.
[ ] Puedo utilizar input() para pausar un programa.
[ ] Puedo utilizar una f-string.
[ ] MiniFinance puede recibir datos del usuario.
[ ] MiniFinance puede calcular un saldo con datos introducidos.

Si alguna respuesta es negativa, vuelve a practicar la sección correspondiente.


Qué aprendiste

En este capítulo aprendiste:

  • Qué hace input().
  • Cómo recibir información desde la terminal.
  • Cómo guardar una respuesta.
  • Por qué el programa se detiene temporalmente.
  • Por qué input() devuelve texto.
  • Cómo convertir entradas utilizando int() y float().
  • Cuándo conservar una respuesta como str.
  • Cómo proteger los ceros iniciales de identificadores.
  • Qué ocurre cuando una conversión falla.
  • Qué diferencia existe entre recibir, convertir y validar.
  • Cómo trabajar con respuestas vacías.
  • Cómo eliminar espacios mediante .strip().
  • Cómo normalizar texto con .upper() y .lower().
  • Por qué una respuesta textual no es un booleano.
  • Por qué bool(input()) puede ser engañoso.
  • Cómo solicitar una opción de menú.
  • Cómo pausar un programa.
  • Cómo crear mensajes mediante f-strings.
  • Cómo construir el primer formulario interactivo de MiniFinance.
  • Cómo calcular saldos utilizando información escrita por el usuario.

MiniFinance ya no utiliza únicamente datos elegidos por el desarrollador.

Ahora puede escuchar a la persona que lo utiliza y construir un resumen financiero personalizado.

Sin embargo, todavía acepta casi cualquier valor sin cuestionarlo.

En el siguiente capítulo aprenderemos a realizar cálculos más completos y a trabajar correctamente con operadores.