Прошу оценить код 4

Доброго времени суток всем!!!
С Вашего позволения я продолжу начатую мною и оконченную здесь тему.
Все кто уже мало мальски ознакомился с классами прошу скинуть свой e-mail сюда

alf1977@ukr.net

я вышлю исходники и хедер (или в формате .txt как будет Вам удобно) написанной мною программы, дабы получить комментарии, советы , в общем, камни в свой огород :)))
Код не выкладываю в блог по причине объема (около 750 строк). Не уверен «прожует» ли редактор форума такой объем :) В прочем если Selevit разрешит я могу разместить код и здесь.
Череп, Selevit, Алан, porshe как всегда интересно Ваше мнение. Кстати Череп, тема по ссылке окончена на нашем с тобою диалоге и твоего пожелания упаковать мою программу в класс. В общем упаковал...

На первый взгляд — «ошибка» — частое использование system, что ни есть хорошо. Очистку экрана можно( весьма топорно, но ведь работает? ) реализовать так:

void clearConsoleScreen()
{
    HANDLE hConsoleOutput = GetStdHandle( STD_OUTPUT_HANDLE );
    COORD pos;
    pos.X = pos.Y = 0;
    for ( int i = 0; i < 300; i++ )
        cout << endl;
    SetConsoleCursorPosition( hConsoleOutput, pos );
    return; 
}

Правда этот код вряд ли быстр и переносим, но в Windows будет работать, и его быстродействия хватит для рядовых программ.

Больше никаких косяков, заметных мне, не вижу.

Если ты выложишь архив с кодом на файлообменник, всем будет удобнее.

Круто! Только оно у меня не компилится:

Компилятор: TDM-GCC 4.8.1 64-bit Debug
Building Makefile "E:\Dev-Cpp\Projects\PablicServices\Makefile.win"
Выполнение make clean
rm.exe -f obj/mainPablicServices.o obj/PablicServices.o exe/PublicServices.exe

g++.exe -c mainPablicServices.cpp -o obj/mainPablicServices.o -I"E:/Dev-Cpp/MinGW64/include" -I"E:/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"E:/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.8.1/include" -I"E:/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.8.1/include/c++" -g3 -std=c++11

In file included from mainPablicServices.cpp:5:0:
PablicServices.h:87:2: error: stray '\361' in program
  void сhangePricesBenefits();
  ^

mainPablicServices.cpp: In function 'int main()':
mainPablicServices.cpp:26:2: error: 'cin' was not declared in this scope
  cin.get();
  ^

mainPablicServices.cpp:26:2: note: suggested alternative:
In file included from PablicServices.h:8:0,
                 from mainPablicServices.cpp:5:
e:\dev-cpp\mingw64\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\iostream:60:18: note:   'std::cin'
   extern istream cin;  /// Linked to standard input
                  ^

E:\Dev-Cpp\Projects\PablicServices\Makefile.win:28: recipe for target 'obj/mainPablicServices.o' failed

mingw32-make.exe: *** [obj/mainPablicServices.o] Error 1

Compilation failed after 0.39 seconds with errors

И еще скажи зачем у тебя файлы программы продублированы с расширением txt?

Я вижу, что твой компилятор ругается на то что в файле mainPablicServices.cpp объявлена внешняя переменная класса istream cin. Прошу прощения не включил в файл объявление using std::cin;, хотя у porshe программа скомпилировалась, хз ???
В общем я все изменил, убрал .txt файлы и ссылку на файлообменник поменял.

хотя у porshe программа скомпилировалась, хз ???

у меня было больше ошибок, я их просто молча исправил :)

у меня было больше ошибок, я их просто молча исправил :)

всех обманул )))

Я тоже уже сам поправил баги. Компилятор почему то не захотел кушать русскую «с» в названии функции changePricesBenefits(), и не понял приведение типа в виде if (choice > unsigned int(n)).

Alf, если то что ты выложил это рабочий код, то как он у тебя откомпилировался?

С исходным текстом я еще не разобрался :( Очень много написано.

Мне не понравилось устройство меню. Как то не логично оно устроено. В «расчеты» можно войти без установки «месяца расчета», но в самих расчетах месяц уже установить нельзя — надо выйти в меню на уровень вверх.

Еще мне показалось что программа неправильно считает. Я не разбирался в деталях по исходнику, но мне кажется что параметры «Льгота» и «Лимит по льготе» вообще нигде не учитывается. А по электричеству разве в пределах 150квт не должно считаться по более низкой ставке? То есть например если потратили 200квт, то первые 150квт считать по более низкой ставке, а последующие 50квт — по более высокой?

Еще хорошо бы, что бы в сохраненном отчете сохранялись не только деньги, но и все параметры расчета: показания счетчиков, разность показаний, тариф. И еще, что бы каждый расчет записывался в свой файл, а не затирал предыдущий расчет. Уникальное имя файла можно делать из номера года и номера месяца. Тогда можно будет понять когда, сколько и по каким тарифам заплатили. Думаю что на Украине тарифы на коммуналку тоже растут регулярно :(

Alf, если то что ты выложил это рабочий код, то как он у тебя откомпилировался?

Откомпилировал на VS 2010 и пашет как папа Карло :)))
Но суть в другом, если ты все таки собрал программу, то ты уже второй человек у которого она работает, на мой взгляд, с очень БОЛЬШОЙ и жирной хохмой, но об этом чуть позже...
Ошибку с буквой 'с' исправил.

Мне не понравилось устройство меню. Как то не логично оно устроено. В «расчеты» можно войти без установки «месяца расчета», но в самих расчетах месяц уже установить нельзя — надо выйти в меню на уровень вверх.

В расчеты можно войти без выбора месяца для того чтобы посмотреть предыдущий расчет. Но твоя логика верна, при выборе расчета нужно дать возможность выбрать месяц. Исправил.

Новая ссылка на файлообменник

http://dropmefiles.com/d5uLF

Еще мне показалось что программа неправильно считает.

Все правильно показалось. Я не оговорил, что функция calculations(); не содержит расчетной части, а только умножает разницу на основной тариф (т.к. не это самое главное на данном этапе) в целях просмотра работоспособности :)

OK selevit сюда, так сюда :)
Макар хохма заключается в функции changePricesAndBenefits() в ней вызывается функция saveData которая возвращает тип bool без присваивания возвращаемого значения какой либо переменной ??? Объяснить я этого не могу, но программа работает у меня, у тебя и у porshe.
Макар если будешь собирать программу, то лучше копируй все файлы от сюда, а не с файлообменника, т.к. здесь файлы отредактированы.
Вот такая хохма :)))

Файл PablicServices.h

    // PablicServices.h -- определение класса PablicServices
    // Alf  21.07.2014  22:58

    #ifndef PABLICSERVICES_H_
    #define PABLICSERVICES_H_

    #include <iostream>
    #include <fstream>  // ofstream, ifstream
    #include <cstring>  // strlen() 
    #include <sstream>  // stringstream
    #include <string>
    #include <iomanip>
    #include <cstdlib>

    using std::string;
    using std::ostream;

    //////////////////////////////////// КОНСТАНТЫ /////////////////////////////////////////
    const int PRICES = 11;  // кол-во расчетов (газ, свет, вода)
    const int CALC = 3;     // кол-во цен, льгот и лимитов в массисе prices
    const int MENUS = 5;    // кол-во меню (гл. меню, расчеты, тарифы и льготы, изменить)
    const int LOWER = 75;   // лимит на электричество, кВт
    const int UPPER = 150;  // лимит по договору
    const string MONTHS[] = {"январь", "февраль", "март", "апрель", "май", "июнь",
                            "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"};
    const string ABRRCALC[] = {"газ", "электричеств", "вод"};   // абревиатуры расчетов
    const string ENDINGS[] = {"а", "о", "у", "ы"};      // окончания
    const string DIMS[] = {"м3", "кВт", "грн" , "%"};   // размерности

    /////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////// ОПРЕДЕЛЕНИЕ КЛАССА PablicServices //////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////


    class PablicServices
    {
    private:
        unsigned int choice;    // выбор меню
        unsigned int month;     // выбор месяца
        double prices[PRICES];
        /*  В массиве prices
        0, 1, 2 - цены на газ, свет и воду соотв.,
        3 - цена на свет св. 150 кВт,
        4, 5, 6 - льгота в % на газ, свет и воду соотв.,
        7, 8, 9 - лимит по льготе на газ (зима), свет и воду соотв.
        10 - лимит на газ (лето)                                    */
        double totalsum[CALC];  // общая сумма к оплате за 0 - газ, 1 - свет, 2 - воду

    public:
        // конструктор по умолчанию - устанавливает все элементы данных в 0
        // и вызывает функцию loadPricesAndBenefits, который загружает данные из файла,
        // и передает ей адрес enter
        PablicServices(bool * enter);

        // функция загружает цены из файла prices.txt
        void loadPricesAndBenefits(bool * enter);

        // ввод тарифов и льгот, параметр n номер расчета
        // 0 - газ, 1 - свет, 2 - вода
        void setPricesAndBenefits(double p[], const unsigned int n);

        // функция переходов между меню программы
        void mainMenu(bool * enter);

        // функция отображения меню и выбора пунктов меню
        void getMenus(const int n);

        // функция производит расчеты стоимости газа, света и воды
        void calculations();

        // функция обрабатывает ввод и отображение расчетных данных
        // вызывается из функции calculations, принимает в качестве первого параметра
        // флаг, который сигнализирует о том вводить показания или отображать расчеты
        void inputOutputReadout(const bool flag, unsigned int * diffr);

        // отображение общей суммы за расчетный месяц
        void getTotalSum();

        // функция отображения и сохранения общей суммы расчетов
        // первый параметр функции ссылка на объект класса ostream (cout (для вывода на экран)
        // или fout (для записи в файл "savedcalc.txt")) 
        void outSaveTotalSum(ostream & out, const double sum);

        // функция отображения последнего сохраненного расчета
        void getLastSavedCalc();

        // функция выводит на экран тарифы и льготы
        void getPricesAndBenefits(const double prices[]);

        // функция изменяет тарифы и льготы
        void changePricesAndBenefits();

        // функция сохраняет значения в файле prices.txt 
        // в качестве параметра - временный массив для хранения данных
        bool saveData(double p[]);

        // функция с аргументом по умолчанию обрабатывает корректный ввод выбора (в меню и при запросах о сохранении данных)
        // т.к. функция Input не возвращает отрицательных значений, функция CorrectInput, имеющая параметр
        // число пунктов меню, не позволяет ввести число - большее числа пунктов меню (минимальное кол-во пунктов = 1)
        void correctInput(int n = 1);

        // перегруженные функции, корректно обрабатывают ввод значений типа int и double и возвращают только положительные значения
        void input(unsigned int * intval);
        void input(double * dbval);

        // деструктор
        ~PablicServices();
    };

    #endif

Файл mainPablicServices.cpp

// mainPablicServices.cpp -- главный исполняющий файл
// программы PablicServices
// Alf  23.07.2014  14:10

#include "PablicServices.h"

int main()
{
    using std::cout;
    using std::cin;
    using std::endl;
    using std::setw;
    using std::right;

    setlocale(0, "");

    bool enter = false; // флаг для входа в программу и выхода из нее

    PablicServices data(&enter);        // создание объекта и вызов конструктора по умолчанию

    if (enter)                  // если enter == true ...
        data.mainMenu(&enter);  // ... вход в главное меню

    system ("cls");
    cout << "\n\n\n\n\n" << setw(25) << right << "ДО СВИДАНИЯ\n\n\n\n\n" << "<Enter>" << endl;
    cin.get();

    return 0;
}

Файл PablicServices.cpp

// определения элемент-функций класса PablicServices
// файл содержит реализацию функций, прототипы которых
// объявлены в PablicServices.h
// Alf  23.07.2014  12:21

#include "PablicServices.h"

// конструктор по умолчанию -- устанавливает все элементы данных в 0
// и загружает сохраненные тарифы и льготы при запуске программы
PablicServices::PablicServices(bool * enter)
{
    choice = 0;
    month = 0;
    for (int i = 0; i < PRICES; i++)
        prices[i] = 0;
    for (int i = 0; i < CALC; i++)
        totalsum[i] = 0;
    loadPricesAndBenefits(enter);
}

// функция загрузки сохранненых данных при запуске программы
// параметр enter из функции main() - для входа в гл. меню
void PablicServices::loadPricesAndBenefits(bool * enter)
{
    using namespace std;

    if (!*enter){   // если enter == false - это запуск программы и нужно прочитать тарифы в массив prices...
        ifstream fin;
        fin.open("prices.txt");     // ... из файла "prices.txt"...
        if (!fin.is_open()){            // ... если файла "prices.txt" нет, значит запуск происходит впервые и файл "prices.txt" нужно создать 
            cout << "Отсутствуют сохраненные тарифы.\n"
                << "*** Создать файл \"Тарифы\"? ***\n\n"
                << setw(16) << left << "* Да - 1 *" << setw(16) << right << "* Нет - 0 *\n\n"
                << "Ваш выбор: ";
            do{
                correctInput();
                if (1 == choice){       // 1-создать файл "prices.txt"...
                    system("cls");

                    double p[PRICES];                   // временный массив для хранения тарифов
                    for (int i = 0; i < PRICES; i++)    // инициализация массива отрицательными значениями
                        p[i] = -1;  // таким образом в функции saveData(double p[]) происходит сортировка значений которые >= 0

                    for (unsigned int i = 0; i < CALC; i++){        // вводим значения тарифов и льгот
                        if (0 == i){                    // тарифы и льготы на газ
                            system("cls");
                            cout << "************ ГАЗ *************\n\n";
                            setPricesAndBenefits(p, i);
                        }
                        else if (1 == i){               // тарифы и льготы на электричество
                            system("cls");
                            cout << "******* ЭЛЕКТРИЧЕСТВО ********\n\n";
                            setPricesAndBenefits(p, i);
                        }
                        else {                          // тарифы и льготы на воду
                            system("cls");
                            cout << "************ ВОДА ************\n\n";
                            setPricesAndBenefits(p, i);
                        }
                    }
                    bool save = saveData(p);        // сохранить данные и проверить на успешное сохранение
                    if (save){
                        choice = 0;
                        *enter = true;  // переменной *enter = true, чтобы войти в гл.меню
                        system("cls");
                        cout << "\n\n\n\n\n" << setw(24) << right << "ДОБРО ПОЖАЛОВАТЬ" << "\n\n\n\n\n<Enter>";
                        cin.get();
                        system("cls");
                    }
                }
            }while (choice);
        }
        else {                              // если файл "prices.txt" существует - открыть его...
            int i;

            for (i = 0; fin.good(); i++)    // ... и прочитать тарифы в массив prices
                fin >> prices[i];

            if (fin.eof()){
                cout << "\n\n\n\n\n" << setw(24) << right << "ДОБРО ПОЖАЛОВАТЬ" << "\n\n\n\n\n<Enter>";
                cin.get();
                system("cls");
            }
            else if (fin.fail())
                cout << "Input terminated by data mismatch.\n";
            else
                cout << "Input terminated be unknown reason.\n";
            if (0 == i)
                cout << "\nNo data processed.\n";
            else
                *enter = true;      // переменной *enter = true, чтобы войти в гл.меню
        }
        fin.close();
    }
}

// ввод значений тарифов и льгот
void PablicServices::setPricesAndBenefits(double p[], const unsigned int n)
{
    using std::cout;

    if (0 == n){    // ввод тарифов и льгот на газ
        cout << "Тариф на " << ABRRCALC[n] << ", " << DIMS[n + 2] << ": ";
        input(&p[n]);
        cout << "Льгота, " << DIMS[n + 3] << ": ";
        input(&p[n + 4]);
        cout << "Лимит по льготе (зима), " << DIMS[n] << ": ";
        input(&p[n + 7]);
        cout << "Лимит по льготе (лето), " << DIMS[n] << ": ";
        input(&p[n + 10]);
    }
    else if (1 == n){   // ввод тарифов и льгот на свет
        cout << "Тариф до " << UPPER << " " << DIMS[n] << ", " << DIMS[n + 1] << ": ";
        input(&p[n]);
        cout << "Тариф св " << UPPER << " " << DIMS[n] << ", " << DIMS[n + 1] << ": ";
        input(&p[n + 2]);
        cout << "Льгота, " << DIMS[n + 2] << ": ";
        input(&p[n + 4]);
        cout << "Лимит по льготе, " << DIMS[n] << ": ";
        input(&p[n + 7]);
    }
    else if (2 == n){
        cout << "Тариф на " << ABRRCALC[n] << ENDINGS[n] << ", " << DIMS[n] << ": ";
        input(&p[n]);
        cout << "Льгота, " << DIMS[n + 1] << ": ";
        input(&p[n + 4]);
        cout << "Лимит по льготе, " << DIMS[n - 2] << ": ";
        input(&p[n + 7]);
    }
}

// функция перехода между меню программы
void PablicServices::mainMenu(bool * enter)
{
    bool flags[MENUS] = {0};    // флаги переключения меню 
// 0 - Главное меню, 1 - Выбор месяца, 2 - Расчеты, 3 - Тарифы и льготы, 4 - Изменить

    flags[0] = true;    // установить флаг Главное меню в true

    while (*enter){

        if (flags[0])
            getMenus(0);    // отобразить Главное меню
        else if (flags[1]){
            getMenus(1);        // отобразить Выбор месяца
            if (choice)         // если выбор != 0 переменную choice устанавливаем в 0
                choice = 0;     // чтобы в операторе switch переключить флаги и выйти в гл. меню
        }
        else if (flags[2])
            getMenus(2);        // отобразить меню Расчеты
        else if (flags[3])
            getMenus(3);        // отобразить меню Тарифы и льготы
        else
            getMenus(4);        // отобразить меню Изменить

        switch(choice){
        case 1:
            if (flags[0]){  // Главное меню > Выбор месяца
                flags[0] = false;
                flags[1] = true;
            }
            else if (flags[2]){         // Расчеты > Расчет газа
                calculations();
            }
            else if (flags[3]){         // Тарифы и льготы > Просмотреть
                getPricesAndBenefits(prices);
            }
            else if (flags[4]){         // Изменить > Тарифы и льготы на газ
                changePricesAndBenefits();
            }
            break;
        case 2:
            if (flags[0]){              // Главное меню > Расчеты
                flags[0] = false;
                flags[2] = true;
            }
            else if (flags[2]){         // Расчеты > Расчет электричества
                calculations();
            }
            else if (flags[3]){         // Тарифы и льготы > Изменить
                flags[3] = false;
                flags[4] = true;
            }
            else if (flags[4]){         // Изменить > Тарифы и льготы на электричество
                changePricesAndBenefits();
            }
            break;
        case 3:
            if (flags[0]){              // Главное меню > Тарифы и льготы
                flags[0] = false;
                flags[3] = true;
            }
            else if (flags[2]){ // Расчеты > Расчет воды
                calculations();
            }
            else if (flags[4]){         // Изменить > Тарифы и льготы на воду
                changePricesAndBenefits();
            }
            break;
        case 4:
            if (flags[2]){  // Расчеты > Просмотр и сохранение общей суммы расчета
                getTotalSum();
            }
            break;
        case 5:
            if (flags[2]){  // Расчеты > Последний сохраненный расчет
                getLastSavedCalc();
            }
            break;
        case 0:                         // смена флагов
            if(flags[0]){           // если в гл. меню выбран 0 ...
                flags[0] = false;
                *enter = false;     // ... завершить программу
            }
            else if (flags[1]){     // если в меню Выбор месяца выбран 0 ...
                flags[1] = false;
                flags[0] = true;    // ... перейти в гл. меню
            }
            else if (flags[2]){     // если в меню Расчеты выбран 0 ...
                month = 0;          // ... сбросить значение месяца ...
                for (int i = 0; i < CALC; i++)  // расчеты в totalsum - сбросить в 0
                    totalsum[i] = 0;
                flags[2] = false;
                flags[0] = true;    // ... перейти в гл. меню
            }
            else if (flags[3]){     // если в меню Тарифы и льготы выбран 0 ...
                flags[3] = false;
                flags[0] = true;    // ... перейти в гл. меню
            }
            else if (flags[4]){     // если в меню Изменить выбран 0 ...
                flags[4] = false;
                flags[3] = true;    // ... перейти в меню Тарифы и льготы
            }
            break;
        }
    }   // конец цикла while выход из гл. меню и из программы (enter == false)
}

// функция отображения меню и выбора пунктов меню
void PablicServices::getMenus(const int n)
{
    using namespace std;

    if (0 == n){        // Главное меню
        system("cls");
        cout << "******** ГЛАВНОЕ МЕНЮ ********\n\n"
                "1. Mесяц расчета\n2. Расчеты\n3. Тарифы и льготы\n0. Выход\n\nВаш выбор: ";

        correctInput(3);
    }
    else if (1 == n){ // Выбор месяца
        system("cls");

        unsigned int temp = choice; // временная переменная для сохранения текущего значения choice
            // в функции calculations значение choice используется для выбора расчета (газ, свет или вода)
            // но при выборе месяца значение теряется т.к. функция input привязана к значению choice

        for (int i = 0; i < CALC; i++)  // при выборе месяца все расчеты в totalsum - сбрасываються в 0
            totalsum[i] = 0;

        do{ 
            cout << "******** ВЫБОР МЕСЯЦА ********\n\n";
            for (int i = 0; i < 6; i++){
                cout << setw(2) << right << (i + 1) << ". " << setw(14) << left << MONTHS[i]
                << setw(2) << right << (i + 7) << ". " << setw(14) << left << MONTHS[i + 6] << endl;
            }
            cout << setw(19) << right << "0. Вернуться" << "\n\nВаш выбор: ";

            correctInput(12);

            month = choice;
            choice = temp;

        }while (month && month > 12);
    }
    else if (2 == n){       // меню Расчеты
        system("cls");
        cout << "Расчет оплаты коммунальных услуг";
        if (month)      // если не выбран расчетный месяц - месяц не отображать 
            cout << " за " << MONTHS[month - 1];
        cout << "\n\n1. Расчет газа\n2. Расчет электричества\n3. Расчет воды\n4. Общая сумма";
        if (month)      // если не выбран расчетный месяц - месяц не отображать
            cout << " за " << MONTHS[month - 1];
        cout << "\n5. Предыдущий сохраненный расчет\n0. Главное меню\n\nВаш выбор: ";

        correctInput(5);
    }
    else if (3 == n){       // меню Тарифы и льготы
        system("cls");
        cout << "****** ТАРИФЫ И ЛЬГОТЫ *******\n\n1. Просмотреть\n2. Изменить\n0. Главное меню\n\nВаш выбор: ";

        correctInput(2);
    }
    else if (4 == n){       // меню Изменить
        system("cls");
        cout << "********** ИЗМЕНИТЬ **********\n\n1. Тарифы и льготы на газ\n2. Тарифы и льготы на электричество\n"
                "3. Тарифы и льготы на воду\n0. Меню тарифы и льготы\n\nВаш выбор: ";

        correctInput(3);
    }
}

// функция производит расчеты стоимости газа, света и воды
void PablicServices::calculations()
{
    using std::cout;
    using std::cin;

    if (!month){    // если не выбран месяц - показать меню выбора месяца
        system("cls");
        getMenus(1);
    }
    if (month){
        unsigned int diffr = 0; // разница между текущим и предыдущим показаниями
        bool flag = true;   // переключение ввода и отображения в функции inputOutputReadout
        inputOutputReadout(flag, &diffr);   // вызов функции для ввода показаний
                                            // и вычисления разницы flag == true
        if (1 == choice){   // расчет газа
            totalsum[choice - 1] = diffr * prices[choice - 1];
        }
        else if (2 == choice){  // расчет света
            if (diffr > 150)
                totalsum[choice - 1] = diffr * prices[choice + 1];
            else
                totalsum[choice - 1] = diffr * prices[choice - 1];
        }
        else if (3 == choice){  // расчет воды
            totalsum[choice - 1] = diffr * prices[choice - 1];
        }

        flag = false;
        inputOutputReadout(flag, &diffr);   // эта же функция выводит на экран
                                            // значения расчетов flag == false
        cin.get();
    }
}   // конец функции Calculation

// функция обрабатывает ввод и отображение расчетных данных
// вызывается из функции calculations, принимает в качестве первого параметра
// флаг, который сигнализирует о том вводить показания или отображать расчеты
void PablicServices::inputOutputReadout(const bool flag, unsigned int * diffr)
{
    using namespace std;

    unsigned int current = 0, previous = 0;
    if (flag){  // если flag == true - ввод показаний
        do{
            system("cls");
            cout << "Расчет стоимости " << ABRRCALC[choice - 1] // если выбран расчет газа или электричества показать окончание "а" ...
            << ((1 == choice || 2 == choice) ? ENDINGS[0] : ENDINGS[3]) // ... а если расчет воды - то окончание "ы"
            << " за " << MONTHS[month - 1] << "\n\n"
            "Текущее показание: ";
            input(&current);
            cout << "Предыдущее показание: ";
            input(&previous);
            if (current < previous){        // проверка - первое показание должно быть > второго
                system("cls");
                cout << "Текущее показание не может быть\n"
                    "меньше чем предыдущее!!!\n"
                    "Введите корректные показания...\n\n"
                    "<Enter>";
                cin.get();
            }
        }while (current < previous);
    *diffr = current - previous;
    }
    else if(!flag){ // если flag == false - отображение произведенных расчетов
        cout << "\nИзрасходовано: " << setw(9) << right << *diffr << " " << ((1 == choice || 3 == choice) ? DIMS[0] : DIMS[1]) << '\n';
        if (2