Parte 24 — MiniFinance del capítulo
Nueva versión
MiniFinance calculará:
- Saldo actual.
- Movimiento neto.
- Porcentaje gastado.
- Porcentaje ahorrado.
- Promedio de gastos.
- Progreso hacia una meta.
- Dinero faltante.
- Validez temporal de una operación.
# Configuración de la aplicación
NOMBRE_APLICACION = "MINIFINANCE"
VERSION = "0.4"
# Encabezado
print("=" * 40)
print(f" {NOMBRE_APLICACION}")
print("=" * 40)
print(f"Versión: {VERSION}")
print()
# Información del usuario
nombre_usuario = input("Nombre del usuario: ").strip()
nombre_cuenta = input("Nombre de la cuenta: ").strip()
moneda = input("Moneda, por ejemplo CRC o USD: ").strip().upper()
# Información financiera
print()
print("Información financiera")
print()
saldo_inicial = int(input("Saldo inicial: "))
ingreso_1 = int(input("Primer ingreso: "))
ingreso_2 = int(input("Segundo ingreso: "))
ingreso_3 = int(input("Tercer ingreso: "))
gasto_1 = int(input("Primer gasto: "))
gasto_2 = int(input("Segundo gasto: "))
gasto_3 = int(input("Tercer gasto: "))
meta_ahorro = int(input("Meta de ahorro: "))
# Totales principales
total_ingresos = ingreso_1 + ingreso_2 + ingreso_3
total_gastos = gasto_1 + gasto_2 + gasto_3
movimiento_neto = total_ingresos - total_gastos
saldo_actual = saldo_inicial + movimiento_neto
cantidad_gastos = 3
promedio_gastos = total_gastos / cantidad_gastos
# Porcentajes
porcentaje_gastado = (total_gastos / total_ingresos) * 100
porcentaje_ahorrado = (movimiento_neto / total_ingresos) * 100
progreso_meta = (saldo_actual / meta_ahorro) * 100
dinero_faltante = meta_ahorro - saldo_actual
# Estado temporal
cuenta_activa = True
gasto_prueba = int(
input("Monto de un gasto que deseas comprobar: ")
)
gasto_valido = (
cuenta_activa
and gasto_prueba > 0
and gasto_prueba <= saldo_actual
)
# Resumen
print()
print("=" * 40)
print(" RESUMEN")
print("=" * 40)
print()
print(f"Usuario: {nombre_usuario}")
print(f"Cuenta: {nombre_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"Movimiento neto: {movimiento_neto} {moneda}")
print(f"Saldo actual: {saldo_actual} {moneda}")
print()
print(
f"Promedio por gasto: "
f"{round(promedio_gastos, 2)} {moneda}"
)
print(
f"Porcentaje gastado: "
f"{round(porcentaje_gastado, 2)} %"
)
print(
f"Porcentaje ahorrado: "
f"{round(porcentaje_ahorrado, 2)} %"
)
print()
print(f"Meta de ahorro: {meta_ahorro} {moneda}")
print(
f"Progreso de la meta: "
f"{round(progreso_meta, 2)} %"
)
print(f"Dinero faltante: {dinero_faltante} {moneda}")
print()
print(f"Gasto consultado: {gasto_prueba} {moneda}")
print(f"¿El gasto parece válido?: {gasto_valido}")
print()
input("Presiona Enter para cerrar...")Suposiciones temporales
Esta versión asume que:
- Los ingresos son mayores que cero.
- La meta de ahorro es mayor que cero.
- Todos los montos contienen números válidos.
- El usuario no escribe texto en campos numéricos.
- El movimiento neto puede utilizarse como ahorro.
- Siempre existen exactamente tres gastos.
Estas limitaciones se resolverán gradualmente.
Posible ejecución
========================================
MINIFINANCE
========================================
Versión: 0.4
Nombre del usuario: Andrea
Nombre de la cuenta: Ahorros
Moneda, por ejemplo CRC o USD: crc
Información financiera
Saldo inicial: 1000
Primer ingreso: 500
Segundo ingreso: 750
Tercer ingreso: 250
Primer gasto: 300
Segundo gasto: 250
Tercer gasto: 150
Meta de ahorro: 3000
Monto de un gasto que deseas comprobar: 500
========================================
RESUMEN
========================================
Usuario: Andrea
Cuenta: Ahorros
Moneda: CRC
Saldo inicial: 1000 CRC
Total de ingresos: 1500 CRC
Total de gastos: 700 CRC
Movimiento neto: 800 CRC
Saldo actual: 1800 CRC
Promedio por gasto: 233.33 CRC
Porcentaje gastado: 46.67 %
Porcentaje ahorrado: 53.33 %
Meta de ahorro: 3000 CRC
Progreso de la meta: 60.0 %
Dinero faltante: 1200 CRC
Gasto consultado: 500 CRC
¿El gasto parece válido?: TrueProblema con una meta ya superada
Si:
saldo_actual = 3500
meta_ahorro = 3000Entonces:
dinero_faltante = meta_ahorro - saldo_actualproduce:
-500Y el progreso sería mayor que 100 %.
Eso puede ser matemáticamente correcto, pero quizá queramos mostrar:
Meta alcanzada
Dinero adicional: 500Para hacerlo necesitamos condiciones.
Problema con ingresos cero
Si:
total_ingresos = 0este cálculo falla:
porcentaje_gastado = (total_gastos / total_ingresos) * 100En el siguiente capítulo aprenderemos a comprobar los valores antes de realizar el cálculo.
Reto del capítulo
Crea una versión de MiniFinance que solicite:
Nombre del usuario
Nombre de la cuenta
Moneda
Saldo inicial
Cuatro ingresos
Cuatro gastos
Presupuesto mensual
Meta de ahorro
Ahorro mensual estimado
Monto de un gasto nuevoDebe calcular:
Total de ingresos
Total de gastos
Movimiento neto
Saldo actual
Promedio de ingresos
Promedio de gastos
Presupuesto restante
Porcentaje utilizado del presupuesto
Porcentaje ahorrado de los ingresos
Progreso de la meta
Dinero faltante
Meses estimados para completar la meta
Si el gasto nuevo es positivo
Si el gasto nuevo cabe dentro del saldo
Si la cuenta puede realizar temporalmente el gastoUtiliza estos valores para comprobar:
Saldo inicial: 1000
Ingresos:
500
750
250
500
Gastos:
300
250
150
200
Presupuesto mensual: 1500
Meta de ahorro: 5000
Ahorro mensual estimado: 750
Gasto nuevo: 600Resultados principales:
Total de ingresos:
500 + 750 + 250 + 500 = 2000
Total de gastos:
300 + 250 + 150 + 200 = 900
Movimiento neto:
2000 - 900 = 1100
Saldo actual:
1000 + 1100 = 2100
Presupuesto restante:
1500 - 900 = 600
Porcentaje utilizado:
900 / 1500 × 100 = 60 %
Progreso de la meta:
2100 / 5000 × 100 = 42 %
Dinero faltante:
5000 - 2100 = 2900Requisitos:
- Utiliza todos los operadores aritméticos al menos una vez entre los ejercicios o cálculos.
- Utiliza
+=o-=. - Utiliza paréntesis en los porcentajes.
- Utiliza
round()para mostrar decimales. - Utiliza al menos tres comparaciones.
- Utiliza
and. - Conserva la moneda como texto.
- No escribas directamente los resultados.
- Divide cálculos complejos en variables pequeñas.
- Agrega comentarios para organizar el código.
- Incluye una pausa final.
Posible solución
# Configuración
NOMBRE_APLICACION = "MINIFINANCE"
VERSION = "0.4"
# Encabezado
print("=" * 42)
print(f" {NOMBRE_APLICACION}")
print("=" * 42)
print(f"Versión: {VERSION}")
print()
# Usuario y cuenta
nombre_usuario = input("Nombre del usuario: ").strip()
nombre_cuenta = input("Nombre de la cuenta: ").strip()
moneda = input("Moneda: ").strip().upper()
# Valores iniciales
saldo_inicial = int(input("Saldo inicial: "))
# Ingresos
print()
print("Registra cuatro ingresos")
print()
ingreso_1 = int(input("Ingreso 1: "))
ingreso_2 = int(input("Ingreso 2: "))
ingreso_3 = int(input("Ingreso 3: "))
ingreso_4 = int(input("Ingreso 4: "))
# Gastos
print()
print("Registra cuatro gastos")
print()
gasto_1 = int(input("Gasto 1: "))
gasto_2 = int(input("Gasto 2: "))
gasto_3 = int(input("Gasto 3: "))
gasto_4 = int(input("Gasto 4: "))
# Presupuesto y metas
print()
presupuesto_mensual = int(
input("Presupuesto mensual: ")
)
meta_ahorro = int(
input("Meta de ahorro: ")
)
ahorro_mensual = int(
input("Ahorro mensual estimado: ")
)
gasto_nuevo = int(
input("Monto de un gasto nuevo: ")
)
# Totales
total_ingresos = (
ingreso_1
+ ingreso_2
+ ingreso_3
+ ingreso_4
)
total_gastos = (
gasto_1
+ gasto_2
+ gasto_3
+ gasto_4
)
cantidad_ingresos = 4
cantidad_gastos = 4
promedio_ingresos = (
total_ingresos / cantidad_ingresos
)
promedio_gastos = (
total_gastos / cantidad_gastos
)
# Saldos
movimiento_neto = total_ingresos - total_gastos
saldo_actual = saldo_inicial
saldo_actual += total_ingresos
saldo_actual -= total_gastos
# Presupuesto
presupuesto_restante = (
presupuesto_mensual - total_gastos
)
porcentaje_presupuesto = (
total_gastos / presupuesto_mensual
) * 100
# Ahorro
porcentaje_ahorrado = (
movimiento_neto / total_ingresos
) * 100
progreso_meta = (
saldo_actual / meta_ahorro
) * 100
dinero_faltante = meta_ahorro - saldo_actual
meses_completos = (
dinero_faltante // ahorro_mensual
)
residuo_meta = (
dinero_faltante % ahorro_mensual
)
# Comprobar un nuevo gasto
cuenta_activa = True
gasto_positivo = gasto_nuevo > 0
gasto_dentro_del_saldo = gasto_nuevo <= saldo_actual
gasto_temporalmente_valido = (
cuenta_activa
and gasto_positivo
and gasto_dentro_del_saldo
)
# Resumen
print()
print("=" * 42)
print(" RESUMEN")
print("=" * 42)
print()
print(f"Usuario: {nombre_usuario}")
print(f"Cuenta: {nombre_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"Movimiento neto: {movimiento_neto} {moneda}")
print(f"Saldo actual: {saldo_actual} {moneda}")
print()
print(
f"Promedio de ingresos: "
f"{round(promedio_ingresos, 2)} {moneda}"
)
print(
f"Promedio de gastos: "
f"{round(promedio_gastos, 2)} {moneda}"
)
print()
print(
f"Presupuesto mensual: "
f"{presupuesto_mensual} {moneda}"
)
print(
f"Presupuesto restante: "
f"{presupuesto_restante} {moneda}"
)
print(
f"Presupuesto utilizado: "
f"{round(porcentaje_presupuesto, 2)} %"
)
print()
print(
f"Porcentaje ahorrado: "
f"{round(porcentaje_ahorrado, 2)} %"
)
print(
f"Meta de ahorro: "
f"{meta_ahorro} {moneda}"
)
print(
f"Progreso de la meta: "
f"{round(progreso_meta, 2)} %"
)
print(
f"Dinero faltante: "
f"{dinero_faltante} {moneda}"
)
print(
f"Meses completos estimados: "
f"{meses_completos}"
)
print(
f"Cantidad restante después de esos meses: "
f"{residuo_meta} {moneda}"
)
print()
print(f"Gasto nuevo: {gasto_nuevo} {moneda}")
print(f"¿Es positivo?: {gasto_positivo}")
print(
f"¿Cabe dentro del saldo?: "
f"{gasto_dentro_del_saldo}"
)
print(
f"¿Puede realizarse temporalmente?: "
f"{gasto_temporalmente_valido}"
)
print()
input("Presiona Enter para cerrar...")Esta solución todavía puede producir errores si algunos divisores contienen cero.
El siguiente capítulo permitirá controlar esos casos antes de ejecutar las operaciones.
Preguntas frecuentes
¿Qué diferencia existe entre una expresión y una instrucción?
Una expresión produce un valor:
10 + 5Una instrucción realiza una acción completa:
resultado = 10 + 5La diferencia puede volverse más precisa conforme avances, pero esta explicación es suficiente por ahora.
¿Python respeta el orden matemático?
Sí.
Potencias, multiplicaciones y divisiones tienen prioridad sobre sumas y restas.
¿Debo memorizar toda la precedencia?
No completamente.
Cuando una expresión pueda resultar ambigua, utiliza paréntesis.
¿Por qué / devuelve un decimal?
Porque la división normal de Python produce un float.
¿Cuándo utilizo //?
Cuando necesitas la cantidad de grupos completos o una parte entera redondeada hacia abajo.
¿Para qué sirve %?
Permite obtener el residuo de una división.
Es útil para repartos, ciclos, páginas y comprobaciones como números pares.
¿Cómo calculo un porcentaje?
cantidad * (porcentaje / 100)Por ejemplo:
ahorro = ingresos * (20 / 100)¿Cómo calculo qué porcentaje representa una cantidad?
(parte / total) * 100Por ejemplo:
porcentaje_gastado = (gastos / ingresos) * 100¿Qué ocurre si el total es cero?
La división produce ZeroDivisionError.
Debemos comprobar el valor antes de calcular.
¿round() soluciona la precisión financiera?
No completamente.
Ayuda a mostrar valores, pero no convierte float en una representación financiera perfecta.
¿Qué diferencia existe entre = y ==?
=asigna.
==compara.
¿Una comparación siempre devuelve un booleano?
Sí.
Produce True o False.
¿Cuál es la diferencia entre and y or?
and requiere que todas las condiciones se cumplan.
or requiere que al menos una se cumpla.
¿Qué hace not?
Invierte un valor booleano.
not Trueproduce:
False¿Por qué todavía no hacemos nada con las comparaciones?
Actualmente solo calculamos y mostramos sus resultados.
En el próximo capítulo utilizaremos if, elif y else para ejecutar código diferente según esas comparaciones.
¿Debo escribir todos los cálculos en una sola línea?
No.
Es preferible dividirlos en variables con nombres claros.
¿Puede un programa funcionar y tener resultados incorrectos?
Sí.
Eso se conoce como error lógico.
Python solo puede comprobar si la sintaxis es válida, no si tu fórmula representa correctamente tu intención.
Errores comunes del capítulo
Antes de continuar, comprueba que no estés:
- Utilizando
xpara multiplicar. - Utilizando
^para potencias. - Confundiendo
/con//. - Dividiendo entre cero.
- Olvidando dividir porcentajes entre
100. - Confundiendo una cantidad con un porcentaje.
- Ignorando el orden de operaciones.
- Calculando un promedio sin agrupar la suma.
- Mezclando texto y números.
- Utilizando
=cuando necesitas==. - Utilizando
&&en lugar deand. - Utilizando
||en lugar deor. - Comparando textos sin normalizar mayúsculas.
- Redondeando demasiado pronto.
- Escribiendo una expresión enorme en una sola línea.
- Ignorando los valores intermedios.
- Suponiendo que todo error produce un mensaje.
- Utilizando
floatcomo si fuera completamente exacto. - Dividiendo por una cantidad ingresada sin comprobarla.
Lista de comprobación
Antes de continuar, deberías poder marcar:
[ ] Sé qué es un operador.
[ ] Sé qué es una expresión.
[ ] Puedo sumar con +.
[ ] Puedo restar con -.
[ ] Puedo multiplicar con *.
[ ] Entiendo la división con /.
[ ] Entiendo la división entera con //.
[ ] Sé obtener un residuo con %.
[ ] Sé calcular potencias con **.
[ ] Puedo utilizar += y -=.
[ ] Comprendo el orden de las operaciones.
[ ] Sé utilizar paréntesis.
[ ] Puedo calcular un porcentaje.
[ ] Puedo calcular qué porcentaje representa una cantidad.
[ ] Puedo calcular un promedio.
[ ] Sé utilizar round().
[ ] Entiendo qué es ZeroDivisionError.
[ ] Sé utilizar == y !=.
[ ] Sé utilizar >, <, >= y <=.
[ ] Entiendo and.
[ ] Entiendo or.
[ ] Entiendo not.
[ ] Puedo combinar comparaciones.
[ ] Sé reconocer un error lógico básico.
[ ] Puedo comprobar cálculos mostrando valores intermedios.
[ ] MiniFinance puede calcular estadísticas financieras.Si alguna respuesta es negativa, practica nuevamente la sección correspondiente.
Qué aprendiste
En este capítulo aprendiste:
- Qué es un operador.
- Qué es un operando.
- Qué es una expresión.
- Cómo sumar.
- Cómo restar.
- Cómo multiplicar.
- Cómo dividir.
- La diferencia entre
/y//. - Cómo obtener residuos mediante
%. - Cómo calcular potencias mediante
**. - Cómo actualizar variables con operadores abreviados.
- Cómo funciona la precedencia.
- Cómo controlar el orden mediante paréntesis.
- Cómo calcular porcentajes.
- Cómo calcular descuentos y aumentos.
- Cómo calcular promedios.
- Cómo utilizar
round(). - Cómo comparar valores.
- Cómo utilizar
==,!=,>,<,>=y<=. - Cómo combinar expresiones mediante
and,orynot. - Cómo construir cálculos financieros.
- Cómo calcular saldos, presupuestos, promedios y metas.
- Qué es un error lógico.
- Cómo investigar resultados incorrectos.
- Por qué debemos comprobar divisores antes de realizar cálculos.
MiniFinance ya puede recibir información, realizar operaciones más completas y producir resultados booleanos.
Sin embargo, todavía muestra esos valores sin decidir qué debe hacer con ellos.
Puede calcular:
¿El gasto es válido?: FalsePero todavía no sabe mostrar una advertencia, rechazar el gasto o elegir otra acción.
Eso cambiará en el siguiente capítulo.