[ Атас! ]
В программе будет решаться задача по представлению счетов в том виде, какой они имеют в банке. Эта простая программа будет поддерживать возможности вклада ( это хорошо ) и снятия денег со счёта ( это ещё лучше ). ( Первоначальная версия работала только с одним типом банковского счёта. ) Эта версия поддерживает два типа счетов, каждый из которых будет иметь собственные, несколько отличные от другого счёта правила.
Чековый счёт:
■■■
■ удерживать 20 центов за каждый обработанный чек, если баланс падает ниже 500 долларов;
■ не удерживать 20 центов, если баланс больше 500 долларов.
■■■
Сберегательный счёт:
■■■
■ не удерживать денег при первом снятии со счёта за месяц;
■ удерживать 5 долларов за каждое последующее снятие.
■■■
Рассматривая эту задачу, можно сразу отметить, что главными кандидатами на роль классов являются Checking и Savings . Поскольку данные-члены лучше сделать защищёнными, нам понадобится несколько функций, обеспечивающих доступ к номеру и балансу счёта.
Как и любой класс, Checking и Savings нуждаются в конструкторе, чтобы проинициализировать объекты правильными значениями ( как минимум, обнулить баланс ). Кроме того, понадобятся ещё две функции — deposit( ) ( вклад ) и withdrawal( ) ( снятие ).
И наконец, в этой программе я добавил ещё одну функцию-член, которая называется display( ) ; она отображает текущий объект. Это необязательное требование, однако обычно так и поступают, позволяя объекту самому заниматься своим отображением, не полагаясь на внешнюю функцию ( которой для правильного отображения могут понадобиться сведения о внутреннем устройстве класса или другая информация, которую вы, возможно, не захотите открывать ).
Вот текст этой программы:
/* BUDGET2.CPP — программа бюджета, основанная на классах */
#include
#include
#include
_________________
348 стр. Часть 6. Великолепная десятка
using namespace std ;
/* Максимальное количество счетов */
const int maxAccounts = 10 ;
/* Checking — здесь описан чековый счёт */
class Checking
{
public :
Checking( int initializeAN = 0 )
:accountNumber( initializeAN ) , balance( 0.0 ){ }
/* Функции обращения */
int accountNo( )
{
return accountNumber ;
}
double acntBalance( )
{
return balance ;
}
/* Функции транзакций */
void deposit( double amount )
{
balance += amount ;
}
void withdrawal( double amount ) ;
/* Функция вывода объекта в cout */
void display( )
{
cout << "Счёт " << accountNumber
<< " = " << balance
<< "\n" ;
}
protected :
unsigned accountNumber ;
double balance ;
} ;
/* withdrawal — эта функция-член слишком */
/* велика для inline-функции */
void Checking::withdrawal( double amount )
{
if ( balance < amount )
{
cout << "Недостаточно денег: баланс равен "
<< balance
<< ", сумма чека равна " << amount
<< "\n" ;
}
else
{
balance -= amount ;
/* Если баланс падает слишком низко... */
if ( balance < 500.00 )
{
_________________
349 стр. Глава 31. Программа BUDGET
/* ...удержать деньги за обслуживание */
balance -= 0.20 ;
}
}
}
/* Savings — вы и сами можете написать этот класс */
class Savings
{
public :
Savings( int initialAN = 0 )
: accountNumber( initialAN ) ,
balance( 0.0 ) , noWithdrawals( 0 ) { }
/* функции обращения */
int accountNo( )
{
return accountNumber ;
}
double acntBalance( )
{
return balance ;
}
/* функции транзакций */
void deposit( double amount )
{
balance += amount ;
}
void withdrawal( double amount ) ;
/* Функция display — отображает объект */
void display( )
{
cout << "Счёт " << accountNumber
<< " = " << balance
<< " ( номер снятия = "
<< noWithdrawals
<< " )\n" ;
}
protected :
unsigned accountNumber ;
double balance ;
int noWithdrawals ;
} ;
void Savings::withdrawal( double amount )
{
if ( balance < amount )
{
cout << "Недостаточно денег на счёте: "
<< "баланс равен " << balance
<< ", снимается " << amount
<< "\n" ;
}
else
{
/* После первого в месяце снятия денег... */
_________________
350 стр. Часть 6. Великолепная десятка
if ( ++noWithdrawals > 1 )
{
/* ...удерживать $5 */
balance -= 5.00 ;
}
/* Снять деньги */
Читать дальше