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

Что делать, чтобы стать программистом Что делать, чтобы стать программистом

Многие сегодня хотят стать программистами. Хотят. Но ничего не делают для этого. Не делают даже простых вещей. Не хотят даже прочитать книжку из 10 страниц. В итоге так и остаются никем. Потому что мечты не сбываются никогда. Сбываются только планы… Подробнее...

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

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

  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

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