2
3
4
5
6
7
8
17char month[12][4] = {
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
18 "Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"};
26 double year_total_interest;
30int main(
int argc,
char **argv) {
31 setlocale(LC_NUMERIC,
"");
33 ((strcmp(argv[1],
"--help") == 0 || strcmp(argv[1],
"-h") == 0) ||
35 printf(
"Usage: amort [present_value][number_of_payments]"
36 "[interest_rate][payment_amount][yyyy-mm-dd]\n\n");
40 Amort *amort = malloc(
sizeof(Amort));
41 sscanf(argv[1],
"%lf", &amort->pv);
42 sscanf(argv[2],
"%lf", &amort->n);
43 sscanf(argv[3],
"%lf", &amort->i);
44 sscanf(argv[4],
"%lf", &amort->pmt);
45 if (amort->pv == 0 || amort->n == 0 || amort->i == 0 || amort->pmt == 0 ||
47 fprintf(stderr,
"Error: All arguments must be non-zero.\n");
50 amort->interest = amort->pv * amort->i / 1200;
51 if (amort->interest > amort->pmt) {
52 fprintf(stderr,
"Error: Payment amount less than interest\n");
55 memset(&tm, 0,
sizeof(tm));
56 if (strptime(argv[5],
"%Y-%m-%d", &tm) == NULL)
57 if (strptime(argv[5],
"%Y%m%d", &tm) == NULL)
58 printf(
"Error: Invalid date format. Use yyyy-mm-dd or yyyymmdd.\n"),
60 amort->year_total_interest = 0;
62 printf(
"First Payment: %04d-%02d-%02d\n\n", tm.tm_year + 1900,
63 tm.tm_mon + 1, tm.tm_mday);
64 printf(
" Per Mth Year Balance Payment Principal Interest\n");
65 printf(
"---- --- ---- ------------ ---------- ---------- ----------\n");
67 for (
int x = 0; x < amort->n; x++) {
70 m = (x + tm.tm_mon) % 12;
71 int y = ((x + tm.tm_mon) / 12) + tm.tm_year + 1900;
72 amort->interest = amort->pv * amort->i / 1200;
73 amort->year_total_interest += amort->interest;
74 if (amort->pv + amort->interest < amort->pmt) {
75 amort->pmt = amort->pv + amort->interest;
76 amort->principal = amort->pv;
78 amort->principal = amort->pmt - amort->interest;
79 amort->pv -= amort->principal;
80 printf(
"%4d %4s %4d %'12.2f %'10.2f %'10.2f %'10.2f\n", x + 1,
month[m],
81 y, amort->pv, amort->pmt, amort->principal, amort->interest);
94 amort->year_total_interest);
97 amort->year_total_interest = 0;
int main(int argc, char **argv)
Capture the current terminal settings for later restoration.
void print_totals(Amort *)