// // Example 5.19. This program computes the amount of money in // the bank after a certain number of years. It also computes // how many years it would take to arrive at a given amount. // The bank compounds interest annually. // #include #include #include "money.h" money ReadPrincipal(void); float ReadRate(void); int main(void) { int menu(void); // prototypes void FindAmount(void); void FindYears(void); void error(int choice); int choice; // menu choice choice = menu(); switch (choice) { case 1: FindAmount(); break; case 2: FindYears(); break; default: error(choice); } return 0; } // // This function prints a menu of choices, reads and // returns the user's integer choice, 1 or 2; all other // choices are in error. // Pre: none // Post: Function has returned user's choice from the menu. // int menu(void) { int choice; // menu choice cout << "This program makes savings computations for an\n"; cout << "account with interest compounded annually, quarterly, monthly, \n"; cout << "or continueously. It will\n"; cout << "ask you the one-time deposit amount and the annual\n"; cout << "interest rate. You have two choices: Given a number\n"; cout << "of years, the program will return the final amount;\n"; cout << "given a final amount, the program will tell the\n"; cout << "number of years you must leave the money in the bank.\n\n"; cout << "Choose from the following:\n\n"; cout << "1. Given a number of years, calculate amount\n"; cout << "2. Given a desired amount, calculate years\n\n"; cout << "Your choice: "; cin >> choice; return choice; } // // This function obtains principal, interest rate, and years of // deposit; determines if an input error occurs; and if // not, calculates and prints final amount. // amount = principal * (1 + rate)^years // Pre: none // Post: If no errors, final amount has been displayed. // void FindAmount(void) { int ReadYears(void); // prototype float rate; // interest rate int years; // number of years in bank money principal, // object for original deposit ZeroDollars; // object representing $0.00 principal = ReadPrincipal(); rate = ReadRate(); years = ReadYears(); if (principal.LessThan(ZeroDollars) || principal.EqualTo(ZeroDollars) || (rate <= 0) || (years <= 0) ) //error cout << "\nInvalid input. Run program again.\n"; else { // compounding formular: A = P(1+r/n)^{nt} // A: yield // P: principal // r: rate // n: compound frequency in a year // t: term in years // when compounding continuesouly, n approaches infinity // A = P e^{rt} money p1, p2, p3; p1.AddTo(principal); p2.AddTo(principal); p3.AddTo(principal); principal.MultiplyBy(pow(1 + rate, years)); cout << "\nYou will have $"; principal.display(); cout << " in the bank.\n"; cout << "\nIf the interest is compounded monthly\n"; cout << "You will have $"; p1.MultiplyBy(pow(1 + rate/12.0, years*12.0)); p1.display(); cout << " in the bank.\n"; cout << "\nIf the interest is compounded quarterly\n"; cout << "You will have $"; p2.MultiplyBy(pow(1 + rate/4.0, years*4.0)); p2.display(); cout << " in the bank.\n"; cout << "\nIf the interest is compounded continueously\n"; cout << "You will have $"; p3.MultiplyBy(exp(rate*years)); p3.display(); cout << " in the bank.\n"; } } // // This function obtains principal, interest rate, and amount // desired; determines if an input error occurs; and if // not, calculates and prints number of years needed. // years = smallest integer greater than or equal to // log(amount/principal)/log(1 + rate) // Pre: none // Post: The number of years needed or an error message // has been displayed. // void FindYears(void) { money ReadAmount(void); // prototype float rate; // interest rate int years; // number of years in bank money amount, // final amount in bank principal, // original deposit ZeroDollars; // object representing $0.00 principal = ReadPrincipal(); rate = ReadRate(); amount = ReadAmount(); if ((!principal.LessThan(amount)) || principal.EqualTo(ZeroDollars) || principal.LessThan(ZeroDollars) || (rate <= 0)) //error cout << "\nInvalid input. Run program again\n"; else { years = (int)ceil(log(amount.quotient(principal)) / log(1 + rate)); cout << "\nYou will need the account for " << years << " years.\n"; } } // // This function reads and returns principal // Pre: none // Post: The money object for the principal was returned. // money ReadPrincipal(void) { double deposit; // principal as a double cout << "\nGive the original deposit: "; cin >> deposit; money principal(deposit); // original deposit object return principal; } // // This function reads and returns interest rate, -1 in // case of error // Pre: none // Post: Floating point interest rate has been returned, -1 // in case of error. // float ReadRate(void) { float rate; // interest rate cout << "Give the interest rate as a decimal number\n"; cout << " For example, for 6.25% type 0.0625: "; cin >> rate; if ((rate <= 0.0) || (rate >= 0.2)) // error rate = -1; return rate; } // // This function reads and returns years of deposit // Pre: none // Post: Years of deposit have been returned. // int ReadYears(void) { int years; // number of years in bank cout << "Number of years to leave in bank: "; cin >> years; return years; } // // This function reads and returns the amount desired // Pre: none // Post: The money object for the amount desired was returned. // money ReadAmount(void) { double desired; // amount desired cout << "Give the amount desired: "; cin >> desired; money amount(desired); // object for amount desired return amount; } // // This function prints an error message for an invalid // menu choice // Pre: choice has an invalid value. // Post: Error message is displayed. // void error(int choice) { cout << choice << " is an invalid choice. Please run again.\n"; }