home *** CD-ROM | disk | FTP | other *** search
/ C++ for Dummies (3rd Edition) / C_FD.iso / BUDGETS / BUDGET4.CPP < prev    next >
C/C++ Source or Header  |  1996-09-15  |  8KB  |  368 lines

  1. //BUDGET4.CPP - Budget program with expanded constructors,
  2. //              new (and improved) heap management, and
  3. //              static members. The Checking and Savings
  4. //              classes should have a destructor to remove
  5. //              the object from the list, but the destructors
  6. //              arenÆt included to save space.
  7.  
  8. #include <iostream.h>
  9. #include <stdlib.h>
  10.  
  11. //Checking - this describes checking accounts
  12. class Checking
  13. {
  14.   protected:
  15.    Checking(Checking &c)
  16.    {
  17.       cout << "No creating funds\n";
  18.    }
  19.  
  20.   public:                              //Note 1
  21.    Checking(unsigned accNo, float initialBalance = 0.0F);
  22.  
  23.    //access functions
  24.    int accountNo()
  25.    {
  26.       return accountNumber;
  27.    }
  28.    float acntBalance()
  29.    {
  30.       return balance;
  31.    }
  32.    static Checking *first()
  33.    {
  34.       return pFirst;
  35.    }
  36.    Checking *next()
  37.    {
  38.       return pNext;
  39.    }
  40.    static int noAccounts()
  41.    {
  42.       return count;
  43.    }
  44.  
  45.    //transaction functions
  46.    void deposit(float amount)
  47.    {
  48.       balance += amount;
  49.    }
  50.    void withdrawal(float amount);
  51.  
  52.    //display function for displaying self on æcoutÆ
  53.    void display()
  54.    {
  55.       cout << "Account " << accountNumber
  56.            << " = "      << balance
  57.            << "\n";
  58.    }
  59.  
  60.   protected:
  61.    //keep accounts in a linked list so thereÆs no limit
  62.    static Checking *pFirst;            //Note 2
  63.           Checking *pNext;
  64.  
  65.    static int count;         //number of accounts
  66.    unsigned   accountNumber;
  67.    float      balance;
  68. };
  69.  
  70. //allocate space for statics
  71. Checking *Checking::pFirst = 0;        //Note 3
  72. int       Checking::count  = 0;
  73.  
  74. //define constructor
  75. Checking::Checking(unsigned accNo, float initialBalance)
  76. {
  77.    accountNumber = accNo;
  78.    balance = initialBalance;
  79.  
  80.    //add this to end of list and count it
  81.    count++;
  82.    Checking *pC;
  83.    if (pFirst == 0)                    //Note 4
  84.    {
  85.       pFirst = this;      //empty list; make it first
  86.    }
  87.    else                   //list not empty; look for last
  88.    {
  89.       for (pC = pFirst; pC->pNext; pC = pC->pNext)
  90.       {                   //do nothing (weÆre just looking...
  91.       }                   //...for the last element in the list)
  92.       pC->pNext = this;   //tack us onto end
  93.    }
  94.    pNext = 0;             //weÆre always last
  95. }
  96.  
  97. //withdrawal - now the withdrawal function
  98. void Checking::withdrawal(float amount)
  99. {
  100.    if (balance < amount )
  101.    {
  102.       cout << "Insufficient funds: balance " << balance
  103.            << ", check "                     << amount
  104.            << "\n";
  105.    }
  106.    else
  107.    {
  108.       balance -= amount;
  109.       //if balance falls too low, charge service fee
  110.       if (balance < 500.00F)
  111.       {
  112.          balance -= 0.20F;
  113.       }
  114.    }
  115. }
  116.  
  117. //Savings - you can probably figure this one out
  118. class Savings
  119. {
  120.   protected:
  121.    Savings(Savings &s)
  122.    {
  123.       cout << "No creating funds\n";
  124.    }
  125.  
  126.   public:
  127.    Savings(unsigned accNo, float initialBalance = 0.0F);
  128.  
  129.    //access functions
  130.    int accountNo()
  131.    {
  132.       return accountNumber;
  133.    }
  134.    float acntBalance()
  135.    {
  136.       return balance;
  137.    }
  138.    static Savings *first()
  139.    {
  140.       return pFirst;
  141.    }
  142.    Savings *next()
  143.    {
  144.       return pNext;
  145.    }
  146.    static int noAccounts()
  147.    {
  148.       return count;
  149.    }
  150.  
  151.    //transaction functions
  152.    void deposit(float amount)
  153.    {
  154.       balance += amount;
  155.    }
  156.    void withdrawal(float amount);
  157.  
  158.    //display function - display self to cout
  159.    void display()
  160.    {
  161.       cout << "Account "             << accountNumber
  162.            << " = "                  << balance
  163.            << " (no. withdrawals = " << noWithdrawals
  164.            << ")\n";
  165.    }
  166.  
  167.   protected:
  168.    //keep savings accounts in linked list as well
  169.    static Savings *pFirst;
  170.           Savings *pNext;
  171.  
  172.    static int count;           //number of accounts
  173.    unsigned   accountNumber;
  174.    float      balance;
  175.    int        noWithdrawals;
  176. };
  177.  
  178. //allocate space for statics
  179. Savings *Savings::pFirst = 0;
  180. int      Savings::count  = 0;
  181.  
  182. //define constructor
  183. Savings::Savings(unsigned accNo, float initialBalance)
  184. {
  185.    accountNumber = accNo;
  186.    balance = initialBalance;
  187.    noWithdrawals = 0;
  188.  
  189.    //add this to end of list and count it
  190.    count++;
  191.    Savings* pS;
  192.    if (pFirst == 0)
  193.    {
  194.       pFirst = this;         //empty list; make it first
  195.    }
  196.    else                      //list not empty; look for last
  197.    {
  198.       for (pS = pFirst; pS->pNext; pS = pS->pNext)
  199.       {
  200.       }
  201.       pS->pNext = this;      //make last point to us
  202.    }
  203.    pNext = 0;                //and we point to nothing
  204. }
  205.  
  206. //withdrawal - perform a Savings withdrawal
  207. void Savings::withdrawal(float amount)
  208. {
  209.    if (balance < amount)
  210.    {
  211.       cout << "Insufficient funds: balance " << balance
  212.            << ", withdrawal "                << amount
  213.            << "\n";
  214.    }
  215.    else
  216.    {
  217.       if (++noWithdrawals > 1)
  218.       {
  219.          balance -= 5.00F;
  220.       }
  221.       balance -= amount;
  222.    }
  223. }
  224.  
  225. //prototype declarations
  226. unsigned getAccntNo();
  227. void process(Checking &checking);
  228. void process(Savings &savings);
  229. void outOfMemory();
  230.  
  231. //main - accumulate the initial input and output totals
  232. int main()
  233. {
  234.    /*loop until someone enters an æXÆ or æxÆ*/
  235.    Checking *pC;
  236.    Savings  *pS;
  237.  
  238.    char     accountType;     //S or C
  239.  
  240.    unsigned keepLooping = 1;
  241.    while (keepLooping)
  242.    {
  243.       cout << "Enter S for Savings, "
  244.               "C for Checking, X for exit\n";
  245.       cin  >> accountType;
  246.  
  247.       switch (accountType)
  248.       {
  249.          case 'c':
  250.          case 'C':                     //Note 5
  251.             pC = new Checking(getAccntNo());
  252.             if (pC == 0)
  253.             {
  254.                outOfMemory();
  255.             }
  256.             process(*pC);
  257.             break;
  258.  
  259.          case 's':
  260.          case 'S':                     //Note 5
  261.             pS = new Savings(getAccntNo());
  262.             if (pS == 0)
  263.             {
  264.                outOfMemory();
  265.             }
  266.             process(*pS);
  267.             break;
  268.  
  269.          case 'x':
  270.          case 'X':
  271.             keepLooping = 0;
  272.             break;
  273.  
  274.          default:
  275.             cout << "I didn't get that.\n";
  276.       }
  277.    }
  278.  
  279.    //now present totals
  280.    float chkTotal = 0.0F;
  281.    float svgTotal = 0.0F;
  282.    cout << "Checking accounts:\n";     //Note 6
  283.    for (pC = Checking::first(); pC; pC = pC->next())
  284.    {
  285.       pC->display();
  286.       chkTotal += pC->acntBalance();
  287.    }
  288.    cout << "Savings accounts:\n";      //Note 6
  289.    for (pS = Savings::first(); pS; pS = pS->next())
  290.    {
  291.       pS->display();
  292.       svgTotal += pS->acntBalance();
  293.    }
  294.  
  295.    float total = chkTotal + svgTotal;
  296.    cout << "Total for checking accounts = " << chkTotal << "\n";
  297.    cout << "Total for savings accounts  = " << svgTotal << "\n";
  298.    cout << "Total worth                 = " << total << "\n";
  299.    return 0;
  300. }
  301.  
  302. //getAccntNo - return the account number entered
  303. unsigned getAccntNo()
  304. {
  305.    unsigned accntNo;
  306.    cout << "Enter account number:";
  307.    cin  >> accntNo;
  308.    return accntNo;
  309. }
  310.  
  311. //process(Checking) - input the data for a checking account*/
  312. void process(Checking &checking)
  313. {
  314.    cout << "Enter positive number for deposit,\n"
  315.            "negative for check, 0 to terminate";
  316.  
  317.    float transaction;
  318.    do
  319.    {
  320.       cout << ":";
  321.       cin  >> transaction;
  322.  
  323.       //deposit
  324.       if (transaction > 0.0F)
  325.       {
  326.          checking.deposit(transaction);
  327.       }
  328.  
  329.       //withdrawal
  330.       if (transaction < 0.0F)
  331.       {
  332.          checking.withdrawal(-transaction);
  333.       }
  334.    } while (transaction != 0.0F);
  335. }
  336. //process(Savings) - input the data for a savings account
  337. void process(Savings &savings)
  338. {
  339.    cout << "Enter positive number for deposit,\n"
  340.            "negative for withdrawal, 0 to terminate";
  341.  
  342.    float transaction;
  343.    do
  344.    {
  345.       cout << ":";
  346.       cin  >> transaction;
  347.  
  348.       //deposit
  349.       if (transaction > 0.0F)
  350.       {
  351.          savings.deposit(transaction);
  352.       }
  353.  
  354.       //withdrawal
  355.       if (transaction < 0.0F)
  356.       {
  357.          s