1 #include <string>
2 #include <map>
3 #include <iostream>
4
5 class Estimation {
6 private:
7 typedef std::pair < int, bool > KeyEstimation ;
8 typedef std::pair <KeyEstimation, std::string > Estim ;
9 Estim estimation_;
10
11 public:
12 Estimation(const int up_border,const bool included,const std::string
» commentary):
» estimation_(std::make_pair(std::make_pair(up_border,included),commentary)) {}
13
14 Estimation() {}
15
16 int borderValue() const {
17 return estimation_.first.first ;
18 }
19 void borderValue(const int value) {
20 estimation_.first.first =value;
21 }
22
23 bool included() const {
24 return estimation_.first.second;
25 }
26 void included(const bool value) {
27 estimation_.first.second=value;
28 }
29
30 std::string commentary() const {
31 return estimation_.second;
32 }
33 void commentary(const std::string& s) {
34 estimation_.second=s;
35 }
36
37 Estim estimation() const {
38 return estimation_;
39 }
40
41 //Скрывая от клиента, что используется std::pair, преобразование придется делать
» явным
42 Estimation(std::map<KeyEstimation, std::string>::const_iterator& es) {
43 estimation_.first.first =es->first.first;
44 estimation_.first.second =es->first.second;
45 estimation_.second =es->second;
46 }
47
48 };
49
50 class ListEstimations {
51 private:
52 typedef std::pair < int, bool > KeyEstimation ;
53 typedef std::pair <KeyEstimation, std::string > Estim ;
54
55 public:
56 ListEstimations() {};
57 ~ListEstimations() {};
58
59 ListEstimations(const Estim& est) {
60 //Вставляет новую запись в список
61 estimations_.insert(est);
62 };//{ estimations_.push_back(est);}
63
64 //Классы исключений
65 class EstimationNotFound { };
66 class DublicateEstimation { };
67
68 ///Всталяет оценку в список и делает проверку на уникальность borderValue_ и
» included_, а вслучае совпадения делает замещение commentary_, не создавая
» нового элемента в контейнере.
69 void insertEstimation(const Estim& est) throw (DublicateEstimation) {
70 //Вставляет новую запись в список
71 estimations_.insert(est);
72 }
73
74 void insertEstimation(const int up_border,const bool included,const
» std::string commentary) {
75
»
»
»
» estimations_.insert(std::make_pair(std::make_pair(up_border,included),commentary));
76 }
77
78 ///Удаляет оценку из списка.
79 void eraseEstimation() throw (EstimationNotFound);
80
81 ///Возвращает оценку по заданным значениям value
82 //const Estimation& getEstimation(int i) const throw (EstimationNotFound);
83 Estimation& getEstimation(int i) throw (EstimationNotFound);
84
85 void print() {
86 for( std::map<KeyEstimation, std::string>::const_iterator
» i=estimations_.begin(); i!=estimations_.end(); ++i) {
87 //std::cout << i->first.first << '\t' << i->first.second << '\t' <<
» i->second << std::endl;//Делает, то же самое, что и следующая строка
88 std::cout << Estimation(i).borderValue() << '\t' <<
» Estimation(i).included() << '\t' << Estimation(i).commentary() << std::endl;
89 }
90 }
91
92 private:
93 ///Запрещение копирования
94 ListEstimations(const ListEstimations&);
95 ListEstimations& operator=(const ListEstimations&);
96
97 std::map<KeyEstimation, std::string> estimations_;
98
99 };
100
101
102 int main() {
103 setlocale(0, "") ;
104
105 Estimation est(10,false,std::string("Комментарий"));
106
107 ListEstimations ests(est.estimation());
108
109 Estimation est2(15,false,std::string("Комментарий2"));
110 ests.insertEstimation(est2.estimation());
111
112 est2.commentary("Комментарий3");
113 est2.borderValue(20);
114 est2.included(false);
115
116 ests.insertEstimation(est2.estimation());
117
118 est2.commentary("Комментарий4");
119 est2.borderValue(20);
120 est2.included(true);
121 ests.insertEstimation(est2.estimation());
122
123 ests.insertEstimation( 120,false,std::string("Комментарий5"));
124
125 ests.print();
126
127 std::cin.get();
128 return 0;
129 }
130
среда, 30 июня 2010 г.
Каждой твари по паре
Вот значит, понадобилось мне иметь объект, который будет содержать в себе справочник для получения некоторых оценок, которые в свою очередь определяются исходя из попадания в некоторый интервал значений. По сути, должны быть записи типа: значение верхней границы интервала, признак «включительно» и текст комментария, т.е. три поля. Первый (наименьший) элемент справочника оценок имеет значение нижней границы равное нулю. Естественно, значения внутри контейнера должны быть упорядочены. В качестве контейнера выбран std::map, но вот беда ключ-то нужен не простой, сложный. Одно из решений, которое пришло на ум использовать структуру std::pair, с одной стороны в качестве ключа, т.е. пару “верхняя граница интервала – признак включительно”, а с другой значением пары будет комментарий. В общем основное с чем пришлось повозиться это приведение семантики «первый-второй» к семантике «верхняя граница – включая - комментарий». Вот, что получилось:
вторник, 15 июня 2010 г.
Какой контейнер STL выбрать?

Блок-схема была создана в приложении Dia под Windows. За основу была взята вот эта картинка C++ STL Containers.
четверг, 3 июня 2010 г.
find_package(wxWidgets)
Решил использовать cmake, сюрпризом было, то что find_package(wxWidgets REQUIRED) не находил библиотеку wxWidgets, все получилось после выполнения следующих команд:
cd %WXWIN%\build\msw
call vcvars32
nmake -f makefile.vc MONOLITHIC=0 SHARED=0 UNICODE=1 BUILD=debug
Таким образом, успешность поиска wxWidgets зависит от наличия debug версии сборки библиотеки ...
cd %WXWIN%\build\msw
call vcvars32
nmake -f makefile.vc MONOLITHIC=0 SHARED=0 UNICODE=1 BUILD=debug
Таким образом, успешность поиска wxWidgets зависит от наличия debug версии сборки библиотеки ...
среда, 19 мая 2010 г.
Открытое программное обеспечение для бухгалтерии
Сегодня в организациях находят широкое применение различное программное обеспечение для автоматизации бухгалтерского учета. Возможна ли в принципе автоматизация бухгалтерии на основе open source продукта? Ответ очевиден – возможна. Поскольку есть фирмы, которые применяют программы типа Ананас, iceB и др.
Возможность создания универсального решения для широкого круга практических задач в бухгалтерии, подходящего для большинства организаций маловероятно. Поэтому те фирмы, которые ставят подобную задачу, вынуждены идти по пути гибкого решения, с расчетом на то, что на месте применения их решения, путем настройки, конфигурирования, допрограммирования, будет получено конкретное решение задач бухгалтерии.
В результате организация платит как минимум дважды, в первый раз, поставщику программного продукта, а второй раз за доработку продукта.
По сути, гибкое решение в этом случае обладает рядом существенных недостатков:
1) избыточность программного обеспечения в отношении функциональности
2) избыточность программного обеспечения в отношении трудности настройки и/или конфигурирования
3) возможна сложность добавления функционала
4) многие строки (функции) программного кода практически не используются
5) не рациональное использование ресурсов компьютера
6) получаемые решения не являются оптимальными и практически не поддаются оптимизации без перекомпиляции
7) происходит подмена интерфейсов в том плане, что реальный разработчик пишет, например, на Visual C++ , а программист занимающийся сопровождением в конфигураторе
Любопытно, что цена сопровождения таких гибких решений для бухгалтерии становится выше, чем цена внесения изменений непосредственно создателем подобной системы.
Нужен ли швейцарский ножик на кухне?
Альтернативой может быть создание некого общего решения с открытым кодом и приемлемым уровнем детализации, предоставляющим возможность дальнейшей относительно простой доработки под конкретные требования, хотя конечно может быть и решение с избыточным кодом, просто в этом случае придется убрать лишнее.
Какого бы качества не был исходный код, все равно его придется изменять. В результате возникает проблема удобного и правильного внесения изменений в код, что возможно при наличии соответствующей среды разработки и квалифицированного программиста, а ещё нужен постановщик задач (эксперт).
В технологическом отношении, те решения, которые применяются для автоматизации бухгалтерии и не только имеют общие, переносимые от одной к другой системе элементы (компоненты), а именно СУБД, графические библиотеки, и др.
Возможность создания универсального решения для широкого круга практических задач в бухгалтерии, подходящего для большинства организаций маловероятно. Поэтому те фирмы, которые ставят подобную задачу, вынуждены идти по пути гибкого решения, с расчетом на то, что на месте применения их решения, путем настройки, конфигурирования, допрограммирования, будет получено конкретное решение задач бухгалтерии.
В результате организация платит как минимум дважды, в первый раз, поставщику программного продукта, а второй раз за доработку продукта.
По сути, гибкое решение в этом случае обладает рядом существенных недостатков:
1) избыточность программного обеспечения в отношении функциональности
2) избыточность программного обеспечения в отношении трудности настройки и/или конфигурирования
3) возможна сложность добавления функционала
4) многие строки (функции) программного кода практически не используются
5) не рациональное использование ресурсов компьютера
6) получаемые решения не являются оптимальными и практически не поддаются оптимизации без перекомпиляции
7) происходит подмена интерфейсов в том плане, что реальный разработчик пишет, например, на Visual C++ , а программист занимающийся сопровождением в конфигураторе
Любопытно, что цена сопровождения таких гибких решений для бухгалтерии становится выше, чем цена внесения изменений непосредственно создателем подобной системы.
Нужен ли швейцарский ножик на кухне?
Альтернативой может быть создание некого общего решения с открытым кодом и приемлемым уровнем детализации, предоставляющим возможность дальнейшей относительно простой доработки под конкретные требования, хотя конечно может быть и решение с избыточным кодом, просто в этом случае придется убрать лишнее.
Какого бы качества не был исходный код, все равно его придется изменять. В результате возникает проблема удобного и правильного внесения изменений в код, что возможно при наличии соответствующей среды разработки и квалифицированного программиста, а ещё нужен постановщик задач (эксперт).
В технологическом отношении, те решения, которые применяются для автоматизации бухгалтерии и не только имеют общие, переносимые от одной к другой системе элементы (компоненты), а именно СУБД, графические библиотеки, и др.
Подписаться на:
Сообщения (Atom)