...И создал Бог программиста, и поселил его в своем вычислительном центре, чтобы работал в нем...
Читать дальше...
Использование подпрограмм в программе КАЛЬКУЛЯТОР
|
Lazarus IDE: Основы программирования в Windows
Несмотря на то, что всё потихоньку уходит в сеть, программирование для настольных компьютеров остаётся востребованным. И будет таковым ещё долго. Ну а самая распространённая операционная система для настольных компьютеров – это по-прежнему Windows. Поэтому любой программист, даже если он собирается стать веб-разработчиком, должен знать хотя бы основы создания программ для Windows. Подробнее... |
Итак, вооружившись новыми знаниями, попробуем доработать наш калькулятор. Прежде всего, посмотрите видео, в котором я подробно всё объяснил.
Сначала надо определить участки кода, которые можно выделить по каким-либо признакам и которые имеет смысл создать в виде подпрограмм. Обычно подпрограммы создаются в тех случаях, если
- Участок кода слишком громоздкий и мешает воспринимать программу в целом
- Участок кода выполняет инициализацию большого количества переменных
- Участок кода используется в программе несколько раз
- Участок кода может использоваться в других программах или модулях
Именно такие участки кода мы выделили в нашей программе. Не вижу смысла подробно описывать то, что я рассказал в видео, поэтому дальше приведу только полный текст программы, которая у меня в итоге получилась.
Листинг 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.