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

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

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

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

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

  1. Участок кода слишком громоздкий и мешает воспринимать программу в целом
  2. Участок кода выполняет инициализацию большого количества переменных
  3. Участок кода используется в программе несколько раз
  4. Участок кода может использоваться в других программах или модулях
Разумеется, могут быть и другие причины.

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

Листинг 22.1. Использование подпрограмм.
{************************************************************************
 Использование подпрограмм в программе КАЛЬКУЛЯТОР
 Приложение к обучающему курсу ОСНОВЫ ПРОГРАММИРОВАНИЯ
 Автор: Поляков Андрей Валерьевич
 Сайт: https://info-master.su/programming/kurs/bp-base.php
 ***********************************************************************}
program mycalc;

{$mode objfpc}{$H+}

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

const MAX_ENTER = 3;    //Максимальное количество 
                        //попыток ввода второго операнда
      ERROR_NO = 0;     //Нет ошибок
      ERROR_OPER = 1;   //Операция не поддерживается
      ERROR_ZERO = 2;   //Деление на ноль 
                        //(неправильный ввод второго операнда)

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

{ **********************************************************************
  Приветствие и подсказки
  **********************************************************************}
procedure Welcome;
begin
  WriteLn('ПРОСТОЙ КАЛЬКУЛЯТОР');
  WriteLn('Введите два числа и знак операции:');
  WriteLn('+ сложение, - вычитание, * умножение, / целое деление');
  WriteLn('*****************************************************');
end;

{ **********************************************************************
  Ввод данных в глобальные переменные
  **********************************************************************}
procedure GetData;
var i : integer;
begin
  Write('x = ');
  ReadLn(x);
  Write('y = ');
  ReadLn(y);
  Write('Операция: ');
  ReadLn(op);
end;

{ **********************************************************************
  Проверка входных данных
  ВХОД: глобальные переменные x, y, op
  ВЫХОД: 0 - данные правильные, 1 - не поддерживаемая операция
         2 - при операции деления второй операнд равен 0 и превышено
             количество попыток ввода
  **********************************************************************}
function CheckData : byte;
var Res : byte;
begin
  Res := ERROR_NO;
  i := 0;
  case op of
  '+' : Res := ERROR_NO;
  '-' : Res := ERROR_NO;
  '*' : Res := ERROR_NO;
  '/' : 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
                  Res := ERROR_NO;
                  Break;
                end;
              Inc(i);
            end;
          if y = 0 then Res := ERROR_ZERO;
        end;
  else Res := ERROR_OPER;
  end;
  CheckData := Res;
end;

{ *********************************************************************  
  ОСНОВНАЯ ПРОГРАММА
  **********************************************************************}
begin
  Welcome;                                //Приветствие
  repeat
    GetData;                              //Ввод данных
    Err := CheckData;                     //Проверка данных
    if Err <> ERROR_NO then               //Если обнаружена ошибка
      begin
        case Err of                       //Вывести сообщение
        ERROR_OPER : WriteLn('!!! ОШИБКА: неподдерживаемая операция !!!');
        ERROR_ZERO : WriteLn('!!! Превышено кол-во попыток ввода  Y !!!');
        end;
        Continue;                         //и начать заново
      end;
    case op of                            //Если ошибок не обнаружено
    '+' : WriteLn(x, ' + ', y, ' = ', x + y);     //Сложение
    '-' : WriteLn(x, ' - ', y, ' = ', x - y);     //Вычитание
    '*' : WriteLn(x, ' * ', y, ' = ', x * y);     //Умножение
    '/' : WriteLn(x, ' div ', y, ' = ', x div y); //Целое деление
    end;
    WriteLn('Выйти из программы? Y/N? '); //Запрос на выход
    ReadLn(Q);
  until (Q = 'y') or (Q = 'Y');
end.


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

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