Описание и вызов процедур.
Для реализации многократно повторяющихся участков вычислений и для обеспечения модульности программ в языке Турбо Паскаль предусмотрена возможность использования процедур и функций.
Процедура - это поименованное сложное действие, которое представляет собой совокупность операторов, вычисляющих некоторое число результатов в зависимости от некоторого числа аргументов.
Процедура или функция (общее название - подпрограмма) определяется в разделе описаний основной программы или другой процедуры(функции). Процедура(функция) имеет ту же структуру, что и основная программа, т.е. состоит из заголовка, описательной части и выполняемой части.
Синтаксис заголовка процедуры:
PROCEDURE< имя процедуры > [(<список формальных
параметров >)];
Например:
Procedure PR1 ( A,B,C : integer; Var S: real);
- здесь PR1 – имя процедуры, а А,В,С,S – имена переменных, являющихся параметрами.
В отличие от основной программы заголовок в процедуре обязателен, но завершается процедура не точкой, а точкой с запятой. Описание процедуры выполняется с формальными параметрами.
Оператор процедуры служит для вызова процедуры из основной программы или из другой процедуры(функции).
Вызов осуществляется в следующей форме:
<имя процедуры > [(<список фактических параметров>)];
Таким образом, для приведенного заголовка процедуры можно написать такой оператор вызова:
PR1 (A,B,C,S);
Формат списка параметров в заголовке процедуры и при вызове процедуры отличаются. При вызове переменные, константы или выражения следуют через запятую, а в заголовке запись переменных напоминает объявление переменных в разделе описания переменных. Для всех элементов списка должен быть указан тип данных. Несколько переменных, отнесенных к одному типу , пишутся через запятую, а группы переменных различного типа отделяются точкой с запятой. После обращения к процедуре управление передается на выполнение следующего за вызовом процедуры оператора.
Описание функции.
Функция предназначена для вычисления какого-либо одного значения и используется в выражениях аналогично стандартным функциям.
Синтаксис заголовка функции:
FUNCTION < имя функции >[(<список формальных
параметров>)]:<тип результата>;
Например:
Function PRF (A,B,C: integer) : real;
Отличие описания функции от процедуры:
· результатом обращения к функции может быть одно единственное значение;
· идентификатор результата не указывается в списке формальных параметров;
· в выполняемой части функции , хотя бы один раз , имени функции должно быть присвоено значение результата ( чаще всего перед выходом из функции);
· после списка формальных параметров задается тип результата;
· после обращения к функции управление передается на выполнение следующей операции данного выражения (в соответствии с приоритетом).
Для вызова функции используется указатель функции (имя функции со списком фактических параметров), который обязательно должен быть частью какого-либо выражения (входить в правую часть оператора присваивания, присутствовать в списке данных оператора вывода, в логическом выражении условного оператора и т.д.). Для приведенного заголовка функции вызов функции может быть осуществлен одним из следующих способов:
S:=PRF ( A,B,C);
Writeln ( PRF ( A,B,C));
If PRF ( A,B,C)>20 then K=K+1;
Формальные и фактические параметры.
При описании процедуры (функции) в ее заголовке могут быть указаны параметры следующих видов:
- параметры-значения;
- параметры-переменные;
- параметры-константы;
- параметры-процедуры;
- параметры-функции.
При записи параметров необходимо помнить:
- число формальных и фактических параметров должно быть одинаково;
- порядок следования и тип фактических параметров должен совпадать с порядком и типом соответствующих формальных параметров;
- идентификаторы формальных и фактических параметров могут совпадать;
- формальные параметры в языке Турбо Паскаль в заголовке находятся вместе с описаниями и объявлять их в разделе описаний процедуры(функции) не требуется;
- формальные параметры должны иметь простые или ранее определенные типы.
При передаче в подпрограмму массива его тип объявляют предварительно в разделе описания типов TYPE.
Например.
Type TV=array [1..30] of integer;
TM=array [1..20,1..20] of real;
...
Procedure TOP ( A:TM; Var B: TV ; N: integer);
...
Здесь описаны два типа массивов. TV – для одномерного массива и TM для двумерного массива. Затем в списке формальных параметров для переменных А и В используются эти ранее определенные типы при описании соответственно матрицы и вектора.
Список параметров, задаваемых в заголовке процедуры или функции, обеспечивает связь подпрограммы с вызывающей программой. Через него в подпрограмму передаются исходные данные и возвращается результат (в процедуре). В языке Турбо Паскаль предусмотрены два принципиально отличающихся механизма передачи параметров : по значению и по ссылке.
Параметры-значения.
При передаче параметров по значению в стеке, в котором осуществляется выделение памяти под внутренние (локальные) переменные подпрограммы, выделяется дополнительная память, в которую копируются значения соответствующих фактических параметров. В вызывающей программе в качестве аргумента подпрограммы для параметра-значения может использоваться не только переменная, но и выражение. После завершения работы подпрограммы выделенная этим параметрам память становится недоступной, поэтому передача параметров по значению не может использоваться в подпрограммах для получения результатов.
Параметры-переменные.
При вызове по ссылке в подпрограмме память под передаваемые переменные не отводится. В подпрограмму передается не значение переменной, а ссылка на место в памяти соответствующего фактического параметра. Подпрограмма, выполняющая некоторые действия с этой переменной, в действительности производит действия с соответствующим фактическим параметром, поэтому после выполнения процедуры , изменения, выполненные над этой переменной, сохраняются. Перед записью параметров-переменных в списке формальных параметров указывается ключевое слово VAR (действует до " ; "). Для вычисляемых результатов могут быть использованы только параметры-переменные. Формальным параметрам-переменным не могут соответствовать в качестве фактических значений константы или выражения ,так как они не имеют адреса для передачи.
В качестве параметров-переменных могут быть использованы массивы и строки открытого типа, у которых не задаются размеры. Открытый массив представляет собой формальный параметр подпрограммы, описывающий базовый тип элементов, но не определяющий его размерность и границы. Индексация элементов в этом случае начинается с нуля. Верхняя граница открытого массива возвращается функцией HIGH . Такое описание возможно только для одномерных массивов. Для открытого массива в стеке создается его копия, что может вызвать переполнение стека.
Рассмотрим пример использования открытого массива. Пусть требуется подсчитать сумму элементов одномерного массива.
Function SUM (Var A: array of integer):integer;
Var S,I : integer;
Begin
S:=0;
For I:=0 to HIGH(A) do
S:=S+A[I];
Sum:=S;
End;
В основной программе такой массив может быть описан даже как
Var A: array [ -2 .. 3] of integer; Фактические границы массива здесь значения не имеют. Важно только то, что количество элементов массива в данном случае равно 6.
Открытая строка может задаваться с помощью стандартного типа OPENSTRING и стандартного типа STRING с использованием директивы компилятора {$P+} .
Например,
Procedure ZAP ( Var St : openstring; R: integer );
или
{$P+}
Procedure ZAP ( Var St : string; R: integer );
В языке Турбо Паскаль можно устанавливать режим компиляции, при котором отключается контроль за совпадением длины формального и фактического параметра строки {$V- }. При передаче строки меньшего размера формальный параметр будет иметь ту же длину, что и параметр обращения; при передаче строки большего размера происходит усечение до максимального размера формального параметра. Контроль включается только при передаче параметров-переменных , для параметров - значений длина не контролируется.
Рассмотрим пример, в котором используются процедура и функция. Требуется написать процедуру, в которой для матрицы, содержащей M столбцов и N строк, необходимо составить вектор номеров столбцов, все элементы которых упорядочены по возрастанию или убыванию и являются простыми числами. В главной программе вводятся все входные данные, производится обращение к процедуре и осуществляется вывод полученных результатов.
Uses crt;
Type tmas=array[1..100,1..100] of word;
tvect=array[1..100] of word;
Var a:tmas;
v:tvect;
n,m,k:byte;
i,j:byte;
Procedure FORM(var x:tmas; {матрица}
n,m:byte; {количество строк и столбцов}
Var r:tvect; {результат - вектор}
var k:byte); {длина полученного вектора}
Var i,j,z,s:byte;
f:boolean;
Function pros(b:word):boolean;
{функция проверки простого числа}
Var i:word;
Begin
If b<>1 then pros:=true
else pros:=false;
For i:=2 to b div 2 do
If b mod i = 0 then pros:=false;
End;
Begin
k:=0;
For j:=1 to m do
Begin
z:=0; s:=0; f:=true;
For i:=1 to n-1 do
Begin
If x[i,j]>x[i+1,j] then z:=z+1;
If x[i,j]<x[i+1,j] then s:=s+1
End;
If (z = n-1) or (s = n-1) then
Begin
For i:=1 to n do
If not(pros(x[i,j])) then f:=false;
If f then
Begin
k:=k+1; r[k]:=j
End;
End;
End;
End;
Begin
Writeln('Введите N и M:');
Readln(n,m);
Writeln('Введите матрицу:');
For i:=1 to n do
For j:=1 to m do
Readln(a[i,j]);
FORM(a,n,m,v,k);
Writeln('Результат:');
For i:=1 to k do
Write(v[i],' ');
Readkey
End.
В этом примере в процедуру передаются входные данные: двумерный массив и его размерность. Массив передается как параметр-переменная, чтобы в процедуре не выделялась память для его копии. Результаты: вектор и его размерность обязательно передаются как параметры-переменные. Функция проверки простого числа является внутренней для процедуры и недоступна из главной программы.
Параметры-константы.
Так как аргументы, передаваемые в процедуру или функцию , размещаются в стеке, то в случае передачи значением массива большого размера, может произойти переполнение стека. В языке Турбо Паскаль 7.0 введен описатель CONST, который может задаваться для формальных параметров подпрограмм. Аргумент, соответствующий такому параметру, передается по ссылке, подобно параметру с описателем Var, но в самой процедуре(функции) запрещается присваивать этому аргументу новое значение.
PROCEDURE<имя процедуры> (CONST <имя константы>:
<тип>; ...);
FUNCTION <имя функции> (CONST <имя константы> :
<тип> ; ...):<тип результата> ;
Параметр-константу нельзя передавать в качестве параметра в другую подпрограмму.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|