Доброго времени суток всем!!!
С Вашего позволения я продолжу начатую мною и оконченную здесь тему.
Все кто уже мало мальски ознакомился с классами прошу скинуть свой 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 файлы и ссылку на файлообменник поменял.
у меня было больше ошибок, я их просто молча исправил :)
всех обманул )))
Макар
Я тоже уже сам поправил баги. Компилятор почему то не захотел кушать русскую «с» в названии функции changePricesBenefits(), и не понял приведение типа в виде if (choice > unsigned int(n)).
Alf, если то что ты выложил это рабочий код, то как он у тебя откомпилировался?
С исходным текстом я еще не разобрался :( Очень много написано.
Мне не понравилось устройство меню. Как то не логично оно устроено. В «расчеты» можно войти без установки «месяца расчета», но в самих расчетах месяц уже установить нельзя — надо выйти в меню на уровень вверх.
Еще мне показалось что программа неправильно считает. Я не разбирался в деталях по исходнику, но мне кажется что параметры «Льгота» и «Лимит по льготе» вообще нигде не учитывается. А по электричеству разве в пределах 150квт не должно считаться по более низкой ставке? То есть например если потратили 200квт, то первые 150квт считать по более низкой ставке, а последующие 50квт — по более высокой?
Еще хорошо бы, что бы в сохраненном отчете сохранялись не только деньги, но и все параметры расчета: показания счетчиков, разность показаний, тариф. И еще, что бы каждый расчет записывался в свой файл, а не затирал предыдущий расчет. Уникальное имя файла можно делать из номера года и номера месяца. Тогда можно будет понять когда, сколько и по каким тарифам заплатили. Думаю что на Украине тарифы на коммуналку тоже растут регулярно :(
Alf, если то что ты выложил это рабочий код, то как он у тебя откомпилировался?
Откомпилировал на VS 2010 и пашет как папа Карло :)))
Но суть в другом, если ты все таки собрал программу, то ты уже второй человек у которого она работает, на мой взгляд, с очень БОЛЬШОЙ и жирной хохмой, но об этом чуть позже...
Ошибку с буквой 'с' исправил.
Мне не понравилось устройство меню. Как то не логично оно устроено. В «расчеты» можно войти без установки «месяца расчета», но в самих расчетах месяц уже установить нельзя — надо выйти в меню на уровень вверх.
В расчеты можно войти без выбора месяца для того чтобы посмотреть предыдущий расчет. Но твоя логика верна, при выборе расчета нужно дать возможность выбрать месяц. Исправил.
Еще мне показалось что программа неправильно считает.
Все правильно показалось. Я не оговорил, что функция 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(¤t);
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
Доброго времени суток всем!!!
С Вашего позволения я продолжу начатую мною и оконченную здесь тему.
Все кто уже мало мальски ознакомился с классами прошу скинуть свой e-mail сюда
я вышлю исходники и хедер (или в формате .txt как будет Вам удобно) написанной мною программы, дабы получить комментарии, советы , в общем, камни в свой огород :)))
Код не выкладываю в блог по причине объема (около 750 строк). Не уверен «прожует» ли редактор форума такой объем :) В прочем если Selevit разрешит я могу разместить код и здесь.
Череп, Selevit, Алан, porshe как всегда интересно Ваше мнение. Кстати Череп, тема по ссылке окончена на нашем с тобою диалоге и твоего пожелания упаковать мою программу в класс. В общем упаковал...
Alf, письмо не отправляется:

Вот мой адрес:
11porshe99@mail.ruНа первый взгляд — «ошибка» — частое использование
system, что ни есть хорошо. Очистку экрана можно( весьма топорно, но ведь работает? ) реализовать так:Правда этот код вряд ли быстр и переносим, но в
Windowsбудет работать, и его быстродействия хватит для рядовых программ.Больше никаких косяков, заметных мне, не вижу.
Если ты выложишь архив с кодом на файлообменник, всем будет удобнее.
Круто! Только оно у меня не компилится:
И еще скажи зачем у тебя файлы программы продублированы с расширением txt?
Я вижу, что твой компилятор ругается на то что в файле
mainPablicServices.cppобъявлена внешняя переменная классаistream cin. Прошу прощения не включил в файл объявлениеusing std::cin;, хотя у porshe программа скомпилировалась, хз ???В общем я все изменил, убрал
.txtфайлы и ссылку на файлообменник поменял.у меня было больше ошибок, я их просто молча исправил :)
всех обманул )))
Я тоже уже сам поправил баги. Компилятор почему то не захотел кушать русскую «с» в названии функции changePricesBenefits(), и не понял приведение типа в виде
if (choice > unsigned int(n)).Alf, если то что ты выложил это рабочий код, то как он у тебя откомпилировался?
С исходным текстом я еще не разобрался :( Очень много написано.
Мне не понравилось устройство меню. Как то не логично оно устроено. В «расчеты» можно войти без установки «месяца расчета», но в самих расчетах месяц уже установить нельзя — надо выйти в меню на уровень вверх.
Еще мне показалось что программа неправильно считает. Я не разбирался в деталях по исходнику, но мне кажется что параметры «Льгота» и «Лимит по льготе» вообще нигде не учитывается. А по электричеству разве в пределах 150квт не должно считаться по более низкой ставке? То есть например если потратили 200квт, то первые 150квт считать по более низкой ставке, а последующие 50квт — по более высокой?
Еще хорошо бы, что бы в сохраненном отчете сохранялись не только деньги, но и все параметры расчета: показания счетчиков, разность показаний, тариф. И еще, что бы каждый расчет записывался в свой файл, а не затирал предыдущий расчет. Уникальное имя файла можно делать из номера года и номера месяца. Тогда можно будет понять когда, сколько и по каким тарифам заплатили. Думаю что на Украине тарифы на коммуналку тоже растут регулярно :(
Откомпилировал на VS 2010 и пашет как папа Карло :)))
Но суть в другом, если ты все таки собрал программу, то ты уже второй человек у которого она работает, на мой взгляд, с очень БОЛЬШОЙ и жирной хохмой, но об этом чуть позже...
Ошибку с буквой 'с' исправил.
В расчеты можно войти без выбора месяца для того чтобы посмотреть предыдущий расчет. Но твоя логика верна, при выборе расчета нужно дать возможность выбрать месяц. Исправил.
Новая ссылка на файлообменник
http://dropmefiles.com/d5uLF
Все правильно показалось. Я не оговорил, что функция
calculations();не содержит расчетной части, а только умножает разницу на основной тариф (т.к. не это самое главное на данном этапе) в целях просмотра работоспособности :)А чего за хохма-то?
Выкладывайте код сюда, либо на https://gist.github.com/
OK selevit сюда, так сюда :)
Макар хохма заключается в функции
changePricesAndBenefits()в ней вызывается функцияsaveDataкоторая возвращает типboolбез присваивания возвращаемого значения какой либо переменной ??? Объяснить я этого не могу, но программа работает у меня, у тебя и у porshe.Макар если будешь собирать программу, то лучше копируй все файлы от сюда, а не с файлообменника, т.к. здесь файлы отредактированы.
Вот такая хохма :)))
Файл PablicServices.h
Файл mainPablicServices.cpp
Файл PablicServices.cpp