Лекция 9
9.0. Подпрограммы
9.1. Основные понятия
Подпрограмма – логически законченная часть программы, которую по имени можно вызывать в разные места программы неограниченное число раз.
Она решает часть общей задачи. У нее есть имя, которое используется при вызове подпрограммы в основную программу.
Подпрограммы бывают 2 видов:
-
процедуры и
-
функции.
Процедура не возвращает значений (например, рисует) или возвращает несколько значений (корни квадратного уравнения).
Функция возвращает одно значение.
Программа без структурных элементов называется монолитной. Минимальный элемент такой программы - оператор. Она сложна в разработке, отладке и сопровождении.
Структурированная программа называется модульной. Она содержит более крупные компоненты - подпрограммы. Модульная программа проще создается, более понятна.
Модульная программа может иметь иерархическую структуру.
Работа с подпрограммой включает 2 этапа:
-
описание подпрограммы;
-
вызов подпрограммы.
Преимущества подпрограммы:
-
в программе нет дублирования кода;
-
повышается надежность программы;
-
улучшается «читаемость» программы;
-
облегчается процесс отладки.
Различают подпрограммы:
-
без параметров,
-
с параметрами.
9.2. Процедурный тип
Процедурный тип расширяет традиционное понятие подпрограмм, позволяя обращаться с подпрограммами как с переменными. Используется в программировании, где структура программы отражает структуру решаемой задачи. В результате алгоритм решения ясно виден из исходного текста.
Процедурный тип это внешние данные, используемые подпрограммой.
Процедурный тип объявляется следующим образом:
type
<имя1> = procedure;
<имя2> = procedure(<список параметр.>);
<имя3> = function (<список параметров>) : <тип результата>;
Этот тип определяет процедуру без параметров, процедуру с параметрами или функцию.
Например:
type
Proc1 = Procedure; // Тип – процедура без параметров
Proc2 = Procedure(x,y : real); //Тип – процедура с параметрами
Func1 = Function(x,y : real): real; //Тип – функция
9.3. Сравнение вариантов
Рассмотрим 2 варианта решения одной и той же задачи: вывод текстовых блоков с вставкой стандартного разделителя из трех строк из набора символов “ * ” в конце.
1 –й вариант (Монолитная программа)
program Example1;
…..
uses
SysUtils;
var
i, j : integer;
begin
Writeln('Text 1'); // Вывод 1 текста
for j :=1 To 3 Do
begin // Вывод строки из 20 символов “ * ”
for i :=1 To 20 Do write( ' * ' );
writeln;
end;
Writeln('Text 2'); //Вывод 2 текста
for j :=1 To 3 Do
begin // Вывод строки из 20 символов “ * ”
for i :=1 To 20 Do write( ' * ' );
writeln;
end;
readln
end.
2 – й вариант (Модульная программа)
program Example2; DrawStr
….
uses
SysUtils;
Procedure DrawStr; // Процедура “Рисовать строки”
var
i, j : integer;
begin
for j :=1 To 3 Do
begin // Вывод строки из 20 символов “*”
for i :=1 To 20 Do write( ' * ' );
writeln; // Перейти к следующей строке
end;
end;
begin //основная программа
Writeln( ' Text 1 ' ); // Вывод 1 текста
DrawStr; // Вывод строк разделителя
Writeln( ' Text 2 ' ); // Вывод 2 текста
DrawStr; // Вывод строк разделителя
readln
end.