|  | @@ -0,0 +1,133 @@
 | 
	
		
			
				|  |  | +// brass.cpp -- bank account class methods
 | 
	
		
			
				|  |  | +#include <iostream>
 | 
	
		
			
				|  |  | +#include "brass.h"
 | 
	
		
			
				|  |  | +using std::cout;
 | 
	
		
			
				|  |  | +using std::endl;
 | 
	
		
			
				|  |  | +using std::string;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// formatting stuff
 | 
	
		
			
				|  |  | +typedef std::ios_base::fmtflags format;
 | 
	
		
			
				|  |  | +typedef std::streamsize precis;
 | 
	
		
			
				|  |  | +format setFormat();
 | 
	
		
			
				|  |  | +void restore(format f, precis p);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// Brass methods
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Brass::Brass(const string & s, long an, double bal)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    fullName = s;
 | 
	
		
			
				|  |  | +    acctNum = an;
 | 
	
		
			
				|  |  | +    balance = bal;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void Brass::Deposit(double amt)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    if (amt < 0)
 | 
	
		
			
				|  |  | +        cout << "Negative deposit not allowed; "
 | 
	
		
			
				|  |  | +             << "deposit is cancelled.\n";
 | 
	
		
			
				|  |  | +    else
 | 
	
		
			
				|  |  | +        balance += amt;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void Brass::Withdraw(double amt)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    // set up ###.## format
 | 
	
		
			
				|  |  | +    format initialState = setFormat();
 | 
	
		
			
				|  |  | +    precis prec = cout.precision(2);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (amt < 0)
 | 
	
		
			
				|  |  | +        cout << "Withdrawal amount must be positive; "
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +             << "withdrawal canceled.\n";
 | 
	
		
			
				|  |  | +    else if (amt <= balance)
 | 
	
		
			
				|  |  | +        balance -= amt;
 | 
	
		
			
				|  |  | +    else
 | 
	
		
			
				|  |  | +        cout << "Withdrawal amount of $" << amt
 | 
	
		
			
				|  |  | +             << " exceeds your balance.\n"
 | 
	
		
			
				|  |  | +             << "Withdrawal canceled.\n";
 | 
	
		
			
				|  |  | +    restore(initialState, prec);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +double Brass::Balance() const
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    return balance;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void Brass::ViewAcct() const
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +     // set up ###.## format
 | 
	
		
			
				|  |  | +    format initialState = setFormat();
 | 
	
		
			
				|  |  | +    precis prec = cout.precision(2);
 | 
	
		
			
				|  |  | +    cout << "Client: " << fullName << endl;
 | 
	
		
			
				|  |  | +    cout << "Account Number: " << acctNum << endl;
 | 
	
		
			
				|  |  | +    cout << "Balance: $" << balance << endl;
 | 
	
		
			
				|  |  | +    restore(initialState, prec); // Restore original format
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// BrassPlus Methods
 | 
	
		
			
				|  |  | +BrassPlus::BrassPlus(const string & s, long an, double bal,
 | 
	
		
			
				|  |  | +           double ml, double r) : Brass(s, an, bal)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    maxLoan = ml;
 | 
	
		
			
				|  |  | +    owesBank = 0.0;
 | 
	
		
			
				|  |  | +    rate = r;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +BrassPlus::BrassPlus(const Brass & ba, double ml, double r)
 | 
	
		
			
				|  |  | +           : Brass(ba)   // uses implicit copy constructor
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    maxLoan = ml;
 | 
	
		
			
				|  |  | +    owesBank = 0.0;
 | 
	
		
			
				|  |  | +    rate = r;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// redefine how ViewAcct() works
 | 
	
		
			
				|  |  | +void BrassPlus::ViewAcct() const
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    // set up ###.## format
 | 
	
		
			
				|  |  | +    format initialState = setFormat();
 | 
	
		
			
				|  |  | +    precis prec = cout.precision(2);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    Brass::ViewAcct();   // display base portion
 | 
	
		
			
				|  |  | +    cout << "Maximum loan: $" << maxLoan << endl;
 | 
	
		
			
				|  |  | +    cout << "Owed to bank: $" << owesBank << endl;
 | 
	
		
			
				|  |  | +    cout.precision(3);  // ###.### format
 | 
	
		
			
				|  |  | +    cout << "Loan Rate: " << 100 * rate << "%\n";
 | 
	
		
			
				|  |  | +    restore(initialState, prec); 
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// redefine how Withdraw() works
 | 
	
		
			
				|  |  | +void BrassPlus::Withdraw(double amt)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    // set up ###.## format
 | 
	
		
			
				|  |  | +    format initialState = setFormat();
 | 
	
		
			
				|  |  | +    precis prec = cout.precision(2);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    double bal = Balance();
 | 
	
		
			
				|  |  | +    if (amt <= bal)
 | 
	
		
			
				|  |  | +        Brass::Withdraw(amt);
 | 
	
		
			
				|  |  | +    else if ( amt <= bal + maxLoan - owesBank)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        double advance = amt - bal;
 | 
	
		
			
				|  |  | +        owesBank += advance * (1.0 + rate);
 | 
	
		
			
				|  |  | +        cout << "Bank advance: $" << advance << endl;
 | 
	
		
			
				|  |  | +        cout << "Finance charge: $" << advance * rate << endl;
 | 
	
		
			
				|  |  | +        Deposit(advance);
 | 
	
		
			
				|  |  | +        Brass::Withdraw(amt);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    else
 | 
	
		
			
				|  |  | +        cout << "Credit limit exceeded. Transaction cancelled.\n";
 | 
	
		
			
				|  |  | +    restore(initialState, prec); 
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +format setFormat()
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    // set up ###.## format
 | 
	
		
			
				|  |  | +    return cout.setf(std::ios_base::fixed, 
 | 
	
		
			
				|  |  | +                std::ios_base::floatfield);
 | 
	
		
			
				|  |  | +} 
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void restore(format f, precis p)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    cout.setf(f, std::ios_base::floatfield);
 | 
	
		
			
				|  |  | +    cout.precision(p);
 | 
	
		
			
				|  |  | +}
 |