Читаем Программирование. Принципы и практика использования C++ Исправленное издание полностью

 Иногда такая ограниченная первоначальная версия называется прототипом (prototype). Если первая версия не работает или работает очень плохо (что вполне вероятно), отбросьте ее и создайте другую. Повторяйте этот процесс до тех пор, пока не достигнете желаемого. Не барахтайтесь в путанице; со временем она будет лишь возрастать.

• Создавайте полномасштабную версию, используя части первоначальной версии. В идеале программа должна вырастать из отдельных компонентов, а не создаваться единым блоком. В противном случае придется рассчитывать на чудо и ожидать, что непроверенная идея окажется работоспособной и позволит достичь желаемого.

<p id="AutBody_Root091"><strong>6.3. Назад к калькулятору!</strong></p>

Как мы хотим взаимодействовать с калькулятором? Это просто: мы знаем, как использовать потоки cin и cout, но графические пользовательские интерфейсы (GUI) будут рассмотрены лишь в главе 16, поэтому остановимся на клавиатуре и консольном окне. Введя выражение с помощью клавиатуры, мы вычисляем его и выводим результат на экран. Рассмотрим пример.

Выражение: 2+2

Результат: 4

Выражение: 2+2*3

Результат: 8

Выражение: 2+3–25/5

Результат: 0

Эти выражения, т.е. 2+2 и 2+2*3, должны быть введены пользователем; все остальное сделает программа. Для приглашения к вводу мы используем слово “Выражение: ”. Мы могли бы выбрать фразу “Пожалуйста, введите выражение и символ перехода на новую строку”, но этот вариант выглядит слишком многословным и бессмысленным. С другой стороны, такие короткие приглашения, как >, выглядят чересчур загадочно. Анализировать такие варианты использования на ранней стадии проектирования программы весьма важно. Это позволяет сформулировать очень практичное определение того, что программа должна делать как минимум.

Обсуждая проектирование и анализ, мы будем называть такие примеры прецедентами использования (use cases). Впервые сталкиваясь с разработкой калькулятора, большинство людей сразу приходят к следующей логике программы:

read_a_line

calculate // выполните работу

write_result

Этот набросок, конечно, не программа; он называется псевдокодом (pseudo code). Псевдокоды обычно используются на ранних этапах проектирования, когда еще не совсем ясно, какой смысл мы вкладываем в обозначения. Например, является ли слово “calculate” вызовом функции? Если да, то каковы его аргументы? Для ответа на этот вопрос просто еще не настало время.

<p id="AutBody_Root092"><strong>6.3.1. Первое приближение</strong></p>

На этом этапе мы действительно еще не готовы написать программу, имитирующую функции калькулятора. Мы просто мало думали об этом, но размышления — трудная работа, а, как большинство программистов, мы стремимся сразу писать какой-то код. Итак, попробуем написать простую программу-калькулятор и посмотрим, к чему это приведет. Первое приближение может выглядеть примерно так:

#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, и т.д.

Перейти на страницу:

Похожие книги

Programming with POSIX® Threads
Programming with POSIX® Threads

With this practical book, you will attain a solid understanding of threads and will discover how to put this powerful mode of programming to work in real-world applications. The primary advantage of threaded programming is that it enables your applications to accomplish more than one task at the same time by using the number-crunching power of multiprocessor parallelism and by automatically exploiting I/O concurrency in your code, even on a single processor machine. The result: applications that are faster, more responsive to users, and often easier to maintain. Threaded programming is particularly well suited to network programming where it helps alleviate the bottleneck of slow network I/O. This book offers an in-depth description of the IEEE operating system interface standard, POSIX (Portable Operating System Interface) threads, commonly called Pthreads. Written for experienced C programmers, but assuming no previous knowledge of threads, the book explains basic concepts such as asynchronous programming, the lifecycle of a thread, and synchronization. You then move to more advanced topics such as attributes objects, thread-specific data, and realtime scheduling. An entire chapter is devoted to "real code," with a look at barriers, read/write locks, the work queue manager, and how to utilize existing libraries. In addition, the book tackles one of the thorniest problems faced by thread programmers-debugging-with valuable suggestions on how to avoid code errors and performance problems from the outset. Numerous annotated examples are used to illustrate real-world concepts. A Pthreads mini-reference and a look at future standardization are also included.

David Butenhof

Программирование, программы, базы данных