Процедуры и функции


В языке Паскаль, как и в большинстве языков программирования, предусмотрены средства, позволяющие оформлять вспомогательный алгоритм как подпрограмму. Это бывает необходимо тогда, когда какой-либо подалгоритм неоднократно повторяется в программе или имеется возможность использовать некоторые фрагменты уже разработанных ранее алгоритмов. Кроме того, подпрограммы применяются для разбиения крупных программ на отдельные смысловые части в соответствии с модульным принципом в программировании.

Для использования подалгоритма в качестве подпрограммы ему необходимо присвоить имя и описать алгоритм по правилам языка Паскаль. В дальнейшем, при необходимости вызвать его в программе, делают вызов подпрограммы упоминанием в нужном месте имени соответствующего подалгоритма со списком входных и выходных данных. Такое упоминание приводит к выполнению входящих в подпрограмму операторов, работающих с указанными данными. После выполнения подпрограммы работа продолжается с той команды, которая непосредственно следует за вызовом подпрограммы.

 

В языке Паскаль имеется два вида подпрограмм - процедуры и функции.

 

Процедуры и функции помещаются в раздел описаний программы. Для обмена информацией между процедурами и функциями и другими блоками программы существует механизм входных и выходных параметров. Входными параметрами называют величины, передающиеся из вызывающего блока в подпрограмму (исходные данные для подпрограммы), а выходными - передающиеся из подрограммы в вызывающий блок (результаты работы подпрограммы).

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

 

Описание и вызов процедур и функций

Структура описания процедур и функций до некоторой степени похожа на структуру Паскаль-программы: у них также имеются заголовок, раздел описаний и исполняемая часть. Раздел описаний содержит те же подразделы, что и раздел описаний программы: описания констант, типов, меток, процедур, функций, перменных. Исполняемая часть содержит собственно операторы процедур.

Формат описания процедуры имеет вид:

procedure имя процедуры (формальные параметры);
  раздел описаний процедуры
begin

  исполняемая часть процедуры

end;

Формат описания функции:

function имя функции (формальные параметры):тип результата;
  раздел описаний функции
begin

  исполняемая часть функции

end;

Формальные параметры в заголовке процедур и функций записываются в виде:

var имя праметра: имя типа

и отделяются друг от друга точкой с запятой. Ключевое слово var может отсутствовать (об этом далее). Если параметры однотипны, то их имена можно перечислять через запятую, указывая общее для них имя типа. При описании параметров можно использовать только стандартные имена типов, либо имена типов, определенные с помощью команды type.Список формальных параметров может отсутствовать.

 

Вызов процедуры производится оператором, имеющим следующий формат:

имя  процедуры(список фактических параметров);

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

Вызов функции в Паскаль может производиться аналогичным способом, кроме того имеется возможность осуществить вызов внутри какого-либо выражения. В частности имя функции может стоять в правой части оператора присваивания, в разделе условий оператора if и т.д.

 

Для передачи в вызывающий блок выходного значения функции в исполняемой части функции перед возвратом в вызывающий блок необходимо поместить следующую команду:

имя функции := результат;

При вызове процедур и функций необходимо соблюдать следующие правила:

  • количество фактических параметров должно совпадать с количеством формальных;
  • соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу.

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

Рассмотрим использование процедуры на примере программы поиска максимума из двух целых чисел.

var x,y,m,n: integer;

procedure MaxN(a,b: integer; var max: integer);
begin
   if a>b then max:=a else max:=b;
end;

begin
   write('Введите x,y ');
   readln(x,y);
   MaxN(x,y,m);
   MaxN(2,x+y,n);
   writeln('m=',m,'n=',n);
end.

Аналогичную задачу, но уже с использованием функций, можно решить так:

var x,y,m,n: integer;

function MaxN(a,b: integer): integer;
   var max: integer;
begin
   if a>b then max:=a else max:=b;
   MaxN := max;
end;

begin
   write('Введите x,y ');
   readln(x,y);
   m := MaxN(x,y);
   n := MaxN(2,x+y);
   writeln('m=',m,'n=',n);
end.

 

Процедуры

 

Процедура – это вспомогательный алгоритм, который предназначен для выполнения некоторых действий.
Применение:
 - выполнение одинаковых действий в разных местах программы
 - разбивка программы (или другой процедуры) на подзадачи для лучшего восприятия


procedure <имя процедуры>(<формальные параметры>:integer);
begin
<тело процедуры>
end;
 


Порядок разработки процедуры:
 - выделить одинаковые или похожие действия
 - найти в них общее (размеры, форма, угол поворота) и отличия
 - отличия записать в виде неизвестных переменных, они будут параметрами процедуры
 


Особенности:
 - все процедуры расположены выше основной программы
 - в заголовке процедуры перечисляются формальные параметры, они обозначаются именами, поскольку могут меняться
 - при вызове процедуры в скобках указывают фактические параметры (числа или арифметические выражения) в том же порядке
 - для каждого формального параметра после двоеточия указывают его тип
 - если однотипные параметры стоят рядом, их перечисляют через запятую
 - внутри процедуры параметры используются так же, как и переменные
 - в процедуре можно объявлять дополнительные локальные переменные, остальные процедуры не имеют к ним доступа
 

 

Задача нарисовать:

 

 

Программа:

Program Eighth;
uses crt,graphABC;
Procedure Tr(x,y,r,g,b:integer);
begin
MoveTo(x,y);
LineTo(x-50,y-86);
LineTo(x+50,y-86);
LineTo(x,y);
FloodFill(x,y-5,RGB(r,g,b));
end;
Begin
Tr (100,100,0,0,255);
Tr (200,100,255,0,0);
Tr (150,186,0,255,0);
End.
 

На экране вы увидите следующее:

 

 

 

Рекурсия

 

Рекурсивный объект – это объект, определяемый через один или несколько таких же объектов.
 

Примеры:

Дерево Пифагора из N уровней – это ствол и отходящие от него симметрично два дерева Пифагора из N-1 уровней, такие что длина их стволов в 2 раза меньше и угол между ними равен 90.

 

Это дерево Пифагора из 6 уровней:

Другим примером может послужить предмет находящийся между двух зеркал: он будет повторяться в отражении несколько раз меняя свои размеры.

 

Рекурсивная процедура - это процедура вызывающая сама себя.

 

Задачи: Построить 

Программа:

program qq;
uses GraphABC;
procedure Pifagor(x0, y0, a, L: real;
N: integer);
const k = 0.6;
var x1, y1: real;
begin
if N > 0 then begin
x1
:= x0 + L*cos(a);
y1
:= y0 - L*sin(a);
Line (round(x0), round(y0),round(x1), round(y1));
Pifagor (x1, y1, a+pi/3, L*k, N-1);
Pifagor (x1, y1, a+3*pi/30, L*k, N-1);
Pifagor (x1, y1, a-3*pi/30, L*k, N-1);
Pifagor (x1, y1, a-pi/3, L*k, N-1);
end;
end;
begin
Pifagor (250, 400, pi/2, 150,6);
end.
 

Но если немного изменить программу:

program qq;
uses GraphABC;
procedure Pifagor(x0, y0, a, L: real;
N: integer);
const k = 0.6;
var x1, y1: real;
begin
if N > 0 then begin
x1
:= x0 + L*cos(a);
y1
:= y0 - L*sin(a);
Line (round(x0), round(y0),round(x1), round(y1));

SetPenColor (clbrown);
Pifagor (x1, y1, a+pi/3, L*k, N-1);

SetPenColor (clyellow);
Pifagor (x1, y1, a+3*pi/30, L*k, N-1);

SetPenColor (clred);
Pifagor (x1, y1, a-3*pi/30, L*k, N-1);

SetPenColor (clgreen);
Pifagor (x1, y1, a-pi/3, L*k, N-1);
end;
end;
begin
Pifagor (250, 400, pi/2, 150,10);
end.

 

 

http://pascalabc2012.narod.ru/Procedure.htm

abcpascal.pdf
Adobe Acrobat Document 788.8 KB
Волкова-ТИ-Программирование-в-среде-Pasc
Adobe Acrobat Document 2.0 MB