Иногда такая ограниченная первоначальная версия называется
• Создавайте полномасштабную версию, используя части первоначальной версии. В идеале программа должна вырастать из отдельных компонентов, а не создаваться единым блоком. В противном случае придется рассчитывать на чудо и ожидать, что непроверенная идея окажется работоспособной и позволит достичь желаемого.
6.3. Назад к калькулятору!
Как мы хотим взаимодействовать с калькулятором? Это просто: мы знаем, как использовать потоки cin
и cout
, но графические пользовательские интерфейсы (GUI) будут рассмотрены лишь в главе 16, поэтому остановимся на клавиатуре и консольном окне. Введя выражение с помощью клавиатуры, мы вычисляем его и выводим результат на экран. Рассмотрим пример.
Выражение: 2+2
Результат: 4
Выражение: 2+2*3
Результат: 8
Выражение: 2+3–25/5
Результат: 0
Эти выражения, т.е. 2+2 и 2+2*3, должны быть введены пользователем; все остальное сделает программа. Для приглашения к вводу мы используем слово “Выражение:
”. Мы могли бы выбрать фразу “Пожалуйста, введите выражение и символ перехода на новую строку
”, но этот вариант выглядит слишком многословным и бессмысленным. С другой стороны, такие короткие приглашения, как >
, выглядят чересчур загадочно. Анализировать такие варианты использования на ранней стадии проектирования программы весьма важно. Это позволяет сформулировать очень практичное определение того, что программа должна делать как минимум.
Обсуждая проектирование и анализ, мы будем называть такие примеры
read_a_line
calculate // выполните работу
write_result
Этот набросок, конечно, не программа; он называется
6.3.1. Первое приближение
На этом этапе мы действительно еще не готовы написать программу, имитирующую функции калькулятора. Мы просто мало думали об этом, но размышления — трудная работа, а, как большинство программистов, мы стремимся сразу писать какой-то код. Итак, попробуем написать простую программу-калькулятор и посмотрим, к чему это приведет. Первое приближение может выглядеть примерно так:
#include "std_lib_facilities.h"
int main()
{
cout << "Пожалуйста, введите выражение (допускаются + и –): ";
int lval = 0;
int rval;
char op;
int res;
cin>>lval>>op>>rval; // считываем что-то вроде 1 + 3
if (op=='+')
res = lval + rval; // сложение
else if (op=='–')
res = lval – rval; // вычитание
cout << "Результат: " << res << '\n';
keep_window_open();
return 0;
}
Иначе говоря, программа считывает пару значений, разделенных оператором, например 2+2
, вычисляет результат (в данном случае 4
) и выводит его на печать. Здесь переменная, стоящая слева от оператора, обозначена как lval
, а переменная, стоящая справа от оператора, — как rval
.
Эта программа работает! Ну и что, если программа довольно простая? Очень хорошо получить что-то работающее! Возможно, программирование и компьютерные науки проще, чем о них говорят. Может быть, но не стоит слишком увлекаться ранним успехом. Давайте сделаем кое-что.
1. Несколько упростим код.
2. Добавим операции умножения и деления (например, 2*3
).
3. Добавим возможность выполнять несколько операторов (например, 1+2+3
).
В частности, известно, что корректность входной информации следует проверять (в нашем варианте мы “забыли” это сделать) и что сравнивать значения с несколькими константами лучше всего с помощью инструкции switch
, а не if
.
Цепочку операций, например 1+2+3+4
, будем выполнять по мере считывания значений; иначе говоря, начнем с 1
, потом увидим +2
и добавим 2
к 1
(получим промежуточный результат, равный 3
), увидим +3
и добавим 3
к промежуточному результату, равному 3
, и т.д.