Программирование. Принципы и практика использования C++ Исправленное издание, стр. 101
}В этом коде сначала происходит проверка буфера. Если в буфере есть символ
cccincclean_up_mess()void clean_up_mess(){ ts.ignore(print);}Обработка ошибок всегда является сложной. Она требует постоянного экспериментирования и тестирования, поскольку крайне трудно представить заранее, какая ошибка может возникнуть в ходе выполнения программы. Защита программы от неправильного использования всегда представляет собой очень сложную задачу. Дилетанты об этом никогда не беспокоятся. Качественная обработка ошибок — один из признаков профессионализма.
7.8. Переменные
Поработав над стилем и обработкой ошибок, можем вернуться к попыткам улучшить функциональные возможности калькулятора. Мы получили вполне работоспособную программу; как же ее улучшить? Во-первых, необходимо ввести переменные. Использование переменных позволяет лучше выражать более длинные вычисления.
Аналогично для научных вычислений хотелось бы иметь встроенные имена, такие как
pie7.8.1. Переменные и определения
Очевидно, что для работы с переменными и константами программа-калькулятор должна хранить пары (имя, значение) так, чтобы мы имели доступ к значению по имени. Класс
Variableclass Variable {public: string name; double value; Variable (string n, double v) :name(n), value(v) { }};Член класса name используется для идентификации объекта класса
VariablevaluenameКак хранить объекты класса
VariablenameVariablevector<Variable> var_table;В вектор
var_tableVariableget_value()namevaluedouble get_value(string s) // возвращает значение переменной с именем s{ for (int i = 0; i<var_table.size(); ++i) if (var_table[i].name == s) return var_table[i].value; error("get: неопределенная переменная", s);}Этот код действительно прост: он перебирает объекты класса
Variablevar_tablessvalueset_value()valueVariablevoid set_value(string s, double d) // присваивает объекту класса Variable с именем s значение d{ for (int i = 0; i<var_table.size(); ++i) if (var_table[i].name == s) { var_table[i].value = d; return; } error("set: неопределенная переменная", s);}Теперь можем считать и записывать переменные, представленные в виде объектов класса
Variablevar_tableVariablevar_tabledouble var = 7.2;Это работает, но все переменные в данном калькулятора и так хранят значения типа
doublevar = 7.2;Что ж, возможно, но теперь мы не можем отличить определение новой переменной от синтаксической ошибки.
var1 = 7.2; // определение новой переменной с именем var1var1 = 3.2; // определение новой переменной с именем var2Ой! Очевидно, что мы имели в виду
var2 = 3.2;doublelet