CODEZEROINTERACTIVE

Chapter 8 / 15

Parte 24 — MiniFinance del capítulo

Operadores matemáticos, comparaciones, lógica, porcentajes, promedios y cálculos financieros.

Lesson 2546%

25 / 25 lessons in this chapter

Parte 24 — MiniFinance del capítulo

1 / 1 in this part

Current chapter

Chapter 8 — Operadores y cálculos

Self-paced

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.
python terminal
# 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

text terminal
========================================
            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?: True

Problema con una meta ya superada

Si:

python terminal
saldo_actual = 3500
meta_ahorro = 3000

Entonces:

python terminal
dinero_faltante = meta_ahorro - saldo_actual

produce:

text terminal
-500

Y el progreso sería mayor que 100 %.

Eso puede ser matemáticamente correcto, pero quizá queramos mostrar:

text terminal
Meta alcanzada
Dinero adicional: 500

Para hacerlo necesitamos condiciones.


Problema con ingresos cero

Si:

python terminal
total_ingresos = 0

este cálculo falla:

python terminal
porcentaje_gastado = (total_gastos / total_ingresos) * 100

En 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:

text terminal
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 nuevo

Debe calcular:

text terminal
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 gasto

Utiliza estos valores para comprobar:

text terminal
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: 600

Resultados principales:

text terminal
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 = 2900

Requisitos:

  • 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

python terminal
# 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:

python terminal
10 + 5

Una instrucción realiza una acción completa:

python terminal
resultado = 10 + 5

La 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?

python terminal
cantidad * (porcentaje / 100)

Por ejemplo:

python terminal
ahorro = ingresos * (20 / 100)

¿Cómo calculo qué porcentaje representa una cantidad?

python terminal
(parte / total) * 100

Por ejemplo:

python terminal
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 ==?

python terminal
=

asigna.

python terminal
==

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.

python terminal
not True

produce:

text terminal
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 x para 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 de and.
  • Utilizando || en lugar de or.
  • 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 float como si fuera completamente exacto.
  • Dividiendo por una cantidad ingresada sin comprobarla.

Lista de comprobación

Antes de continuar, deberías poder marcar:

text terminal
[ ] 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, or y not.
  • 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:

text terminal
¿El gasto es válido?: False

Pero todavía no sabe mostrar una advertencia, rechazar el gasto o elegir otra acción.

Eso cambiará en el siguiente capítulo.