134 lines
3.3 KiB
C++
134 lines
3.3 KiB
C++
// 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);
|
|
}
|