Исходный код BUDGET4...368
Исходный код программы BUDGET4 практически идентичен коду BUDGET3.
/* BUDGET4.CPP — в этой версии используется */
/* шаблон класса LinkedList */
//
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std ;
#include "LinkedList.h"
/* Account — абстрактный класс, включающий */
/* общие свойства различных счетов */
class Account ;
template class LinkedList< Account > ;
template class Node< Account > ;
class Account
{
public :
Account::Account( LinkedList< Account >* pList ,
unsigned accNo )
{
/* Инициализация данных-членов */
_________________
368 стр. Часть 6. Великолепная десятка
accountNumber = accNo ;
balance = 0 ;
/* Внесение в список */
pNode = new Node< Account >( pList , this ) ;
pList -> addNode( pNode ) ;
count++ ;
}
/* Функции доступа */
int accountNo( ) { return accountNumber ; }
double acntBalance( ) { return balance ; }
static int noAccounts( ) { return count ; }
static Account* first( LinkedList< Account >* pLinkedList )
{
Node< Account >* pNode = pLinkedList -> firstNode( ) ;
return pNode -> current( ) ;
}
Account* next( )
{
Node< Account >* pNextNode = pNode -> next( ) ;
return pNextNode -> current( ) ;
}
/* Функции транзакций */
void deposit( double amount ) { balance += amount ; }
virtual bool withdrawal( double amount )
{
if ( balance < amount )
{
cout << "Недостаточно денег: на счету " << balance
<< ", снимаем " << amount
<< endl ;
return false ;
}
balance -= amount ;
return true ;
}
/* Функция вывода на экран */
void display( )
{
cout << type( )
<< " счёт " << accountNumber
<< " = " << balance
<< endl ;
}
virtual char* type( ) = 0 ;
protected :
Node< Account >* pNode ;
static int count ; /* Количество счетов */
unsigned accountNumber ;
double balance ;
} ;
_________________
369 стр. Глава 31. Программа BUDGET
/* Переменная для сбора статистики */
int Account::count = 0 ;
/* Checking — свойства, уникальные для чекового счёта */
class Checking : public Account
{
public :
Checking::Checking( LinkedList< Account >* pLL ,
unsigned accNo ) :
Account( pLL , accNo )
{ }
/* Перегрузка чисто виртуальных функций */
virtual bool withdrawal( double amount ) ;
virtual char* type( ) { return "Чековый" ; }
} ;
/* withdrawal — перегрузка Account::withdrawal( ) */
bool Checking::withdrawal( double amount )
{
bool success = Account::withdrawal ( amount ) ;
if ( success && balance < 500.00 )
{
balance -= 0.20 ;
}
return success ;
}
/* Savings — свойства, уникальные для сберегательного счёта */
class Savings : public Account
{
public :
Savings::Savings( LinkedList< Account >* pLL ,
unsigned accNo ) :
Account( pLL , accNo )
{ noWithdrawals = 0 ; }
/* Функции транзакций */
virtual bool withdrawal( double amount ) ;
virtual char* type( ) { return "Savings" ; }
protected :
int noWithdrawals ;
} ;
/* withdrawal — перегрузка Account::withdrawal( ) */
bool Savings::withdrawal( double amount )
{
if ( ++noWithdrawals > 1 )
{
balance -= 5.00 ;
}
return Account::withdrawal( amount ) ;
}
_________________
370 стр. Часть 6. Великолепная десятка
/* Прототипы функций */
unsigned getAccntNo( ) ;
void process( Account* pAccount ) ;
void getAccounts( LinkedList< Account >* pLinkedList ) ;
void displayResults( LinkedList< Account >* pLinkedList ) ;
/* main — собирает и выводит данные */
int main( int argcs , char* pArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */
/* Создание связанного списка */
LinkedList< Account > linkedList ;
/* Чтение пользовательского ввода */
getAccounts( &linkedList ) ;
/* Вывод связанного списка */
displayResults( &linkedList ) ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
/* getAccounts — загрузка массива счетов */
void getAccounts( LinkedList< Account >* pLinkedList )
{
Account* pA ;
/* Цикл, пока не введено 'X' или 'х' */
char accountType ; /* S or С */
while ( true )
{
cout << "Введите S для сберегательного счёта, "
<< "С для чекового, X для выхода: " ;
cin >> accountType ;
switch ( accountType )
{
case 'c' :
case 'C' :
pA = new Checking( pLinkedList , getAccntNo( ) ) ;
break ;
case 's' :
case 'S' :
pA = new Savings( pLinkedList , getAccntNo( ) ) ;
break ;
case 'x' :
case 'X' :
return ;
default :
cout << "Неверный ввод. " ;
}
_________________
371 стр. Глава 31. Программа BUDGET
/* Обработка вновь созданного объекта */
process( pA ) ;
}
}
/* displayResults — вывод информации о */
/* счетах в связанном списке */
void displayResults( LinkedList< Account >* pLinkedList )
{
double total = 0.0 ;
cout << " Итоговая информация: " ;
for ( Node< Account >* pN = pLinkedList -> firstNode( ) ;
pN != 0 ;
pN = pN -> next( ) )
{
Account* pA = pN -> current( ) ;
pA -> display( ) ;
total += pA -> acntBalance( ) ;
}
cout << "Итого = " << total << " " ;
}
/* getAccntNo — номер счёта для его создания */
unsigned getAccntNo( )
{
unsigned accntNo ;
cout << "Введите номер счёта: " ;
cin >> accntNo ;
return accntNo ;
}
/* process( Account ) — обработка счёта */
void process( Account* pAccount )
{
cout << "Введите положительное число для вклада, "
<< "отрицательное для снятия,"
<< " 0 для завершения работы " ;
double transaction ;
do
{
cout << " : " ;
cin >> transaction ;
// Вклад
if ( transaction > 0 )
{
pAccount -> deposit( transaction ) ;
}
// Снятие
if ( transaction < 0 )
{
pAccount -> withdrawal( -transaction ) ;
}
} while ( transaction != 0 ) ;
}
_________________
372 стр. Часть 6. Великолепная десятка
Первые строки перед определением класса Account инстанцируют шаблоны классов LinkedList и Node в классы LinkedList< Node > и Node< Account > соответственно. Эти строки создают классы, необходимые для объединения объектов Account в связанный список.
Другая программа может с тем же успехом создать класс LinkedList< Student >, LinkedList< Name >, или другой придуманный вами класс.
Класс Account работает так же, как и в предыдущей программе BUDGET3.
Больше книг — больше знаний!
Заберите 20% скидку на все книги Литрес с нашим промокодом
ПОЛУЧИТЬ СКИДКУ