Использование циклов в программе КАЛЬКУЛЯТОР

Lazarus IDE: Основы программирования в Windows Lazarus IDE: Основы программирования в Windows

Несмотря на то, что всё потихоньку уходит в сеть, программирование для настольных компьютеров остаётся востребованным. И будет таковым ещё долго. Ну а самая распространённая операционная система для настольных компьютеров – это по-прежнему Windows. Поэтому любой программист, даже если он собирается стать веб-разработчиком, должен знать хотя бы основы создания программ для Windows. Подробнее...

Итак, пришло время практического применения знаний о циклах.

Продолжим усовершенствовать наш калькулятор. Попробуем разобраться, где здесь можно использовать циклы.

Но для начала переведём весь текст, который мы выводим пользователю, на русский язык. Как сделать так, чтобы русские буквы правильно отображались в консольном приложении, вы уже знаете.

А теперь посмотрим, где нам пригодятся циклы.

Первое, что напрашивается - это применение цикла при проверке деления на ноль. Реализовать это можно так:

while i <= MAX_ENTER do
  begin
    if y = 0 then
      begin
        WriteLn('!!! ОШИБКА: Y не должен быть равен 0 !!!');
        if i <> MAX_ENTER then
          begin
            WriteLn('!!! Введите Y ещё раз!!!');
            WriteLn('Осталось попыток: ', MAX_ENTER-i);
            Write('y = ');
            ReadLn(y);
          end;
      end
    else
      begin
        WriteLn('x div y = ', x div y);
        Break;
      end;
    Inc(i);
  end;
if y = 0 then
 begin
   Write('!!! ОШИБКА: ');
   WriteLn('Превышено количество попыток ввода Y !!!');
 end;

Я специально не буду разъяснять этот код. Считайте, что разобраться, как он работает - это домашнее задание. Поясню лишь по поводу константы MAX_ENTER.

Здесь как раз тот случай, когда удобнее использовать константу вместо числа. Почему?

Давайте разберёмся. Мы даём пользователю три попытки ввести число Y. Но вдруг в следующей версии программы мы захотим увеличить или уменьшить количество попыток. Тогда, если бы мы использовали число, то нам бы пришлось изменять его в исходном коде в двух местах. Да ещё надо было бы найти эти места. А при использовании константы мы меняем её значение в одном месте. И всё.

Ну да ладно. Идём дальше.

Как вы понимаете, программа позволяет выполнить одну из четырех математических операций с двумя числами и завершает работу. Но вдруг пользователю нужно выполнить операцию ещё с двумя числами? Что тогда? Снова запускать программу? Да, можно и так. Но согласитесь, что это не удобно. Намного лучше будет гонять программу в цикле до тех пор, пока пользователь не захочет её закрыть.

Сделать это можно примерно так:

repeat
//Код программы
  WriteLn('Выйти из программы? Y/N? ');
  ReadLn(Q);
until (Q = 'y') or (Q = 'Y');

Итак, мы ввели переменную Q типа char. Тело программы мы заключили в цикл с постусловием. В конце программы мы спрашиваем у пользователя, хочет ли он выйти из программы и даём ему подсказку “Y/N” (Yes/No). Если пользователь вводит символ Y и нажимает ENTER, то программа завершается. Иначе программа выполняется сначала.

Здесь мы использовали неизвестный для вас оператор or. Этот оператор выполняет логическую операцию ИЛИ. То есть в нашем случае условие выполняется, если

(Q = 'y') ИЛИ (Q = 'Y')

Сделано это потому, что мы не знаем, в каком регистре вводит символы пользователь. То есть он может ввести как большую, так и маленькую букву Y. А это в данном случае не одно и то же.

Ну и в заключение привожу полный исходный код программы. Это уже почти идеальная программа. Но идеальной она не является хотя бы потому, что она ещё позволяет пользователю сделать ошибку. Например, вместо числа ввести букву. И тогда программа завершится с ошибкой. А это плохо, потому что не соответствует критериям качественного алгоритма.

Листинг 21.1. Почти готовый простой калькулятор.
program mycalc;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };

const MAX_ENTER = 3;

var x, y, i : integer;
    op, Q   : char;

begin
  WriteLn('ПРОСТОЙ КАЛЬКУЛЯТОР');
  WriteLn('Введите два числа и знак операции:');
  WriteLn('+ сложение, - вычитание, * умножение, / целое деление');
  WriteLn('*****************************************************');
  repeat
  Write('x = ');
  ReadLn(x);
  Write('y = ');
  ReadLn(y);
  Write('Операция: ');
  ReadLn(op);
  i := 0;
  case op of
  '+' : WriteLn('x + y = ', x + y);
  '-' : WriteLn('x - y = ', x - y);
  '*' : WriteLn('x * y = ', x * y);
  '/' : begin
          while i <= MAX_ENTER do
            begin
              if y = 0 then
                begin
                  WriteLn('!!! ОШИБКА: Y не должен быть равен 0 !!!');
                  if i <> MAX_ENTER then
                    begin
                      WriteLn('!!! Введите Y ещё раз!!!');
                      WriteLn('Осталось попыток: ', MAX_ENTER-i);
                      Write('y = ');
                      ReadLn(y);
                    end;
                end
              else
                begin
                  WriteLn('x div y = ', x div y);
                  Break;
                end;
              Inc(i);
            end;
          if y = 0 then
            begin
              Write('!!! ОШИБКА: '); 
              WriteLn('Превышено количество попыток ввода Y !!!');
            end;
        end;
  else WriteLn('!!! ОШИБКА: Неподдерживаемая операция !!!');
  end;
  WriteLn('Выйти из программы? Y/N? ');
  ReadLn(Q);
  until (Q = 'y') or (Q = 'Y');
end.

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика