Financial Helper
Paul Pederson
pop at bunkerb.UUCP
Wed Apr 17 07:19:14 AEST 1985
This is a program which you may find useful for calculating different
financial formulas. Probably the most interesting of the calculations
is the amortization schedule.
Compile as follows:
cc -O -ltermcap -lm -o <outfile> <infile>
where:
<infile> is the name you have chosen for this source file
<outfile> is the name of the executable file
P.S. Any fixes should be posted to the net.
---------------------------cut here--------------------------------------
/* This program is hereby given into the hands of the public, and is
* considered to be public domain. You may use it for whatever purposes
* you wish, including but not limited to: resale, personal use, teaching,
* incorporating into other programs, fun at parties. The author,
* regrettably, does not warrant it for any purpose whatsoever, so you're
* on your own.
*/
#include <stdio.h>
#include <sgtty.h>
#include <math.h>
struct sgttyb otsgb;
char mnths[12][4] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
main()
{
char choice;
iniline();
clear_init();
resetline();
while(1)
{
clear();
printf("\tFINANCIAL HELPER\n\n");
printf("0) Calculate Rate of Return\n");
printf("1) Interest Rate on Loan\n");
printf("2) Future Value of monthly deposits\n");
printf("3) Nominal & Effective Interest Rates\n");
printf("4) Compound Interest Rate\n");
printf("5) Simple Interest Rate\n");
printf("6) Future Value of Present Sum\n");
printf("7) Present Value of Future Sum\n");
printf("8) Amortization Schedule\n");
printf("9) Done\n");
printf("\nPlease choose one of the above ");
fflush(stdout);
iniline();
choice = getchar();
resetline();
clear();
switch (choice)
{
case '0': ROR(); break;
case '1': LOANINT(); break;
case '2': FVMP(); break;
case '3': NEIR(); break;
case '4': CIR(); break;
case '5': SIR(); break;
case '6': FVPS(); break;
case '7': PVFS(); break;
case '8': AMORT(); break;
case '9': printf("\n");exit(0);
}
}
}
ROR()
{
double presval,futval,earnings[100],temp0,temp1,temp2,temp3;
double finput();
int i,j, numpers, numyears, iinput();
char a;
presval = finput("\tPurchase Price of investment ");
futval = finput("\tFinal Sales price ");
numpers = iinput("\tTotal number of periods ");
numyears= iinput("\tNumber of periods in each year ");
for(i=0;i<numpers;i++)
{
printf("\tEarnings for period %d",i+1);
earnings[i] = finput(" ");
}
temp0 = 0.15 / numyears;
while(1)
{
temp1 = futval / pow((float)(1+ temp0), (float)numpers);
temp3 = temp2 = 0.0;
for (i=0;i<numpers;i++)
{
temp3 = earnings[i] / pow((float)(1+temp0),(float)i);
temp2+=temp3;
}
temp3 = temp0 * (temp1 + temp2) / presval;
if(temp0 - temp3 < 0.000001 && temp0 - temp3 > -0.000001)
break;
else
temp0 = temp3;
}
printf("\nRate of Return = %11.2f",temp0*numyears*100);
myret();
}
double
finput(string)
char *string;
{
char *temp, *buf, *malloc();
int i;
printf("%s",string);
fflush(stdout);
buf = temp = malloc(20);
for(i=0; i<20;i++)
{
*buf = getchar();
if (*buf == '\n')
break;
else
buf++;
}
if(i == 20)
buf[-1] = '\0';
else
*buf = '\0';
return(atof(temp));
}
iinput(string)
char *string;
{
char *temp, *buf, *malloc();
int i;
printf("%s",string);
buf = temp = malloc(20);
for(i=0; i<20 && buf[-1] != '\n';i++)
*buf++ = getchar();
buf[-1] = '\0';
return(atoi(temp));
}
LOANINT()
{
double l, pv, p, l1;
int ny, n;
pv = finput("\tPresent value of loan ");
ny = iinput("\tNumber of terms per year ");
n = iinput("\tNumber of periods in loan ");
p = finput("\tAmount of each payment ");
l = 0.008;
while(1)
{
l1 = p / pv * pow((float)(1+l),(float)(n-1)) / pow((float)(1+l),(float)n);
if (l-l1 < 0.000001 && l-l1 > -0.000001)
break;
else
l = l1;
}
l = l1 * ny * 100;
printf("\tInterest rate on this loan is %11.4f %% \n",l);
myret();
}
FVMP()
{
double rd, ir, t, i, fv;
int py, m, y;
rd = finput("\tAmount of regular deposit ");
py = iinput("\tNumber of deposits per year ");
m = iinput("\tTotal number of months ");
y = m / 12;
ir = finput("\tNominal interest rate ");
i = ir / py / 100.0;
t = pow((float)(1+i),(float)(py*y));
t--;
t /= i;
fv = rd * t;
fprintf(stdout,"\tFuture value = $%11.2f \n",fv);
fflush(stdout);
myret();
}
NEIR()
{
double fv, pv, nr, er;
int np, py;
fv = finput("\tFuture value $");
pv = finput("\tPresent value $");
np = iinput("\tTotal number of periods ");
py = iinput("\tNumber of periods per year ");
nr = (py * (pow((float)(fv / pv), (float)(1 / (float)np))) - py) *100.0;
er = (pow((float)(fv / pv) , (float)(py / (float)np)) - 1) * 100.0;
fprintf(stdout,"\tNominal rate = %8.4f %%\n",nr);
fprintf(stdout,"\tEffective rate = %8.4f %%\n",er);
fflush(stdout);
myret();
}
CIR()
{
double fv, pv, i, pd;
int y, m, d, py;
fv = finput("\tFuture value $");
pv = finput("\tPresent value $");
py = iinput("\tNumber of periods per year ");
y = iinput("\tNumber of years ");
m = iinput("\tNumber of months ");
d = iinput("\tNumber of days ");
pd = y*py+m*py/12+d*py/365;
i = (pow((float)(fv / pv), (float)(1.0/pd)) - 1) * 100 * py;
fprintf(stdout,"\tAnnual interest rate = %8.4f %%\n",i);
fflush(stdout);
myret();
}
SIR()
{
fprintf(stdout,"Not Currently available\n");
fflush(stdout);
myret();
}
FVPS()
{
double p, r, i, t, a, s, f;
int m, n, k;
p = finput("\tPresent sum $");
r = finput("\tAnnual interest rate ");
m = iinput("\tNumber of periods per year ");
n = iinput("\tNumber of periods to maturity ");
i = r / (float)m;
i /= 100.0;
t = i + 1.0;
a = t;
if (n != 1)
for(k = 1; k <= n-1; k++)
{
s = a * t;
a = s;
}
f = p * a;
fprintf(stdout,"\tFuture value = $%11.2f \n",f);
fflush(stdout);
myret();
}
PVFS()
{
double f, r, i, t, a, s, p;
int m, n, x;
f = finput("\tFuture sum $");
r = finput("\tAnnual interest rate ");
m = iinput("\tNumber of periods per year ");
n = iinput("\tTotal number of periods ");
i = r / (float)m;
i /= 100.0;
t = 1.0 + i;
a = t;
if(n != 1)
for(x = 1; x <= n-1; x++);
{
s = a * t;
a = s;
}
p = f / a;
fprintf(stdout,"\tPresent value = $%11.2f\n",p);
fflush(stdout);
myret();
}
AMORT()
{
double b,k,t,p,l,r,m,ay,at,a;
double finput();
int yr, c, L, z;
char chr, prtflg;
FILE *printer, *fopen();
c = yr = 0;
p = finput("\tPrincipal Amount ");
L = iinput("\tNumber of months ");
r = finput("\tAnnual interest rate (ie 15.0 or 8.8) ");
m = finput("\tPayment, if known ");
while(c < 1 || c > 12)
c = iinput("\tPayment starts on month number ");
while(yr < 1 || yr > 3000)
yr = iinput("\tYear payments start ");
c--;
yr--;
fprintf(stdout,"Print schedule on printer? (y,n)");
fflush(stdout);
iniline();
prtflg = getchar();
resetline();
if(prtflg == 'Y' || prtflg == 'y')
{
printer = fopen("/dev/lp","w");
fflush(printer);
}
else
printer = stdout;
l = r / 1200.0;
t = 1.00 - (1.00 / pow((float)(1+l), (float)L));
k = p;
if (m == 0.0)
m = p * l / t;
amorthead(printer);
at = ay = 0.0;
for (z = 0; z < L; z++)
{
if (c >= 12)
{
yr++;
fprintf(printer,"\nYear of loan: %d\n",yr);
fprintf(printer,"\t$%11.2f for %d months at %11.2f %% \n",k,L,r);
at = at + ay;
fprintf(printer,"\tTotal interest paid during year --> $%11.2f\n\n",ay);
fflush(printer);
if (prtflg != 'Y' && prtflg != 'y')
{
printf("\n\tPress return to continue, 'q' to end ");
fflush(stdout);
iniline();
chr = getchar();
resetline();
if (chr == 'q')
return(0);
}
ay = 0.0;
c = 0;
amorthead(printer);
}
a = p * l;
b = m - a;
p = p - b;
ay = ay + a;
fprintf(printer,"%s %03d %11.2f %11.2f %11.2f %11.2f\n"
,mnths[c],z+1,p,m,b,a);
fflush(printer);
if (p > 0.0)
c++;
else
break;
}
fprintf(printer,"\n\nYear of loan: %d\n",yr+1);
fprintf(printer,"\t$%11.2f for %d months at %11.2f %%\n",k,L,r);
fprintf(printer,"\tTotal interest paid during year --> $%11.2f\n",ay);
at = at + ay;
fprintf(printer,"\tTotal interest paid during loan --> $%11.2f\n",at);
fflush(printer);
myret();
if(prtflg == 'Y' || prtflg == 'y')
fclose(printer);
}
amorthead(printer)
FILE *printer;
{
if(printer != stderr)
fprintf(printer,""); /* A bleedin' form feed.... */
else
clear();
fprintf(printer," PAYMENT REMAINING MONTHLY PRINCIPAL INTEREST\n");
fprintf(printer,"MNTH NUMBER PRINCIPAL PAYMENT PAYMENT PAYMENT\n");
fflush(printer);
}
iniline()
{
struct sgttyb ntsgb;
if(isatty(fileno(stdin)))
{
ioctl(fileno(stdin), TIOCGETP, &otsgb);
ntsgb = otsgb;
ntsgb.sg_flags |= CBREAK;
ioctl(fileno(stdin), TIOCSETP, &ntsgb);
}
}
resetline()
{
if(isatty(fileno(stdin)))
{
ioctl(fileno(stdin), TIOCSETP, &otsgb);
}
}
myret()
{
fprintf(stdout,"\n\tPress RETURN to continue");
fflush(stdout);
iniline();
getchar();
resetline();
}
char PC;
short ospeed;
int numlines;
char *clr;
char clbuf[20]; /* contains 'cl' sequence */
clear_init()
{
char *tgetstr();
char *getenv();
char *buffer; /* termcap info */
char *pbp; /* contains pad character */
char *malloc();
char *cbp = clbuf; /* contains 'cl' sequence */
pbp = malloc(20); /* we're screwed anyway so don't bother */
buffer = malloc(1024); /* to look at what was returned? */
ospeed = otsgb.sg_ospeed; /* was set in iniline routine */
tgetent(buffer, getenv("TERM")); /* get entry from /etc/termcap */
clr = tgetstr("pc", &pbp); /* get pad character */
PC = (*clr ? *clr : 0); /* NULL or actual character */
clr = tgetstr("cl", &cbp); /* get clear sequence */
numlines = tgetnum("li"); /* get number of lines on screen */
free(pbp);
free(buffer);
}
#undef putchar
int putchar();
clear()
{
if (clr)
tputs(clr, numlines, putchar);
printf("\n"); /* What the heck */
}
More information about the Comp.sources.unix
mailing list