Сделай Сам Свою Работу на 5

Описание и вызов процедур.





 

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

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

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

Синтаксис заголовка процедуры:

 

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 Все материалы защищены законодательством РФ.