►BUDGET1...343

Главы, составляющие две первые части книги, предоставляют вам достаточно информации для написания собственной нетривиальной программы. Такой программой является рассматриваемая далее программа BUDGET 1.

В этой программе используются концепции С++, рассмотренные в первых двух частях книги. Программа BUDGET моделирует простейший банковский счёт ( в очень упрощённом виде ). Эта программа будет выполнять такие действия:

■■■

■ создавать один или несколько банковских счетов;

■ присваивать уникальный номер каждому счёту;

■ работать со счётом — создание депозита и снятие денег;

■ выводить окончательный баланс всех счетов, после того как пользователь решит выйти из программы.

■■■

Программа имитирует банковские транзакции, подчиняющиеся следующим правилам ( в процессе развития программы к этим правилам будут добавлены и другие ).

■■■

■ Баланс не может быть отрицательным ( каким бы дружественным не был к вам ваш банк, настолько дружественным он быть просто не в состоянии ).

■ Создание депозита не влечёт за собой никаких расходов.

■■■

_________________

343 стр. Глава 31. Программа BUDGET

Вот как выглядит исходный текст данной программы.

    /* BUDGET1.CPP — "Функциональная" программа бюджета */

    #include <cstdio>

    #include <cstdlib>

    #include <iostream>

    using namespace std ;

    /* Максимальное количество счетов */

    const int maxAccounts = 10 ;

    /* Данные, описывающие счёт */

    unsigned accountNumber[ maxAccounts ] ;

    double balance[ maxAccounts ] ;

    /* Прототипы функций */

    void process(  unsigned& accountNumber ,

                  double& balance ) ;

    void init( unsigned* pAccountNumber ,

               double* pBalance ) ;

    /* main — собирает начальные входные данные и выводит конечные суммы */

    int main( int nNumberofArgs , char* pszArgs[ ] )

    {

        setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */

        cout << "Нажмите С для продолжения, X для выхода: " ;

        // Цикл ввода

        int noAccounts = 0 ; /* Количество счетов */

        /* Нельзя создать счетов больше, чем выделено места */

        cout << "Программа создаёт банковские счета " << endl ;

        while ( noAccounts < maxAccounts )

        {

            char transactionType ;

            cout << "С для создания счёта, X для выхода: " ;

            cin >> transactionType ;

            /* Выход, если пользователь ввёл X */

            if ( transactionType == 'x' ||

                 transactionType == 'X' )

            {

                break ;

            }

            /* Если введено С */

            if ( transactionType == 'c' ||

                 transactionType == 'C' )

            {

                /* Инициализация нового счёта */

                init( &accountNumber[ noAccounts ] ,

&balance[ noAccounts ] ) ;

                /* Ввод информации о транзакции */

                process(  accountNumber[ noAccounts ] ,

                         balance[ noAccounts ] ) ;

                /* Увеличение индекса */

_________________

344 стр. Часть 6. Великолепная десятка

                noAccounts++ ;

            }

        }

        double total = 0 ;

        cout << "Информация о счёте " ;

        for ( int i = 0 ; i < noAccounts ; i++ )

        {

            cout << "Баланс счёта "

                  << accountNumber[ i ]

                  << " = "

                  << balance[ i ]

                  << " " ;

            /* Накопление общей информации */

            total += balance[ i ] ;

        }

        // Вывод

        cout << "Баланс по всем счетам = "

             << total

             << " " ;

        /* Пауза для того, чтобы посмотреть на результат работы программы */

        system( "PAUSE" ) ;

        return 0 ;

    }

    /* init — Инициализация счёта путём чтения номера и обнуления баланса */

    void init( unsigned* pAccountNumber ,

               double* pBalance )

    {

        cout << "Введите номер счёта:" ;

        cin >> *pAccountNumber ;

        *pBalance = 0.0 ;

    } 

    /* process — Обновление баланса */

    void process(  unsigned& accountNumber ,

                  double& balance )

    {

        cout << "Введите положительную сумму вклада, "

             << "отрицательную сумму для снятия со счёта "

             << "или нуль для завершения работы "

             << endl ;

        double transaction ;

        do

        {

            cout << ":" ;

            cin >> transaction ;

            // Вклад

            if ( transaction > 0 )

_________________

345 стр. Глава 31. Программа BUDGET

            {

                 /* Добавление на счёт */

                 balance += transaction ;

            }

            /* Снятие со счёта */

            if ( transaction < 0 )

            {

                transaction = -transaction ;

                if ( balance < transaction )

                {

                    cout << "Недостаточно денег: всего"

                         << balance

                         << ", снимаем "

                         << transaction

                         <<" " ;

                }

                else

                {

                    balance -= transaction ;

                }

            }

        } while ( transaction != 0 ) ;

    }

Демонстрация работы данной программы:

    Нажмите С для продолжения, X для выхода:

    Программа создаёт банковские счета

    С для создания счёта, X для выхода: С

    Введите номер счёта: 1234

    Введите положительную сумму вклада,

    отрицательную сумму для снятия со счёта

    или нуль для завершения работы

    : 200

    : -100

    : -200

    Недостаточно денег: всего 100 , снимаем 200

    : 0

    С для создания счёта, X для выхода: с

    Введите номер счёта: 2345

    Введите положительную сумму вклада,

    отрицательную сумму для снятия со счёта

    или нуль для завершения работы

    : 200

    : -50

    : -50

    : 0

    С для создания счёта, X для выхода: х

    Информация о счёте

    Баланс счёта 1234 = 100

    Баланс счёта 2345 = 100

    Баланс по всем счетам = 200

    Press any key to continue...

_________________

346 стр. Часть 6. Великолепная десятка

Разберёмся в том, как работает BUDGET. В этой программе было создано два массива, один из которых содержит номера счетов, а второй — балансы. Эти массивы синхронизированы таким образом, что элемент balance[ n ] содержит баланс счёта с номером из accountNumber[ n ], независимо от значения n. В связи с ограничением длины массива количество счетов, содержащихся в программе, не может превышать MAXACCOUNTS.

Главная программа разделена на две части: первая отвечает за сбор информации ( в ней происходит считывание размеров вкладов, снятие денег и запись результата ), а вторая — за вывод информации. Фрагмент, отвечающий за сбор информации, организован в виде цикла, в котором счета обрабатываются каждый в отдельности. В начале цикла пользователю предлагается ввести С для продолжения работы и X — для завершения. Если был введён символ X, происходит выход из цикла и переход во вторую часть main( ).

Программа выходит из цикла, если количество созданных счетов достигло MAXACCOUNTS, независимо от того, был ли введён X.

Обратите внимание, что происходит проверка введённого символа на равенство как 'X', так и 'х' — ведь в отличие от компьютера человек может не обратить внимания на регистр вводимых символов.

Если пользователь ввёл 'С', то управление передаётся функции init( ), которая создаёт счёт и заполняет его необходимой информацией. После этого функция process(  ) добавляет в счёт информацию о транзакции.

Аргументами функций init( ) и process(  ) являются указатели, так что эти функции могут изменять значения своих аргументов. В противном случае обновленная информация о счёте была бы утрачена по окончании работы функций.

После того как создание счетов завершено, управление переходит блоку, отвечающему за вывод итоговых результатов. В этом блоке происходит считывание каждого счёта и вывод баланса каждого из них. В конце выводится общая сумма.

Функция init( ) создаёт новый счёт после приглашения ввести его номер и обнуляет создаваемый счёт.

Очень важно не забыть проинициализировать новый элемент. Нулевой баланс счёта лучше непредсказуемого значения ( например, отрицательного ).

Функция process(  ) использует цикл для ввода каждой новой транзакции. Положительные значения считаются вкладом, а отрицательные — снятием со счёта. Для завершения работы со счётом достаточно ввести нуль.

Значение "0" используется программой в качестве флага. Это хотя и довольно распространённый, но не самый хороший метод. Я использовал его в этой программе только потому, что он помогает сэкономить довольно много места.

Существует множество способов улучшить программу BUDGET. Их поиск станет основой для последующего изучения языка С++. В конце книги вы увидите, как эта программа превратится в полнофункциональную объектно-ориентированную программу на С++.