home *** CD-ROM | disk | FTP | other *** search
/ C++ for Dummies (3rd Edition) / C_FD.iso / CHAP26 / BUDGET6.CPP next >
C/C++ Source or Header  |  1996-09-02  |  6KB  |  254 lines

  1. //BUDGET6.CPP - Budget program using a template container
  2. //              class to hold the account objects rather
  3. //              than embed that information into the class.
  4.  
  5. #include <iostream.h>
  6. #include <stdlib.h>
  7. #include <ctype.h>
  8.  
  9. // use the template class SLL
  10. #include "sll.h"
  11.  
  12. //Account - this abstract class incorporates properties
  13. //          common to both account types Checking and
  14. //          Savings; however, it's missing the concept
  15. //          withdrawal() which is different between the two
  16. class Account
  17. {
  18.   protected:
  19.     Account(Account &c)
  20.     {
  21.         throw "No creating funds\n";
  22.     }
  23.  
  24.   public:
  25.     Account(unsigned accNo, float initialBalance = 0.0F);
  26.  
  27.     //access functions
  28.     int accountNo()
  29.     {
  30.         return accountNumber;
  31.     }
  32.     float acntBalance()
  33.     {
  34.         return balance;
  35.     }
  36.  
  37.     //transaction functions
  38.     void deposit(float amount)
  39.     {
  40.         balance += amount;
  41.     }
  42.     virtual void withdrawal(float amount) = 0;
  43.  
  44.     //display function for displaying self on 'cout'
  45.     void display()
  46.     {
  47.         cout << "Account " << accountNumber
  48.              << " = "      << balance
  49.              << "\n";
  50.      }
  51.  
  52.   protected:
  53.     unsigned   accountNumber;
  54.     float      balance;
  55. };
  56.  
  57. Account::Account(unsigned accNo, float initialBalance)
  58. {
  59.     accountNumber = accNo;
  60.     balance = initialBalance;
  61. }
  62.  
  63. //Checking - this class contains properties unique to
  64. //           checking accounts.  Not much left is there?
  65. class Checking : public Account
  66. {
  67.   public:
  68.     //here the constructor defined inline
  69.     Checking(unsigned accNo, float initialBalance = 0.0F) :
  70.              Account(accNo, initialBalance)
  71.     {
  72.     }
  73.  
  74.     //overload pure virtual functions
  75.     virtual void withdrawal(float amount);
  76. };
  77.  
  78. void Checking::withdrawal(float amount)
  79. {
  80.     if (balance < amount )
  81.     {
  82.         cout << "Insufficient funds: balance " << balance
  83.              << ", check "                     << amount
  84.              << "\n";
  85.     }
  86.     else
  87.     {
  88.         balance -= amount;
  89.  
  90.         //if balance falls too low, charge service fee
  91.         if (balance < 500.00F)
  92.         {
  93.             balance -= 0.20F;
  94.         }
  95.     }
  96. }
  97.  
  98.  
  99. //Savings - same story as Checking except that it also
  100. //          has a unique data member
  101. class Savings : public Account
  102. {
  103.   public:
  104.     //here constructor defined as separate function
  105.     //just to show you the difference
  106.     Savings(unsigned accNo, float initialBalance = 0.0F);
  107.  
  108.     //transaction functions
  109.     virtual void withdrawal(float amount);
  110.  
  111.  
  112.   protected:
  113.     int noWithdrawals;
  114. };
  115.  
  116. Savings::Savings(unsigned accNo, float initialBalance) :
  117.    Account(accNo, initialBalance)
  118. {
  119.     noWithdrawals = 0;
  120. }
  121. void Savings::withdrawal(float amount)
  122. {
  123.     if (balance < amount)
  124.     {
  125.         cout << "Insufficient funds: balance " << balance
  126.              << ", withdrawal "                << amount
  127.              << "\n";
  128.     }
  129.     else
  130.     {
  131.         if (++noWithdrawals > 1)
  132.         {
  133.             balance -= 5.00F;
  134.         }
  135.         balance -= amount;
  136.     }
  137. }
  138.  
  139. //prototype declarations
  140. unsigned getAccntNo();
  141. void process(Account &account);
  142.  
  143. //main - accumulate the initial input and output totals
  144. int main()
  145. {
  146.     // loop until someone enters an 'X' or 'x'
  147.     Account *pA;
  148.     char     accountType;     //S or C
  149.  
  150.     try
  151.     {
  152.         // keep the accounts in an account container
  153.         SLL<Account> books;                       // Note 1
  154.  
  155.         unsigned keepLooping = 1;
  156.         while (keepLooping)
  157.         {
  158.             cout << "Enter S for Savings, "
  159.                     "C for Checking, X for exit\n";
  160.             cin  >> accountType;
  161.  
  162.             switch (accountType)
  163.             {
  164.               case 'c':
  165.               case 'C':
  166.                 pA = new Checking(getAccntNo());
  167.                 if (pA == 0)
  168.                 {
  169.                     throw "Out of memory";
  170.                 }
  171.                 process(*pA);
  172.                 books.add(pA);                   // Note 2
  173.                 break;
  174.  
  175.               case 's':
  176.               case 'S':
  177.                 pA = new Savings(getAccntNo());
  178.                 if (pA == 0)
  179.                 {
  180.                      throw "Out of memory";
  181.                 }
  182.                 process(*pA);                    // Note 2
  183.                 books.add(pA);
  184.                 break;
  185.  
  186.               case 'x':
  187.               case 'X':
  188.                 keepLooping = 0;
  189.                 break;
  190.  
  191.              default:
  192.                 cout << "I didn't get that.\n";
  193.            }
  194.         }
  195.  
  196.         //now present totals
  197.         float total = 0.0;
  198.         cout << "Account totals:\n";
  199.                                                      // Note 3
  200.         for (books.reset(); pA = books.current(); books.over())
  201.         {
  202.             pA->display();
  203.             total += pA->acntBalance();
  204.         }
  205.         cout << "Total worth  = " << total << "\n";
  206.     }
  207.  
  208.     // char* exception is a general, internal error
  209.     catch(char* pReason)                               // Note 4
  210.     {
  211.         cout << "Exception: " << pReason << endl;
  212.     }
  213.     catch(...)
  214.     {
  215.         cout << "Unknown exception\n" << endl;
  216.     }
  217.     return 0;
  218. }
  219.  
  220. //getAccntNo - return the account number entered
  221. unsigned getAccntNo()
  222. {
  223.     unsigned accntNo;
  224.     cout << "Enter account number:";
  225.     cin  >> accntNo;
  226.     return accntNo;
  227. }
  228.  
  229. //process(Account) - input the data for an account*/
  230. void process(Account &account)
  231. {
  232.     cout << "Enter positive number for deposit,\n"
  233.             "negative for withdrawal, 0 to terminate";
  234.  
  235.     float transaction;
  236.     do
  237.     {
  238.         cout << ":";
  239.         cin  >> transaction;
  240.  
  241.         //deposit
  242.         if (transaction > 0.0F)
  243.         {
  244.             account.deposit(transaction);
  245.         }
  246.  
  247.         //withdrawal
  248.         if (transaction < 0.0F)
  249.         {
  250.             account.withdrawal(-transaction);
  251.         }
  252.     } while (transaction != 0.0F);
  253. }
  254.