Desarrollo de un programa básico de finanzas
Quick Note
Hello, if you visit us from another country for non spanish speakers press the language button to read this post in the language of your preference. To see the program code go back and press the spanish option again because the translator scrambles it.
Hola a todos en esta entrada les muestro este programa que hice sobre algunas formulas financieras básicas que incluyen las siguientes opciones
- Interés compuesto
- Anualidades
- Imposiciones
Este programa fue escrito con propositos academicos, no como aplicacion comercial o de calculo. Requiere cambios sobre todo en los tipos de datos y mas pruebas para eso pero considero que se pueden aprender muchas cosas utiles sobre programacion estructurada y manejo de errores en calculos por medio de este programa.
Aqui les muestro unas definiciones de cada una de las opciones que hace el calculo del programa
Interes Compuesto
El interes es compuesto cuando los intereses que gana el capital representado se capitalizan
periodicamente, es decir se suman al capital prestado a intervalos iguales de tiempo constituyendo
un nuevo capital al final de cada unidad de tiempo.
A continuacion les muestro una imagen de la formula de interes compuesto
Esta formula funciona por medio de una repeticion controlada por contador a traves de un ciclo for
Anualidad
Se define la anualidad como la cantidad fija que hay que pagar al final de
cada año para amortizar un capital prestado y sus intereses compuestos en cierto numero
de años
Donde:
P= valor presente
A = Anualidad (cuota del crédito o ingreso mensual)
i= Tasa de interés periódica
n= Número de periodos
Esta formula debe checar sus datos de interes y amortizacion para evitar una division entre cero. El programa en este caso le pedira que verifique sus datos para intentar el ingreso de datos nuevamente.
Imposiciones
Se trata de construir un capital c en cierto numero de años imponiendo al principio de cada año
una cantidad fija a interes compuesto
Para consultar mas sobre las formulas usadas por este programa, al igual que ejercicios lo pueden consultar en el libro de Baldor de Algebra en el ultimo capitulo sobre Interes compuesto y anualidades
Sobre el funcionamiento del programa
El programa por medio de un menu despliega 3 opciones de calculo y una opcion de salida por medio de un switch.
Si tienes dudas acerca del desarrollo del menu te recomiendo que visites mi POST sobre menus en este mismo blog donde encontraras el analisis del programa al igualque una plantilla para el desarrollo de proyectos.
Verificacion de datos
El ingreso de datos se verifica que cumpla cada dato ingresado con las condiciones de la formula por medio de un ciclo do while para dar la oportunidad de ingresar los datos una vez y posteriormente verificar permitiendo que el programa adquiera una mayor robustez.
Aqui les muestro la aplicacion de un ciclo do while para verificar el monto minimo que permite los calculos de interes compuesto en este programa. El condicional if permite en caso de no validarse la condicion avisarle al usuario para ingresar los datos nuevamente.
Tanto if como do while tienen la misma condicion para poder verificar el dato
do{
//lectura de dato
printf("Ingrese el monto a depositar: $ ");
scanf("%f", &principal);
copia_1 = principal;
if(principal < 1000.0)
printf("\nEl monto minimo para depositar una cuenta son $1000.0, ingrese otra cantidad\n\n");
}while(principal < 1000.0);
Si quisieramos que cumplier con un rango de valores podemos usar una condicion compuesta con la ayuda de los operadores logicos de C
Aqui les muestro las tablas de verdad de los operadores AND y OR donde A, B y P, Q son los operandos de la expresion.
TABLA DE VERDAD DE OR
TABLA DE VERDAD DE AND
Un ejemplo si quisieramos que la variable principal estuviera en el rango de $1000 a $50000 podemos verificarlo por medio de esta condicion.
if(principal >= 1000 && principal <= 5000)
printf("Tu valor esta en el rango de $1000 a $5000");
Otra utilidad para esto esta en evaluar caracteres sin importar que sean mayuscula o minuscula mientras sea el tipo de caracter solicitado.
if(caracter == 'm'
|| caracter == 'M')
printf("Seleccionaste la letra m");
Precedencia de operadores
Cuando escriban en sus programas expresiones de este tipo se deben tomar en cuenta la precedencia de los operadores para evitar errores logicos dificiles de detectar por el compilador. Para evitar esto recomiendo encerrar los operandos a evaluar con ( ) ya que los parentesis tienen la precedencia mas alta.
Les dejo esta tabla de consulta que es muy util .
Manejo de division entre cero
La formulas de anualidad e imposiciones requieren divisiones por lo que se maneja un if else para manejar la posibilidad de producir una division entre cero que haria que el programa colapsara o crasheara como luego tambien le dicen. Si esto sucede el programas saltara la opcion de calculo y te pedira que verifiques tu datos.
Aqui les muestro la parte del codigo que hace esta opcion. Esta es una alternativa practica y facil de implementar para mejorar la robustez de sus programas y evitar el colapso por el error de division entre cero.
denominador_a = pow(1+ r, t) - 1;
if(denominador_a != 0) //evitar division entre cero
{
a = ( (c*r) * pow(1+ r, t) ) / denominador_a;
//fase de impresion de resultados
printf("\n\nReporte de resultados.");
printf("\nLa anualidad a pagar despues de amoritizarla %f años
al %f de interes es: ", t, r);
printf("\nCantidad a pagar $: %4.2f \n", a);
}
else
printf("DIVISION ENTRE CERO: CHEQUE SUS DATOS DE INTERES Y AMORTIZACION");
Mientras el programa sepa mejor manejar eventualidades de tipos de datos erroneos o invalidos tendremos un software mucho mas confiable y de mayor calidad para los usuarios Bueno para eso estamos jajaja.
Tip de edición de programa
Escribir el programa en el editor de texto requiere muchos caracteres especiales, por lo que les recomiendo para todos los que tienen código ASCII en su equipo aprenderse alguno de los caracteres que se utilizan con frecuencia
Para usar la tabla solo aprieta ALT + NumeroTabla
Notas antes de usarse
Este programa aun considero que faltan pruebas para poder usarse, por lo que solo lo recomiendo como una forma de verificar resultados y uso academico. El programa esta declarado con tipos de datos tipo float, por lo que se necesita cambiar a otro tipo de dato de mayor precision para poder ser usado como herramienta de calculo.
Este programa fue escrito y probado en el compilador Dev C++
Capturas de pantalla del programa funcionando
/*Calculo de Interes Compuesto VERSION DE PRUEBA 2015
---------------------------------------------------------
Blog de Rincon Informatico Mexico 2015
Autor: Juan Lopez
---------------------------------------------------------
DESCRIPCION DEL PROGRAMA
El siguiente programa realiza calculos financieros basicos para la resolucion de problemas
basicos de finanzas.
NOTAS TECNICAS
El programa funciona con datos tipo float, por lo que para una aplicacion comercial se requiere
su codificacion a un lenguaje especializado o bien que soporte tipos de datos con la precision requerida
Los do/while funcionan para verificar los datos que sean validos para las formulas pero es posible
que el programa requiera mas depuracion.
----------------------------------------------------------
Consulta Teorica tomada del libro de Algebra de Baldor
.---------------------------------------------------------
Interes Compuesto
El interes es compuesto cuando los intereses que gana el capital representado se capitalizan
periodicamente, es decir se suman al capital prestado a intervalos iguales de tiempo constituyendo
un nuevo capital al final de cada unidad de tiempo.
Anualidad
Se define la anualidad como la cantidad fija que hay que pagar al final de
cada año para amortizar un capital prestado y sus intereses compuestos en cierto numero
de años
Imposiciones
Se trata de construir un capital c en cierto numero de años imponiendo al principio de cada año
una cantidad fija a interes compuesto
-------------------------------------------------------------
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <ctype.h>
//calculos financieros basicos
void Interes(void);
void Anualidad(void );
void Imposicion(void );
//control de programa
void menu(void);
void SalirDelProg(void );
int main(int argc, char *argv[])
{
//valores para distribucion binomial
menu(); //menu de opciones
system("cls");
printf("Calculos financieros basicos >!ºº!<\n");
printf("\nCreditos.\nhecho por Juan Carlos Lopez\nVuelve pronto");
getch();
//system("PAUSE");
return 0;
} //fin de main
//menu de opciones
void menu()
{
char salida, opcion;
do{
system("cls");
printf("\a************************************************\n");
printf("* + + + + + *\n");
printf("* <Calculos financieros basicos 1.0> !ºº!< *\n");
printf("* + + + + *\n");
printf("* + + + + + *\n");
printf("**************************************************\n\n\n");
//seleccion de
printf("[1]-Interes Compuesto.\n");
printf("[2]-Anualidades.\n");
printf("[3]-Imposiciones.\n");
printf("[4]-Salir.\n");
printf("\n\n*Selecciona la funcion que desee calcular: ");
scanf("%d", &opcion);
switch(opcion)
{
case 1:
Interes();
break;
case 2:
Anualidad();
break;
case 3:
Imposicion();
break;
case 4:
SalirDelProg();
break;
default:
printf("Opcion incorrecta; selecciona de nuevo una opcion");
break;
}//fin de seleccion
printf("\n\n¿Desea un nuevo calculo (S/N)?: ");
salida = getch();
salida = tolower(salida);
}while(salida == 's' );
}//fin del menu de opciones
//salir del programa
void SalirDelProg(void)
{
char salida;
printf("\n\n¿Desea un nuevo calculo (S/N)?: ");
salida = getch();
if(salida == 's') //salir del programa
salida = tolower(salida);
else //regresar al menu de opciones
menu();
}
//calculo de funciones matematicas
void Interes()
{
system("cls");
float year, principal, rate, numero, counter, amount;
float copia_1, copia_n;
printf("Calculo de interes Compuesto\n"); //adaotado del ejemplo de Como Programar en C Deitel
printf("-Ingreso de datos.-\n");
do{
printf("Ingrese el monto a depositar: $ ");
scanf("%f", &principal);
copia_1 = principal;
if(principal < 1000.0)
printf("\nEl monto minimo para depositar una cuenta son $1000.0, ingrese otra cantidad\n\n");
}while(principal < 1000.0);
do{
printf("*Ingrese los años que desee hacer su inversion: ");
scanf("%f", &year);
if(year < 1.0)
printf("ERROR 234: se necesita al menos un año de deposito para generar intereses.\n");
}while(year < 1.0);
printf("*Ingrese la tasa de interes anual %: ");
scanf("%f", &numero);
printf("\n");
rate = numero * 0.01;
printf("%4s%21s\n", "año", "monto de deposito");
for(counter = 1.0; counter <= year; counter++)
{
amount = principal * pow(1.0 + rate, counter);
printf("%4.0f%14.2f\n", counter, amount);
if(year == counter)
copia_n = amount;
}
printf("\n\nReporte de resultados.-");
printf("\n*Monto inicial: %8.2f\n*Monto final: %10.2f\n*Ganancia de la inversion de %2.0f año(s) %8.2f\n", copia_1, copia_n,
counter, copia_n-copia_1);
} //fin de la funcion para distribucion binomial
void Anualidad()
{
float a, c, r, t, r_a;
/*Variables para la formula de anualidad
donde
*/
float denominador_a;
system("cls");
printf("Calculo de Anualidades\n");
printf("-Ingreso de datos.-\n");
//fase de captura de datos
printf("Ingresa la cantidad a pagar: ");
scanf("%f", &c);
do //uso de do/while para verificar que los datos sean validos. La estructura permite el ingreso de datos al menos una vez y verificarlos en caso de ser validos salir de la estructura y continuar
{
printf("Ingresa el porcentaje de Interes a pagar: ");
scanf("%f", &r_a);
if(r_a < 0)
printf("ERROR: Un interes < 0 por ciento no es valido.");
}while(r_a < 0);
do{
printf("Ingresa los años de amortizacion: ");
scanf("%f", &t);
if(t <= 1)
printf("ERROR: Se necesita al menos un año de amortizacion para el calculo.");
}while(t <= 1);
//fase de procesamiento de datos
r = r_a / 100; //sacar el interes en porcentaje para
denominador_a = pow(1+ r, t) - 1;
if(denominador_a != 0) //evitar division entre cero
{
a = ( (c*r) * pow(1+ r, t) ) / denominador_a;
//fase de impresion de resultados
printf("\n\nReporte de resultados.");
printf("\nLa anualidad a pagar despues de amoritizarla %f años al %f de interes es: ", t, r);
printf("\nCantidad a pagar $: %4.2f \n", a);
}
else
printf("DIVISION ENTRE CERO: CHEQUE SUS DATOS DE INTERES Y AMORTIZACION");
}//fin de la funcion de Anualidad
void Imposicion()
{
system("cls");
printf("Calculo de Imposiciones ");
float imp, capital, r_imp, t_anyos;
float denom_b;
//captura y verificacion de datos
do{
printf("Ingresa los años en los que se pretende construir el capital: ");
scanf("%f", &t_anyos);
if(t_anyos <= 1)
printf("ERROR: Se necesita al menos un año para el calculo.");
}while(t_anyos <= 1);
do{
printf("Ingresa la imposicion anual: ");
scanf("%f", &r_imp);
if(r_imp < 0)
printf("ERROR: Un interes < 0% no es valido.");
}while(r_imp < 0);
do{
printf("Ingresa el capital a construir: ");
scanf("%f", &capital);
if(capital < 0)
printf("ERROR: El capital ingresado debe ser mayor a cero.");
}while(capital < 0);
//procesamiento de datos
denom_b = pow(1+ r_imp,t_anyos+ 1) - (1 + r_imp);
if(denom_b != 0) //checar que no se produzca division entre cero
{
imp = (capital * r_imp) / denom_b;
printf("Reporte de resultados");
printf("La imposicion para construir el capital desado es: %4.2f", imp);
}else
printf("ERROR 235: DIVISION ENTRE CERO VERIFICA TUS DATOS");
//impresion de resultados
}//fin de la funcion de Imposicion
//FIN DE PROGRAMA