Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Массивы и строки открытого типа

Лекция 18-19

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

1. Процедура
2. Функция
3. Формальные и фактические параметры

3.1. Параметры-значения
3.2. Параметры-переменные
3.3. Параметры-константы
3.4. Параметры без типа
3.5. Массивы и строки открытого типа
3.6. Параметры-процедуры и параметры-функции

4. Процедура EXIT
5. Директивы подпрограмм

Рекурсивные процедуры и функции

 

В языке Паскаль имеется две разновидности подпрограмм:

- процедуры

- функции.

Структура любой подпрограммы аналогична структуре всей программы. Подпрограмма должна быть описана до того, как она будет использована в программе или другой подпрограмме.

Все параметры, которые использует подпрограмма, можно разбить на две категории:

-локальные параметры, объявленные внутри подпрограммы и доступные только ей самой,

-глобальные - объявленные в основной программе и доступные как программе, так и всем ее подпрограммам.

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

Подпрограмма может использовать глобальные параметры двояким образом:

-непосредственно обращаясь к глобальному параметру по его имени

-используя механизм формальных параметров.

Подпрограмма может непосредственно использовать любые глобальные параметры за исключением тех, которые имеют те же имена, что и ее локальные параметры.

Процедура

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

Любая процедура начинается с заголовка. В отличие от основной программы заголовок в процедуре обязателен. Он состоит из зарезервированного слова procedure, за которым следует идентификатор имени процедуры, а далее в круглых скобках - список формальных параметров:

procedure <имя процедуры>(<список формальных параметров>);

За заголовком могут идти такие же разделы, что и в основной программе. В отличие от основной программы процедура завершается не точкой, а точкой с запятой.

Пример. Процедура ввода N целых чисел. Пусть в основной программе определен тип:

type tArr = array[1..100] of Integer;

Процедура может иметь вид:

procedure InpInt(var Mas: tArr; N: Integer); {заголовок процедуры со списком формальных параметров проверка N <= 100 - в основной программе}
var i: Integer; {локальный параметр - параметр цикла}
begin  
Writeln ('Ввведите', N, 'целых чисел');  
for I:= 1 to N do  
Read (Mas[i])  
end;  

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

Например:

InpInt(M, К);

означает, что вызывается процедура Inplnt для ввода К целых чисел в массив М. Естественно, что в этом случае параметр К целого типа, а М - массив типа tArr.

Функция

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

У этой подпрограммы два основных отличия от процедуры:

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

Функция может возвращать параметры следующих типов:

-любого порядкового,

-любого вещественного,

-стандартного типа string,

-любого указателя, в том числе и типа PChar.

Б) Второе отличие заключается в том, что в теле функции хотя бы раз имени функции должно быть присвоено значение.

Пример. Функция вычисления факториала числа N.

function Factorial(N: Byte): Longint;
var Fact: Longint;
i: Byte;
begin
Fact:= N;
for i: = N-l downto 2 do
Fact: = Fact * i;
Factorial:= Fact
end;

Если имя функции внутри ее описания используется не в левой части оператора присваивания, то это означает, что функция вызывает себя рекурсивно.

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

Part:=Sqr(T)/Faktorial(i);

В этом операторе:

Sqr(T) - вызов стандартной функции возведения в квадрат с фактическим параметром Т;

Faktorial(i) - вызов функции, вычисляющей факториал с фактическим параметром i.

Формальные и фактические параметры

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

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

В группу формальных параметров включаются однотипные параметры одной категории.

Все формальные параметры можно разбить на четыре категории:

· параметры-значения (эти параметры в основной программе подпрограммой не меняются);

· параметры-переменные (эти параметры подпрограмма может изменить в основной программе);

· параметры-константы (используются только в версии 7.0);

· параметры-процедуры и параметры-функции (т. е. процедурного типа).

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

Имена параметров могут быть любыми, в том числе и совпадать с именами объектов программы. Необходимо лишь помнить, что в этом случае параметр основной программы с таким именем становится недоступным для непосредственного использования подпрограммой.

Тип формального параметра может быть практически любым, однако в заголовке подпрограммы нельзя вводить новый тип.

Например, нельзя писать

function Max(A: array[1..100] of Real): Real;

Чтобы правильно записать этот заголовок, следует в основной программе ввести тип-массив, а затем использовать его в заголовке:

type tArr = array[1..100] of Real;

function Max(A: tArr): Real;

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

Параметры-значения

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

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

Тип параметра-значения может быть любым за исключением файлового.

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

Пример.

procedure Inp(Max, Min: Real; N: Word);
function Mult(X, Y: Integer): Real;

Пример. Функция вычисления максимального элемента в массиве. Пусть в основной программе определен тип-массив, массив этого типа и переменная целого типа

type
tArr = array[1..100] of Integer;
var
Massiv: tArr;
Maxim: Integer;

Функция в этом случае может иметь вид:

function Max(Mas: tArr; N: Byte): Integer;
var Ma: Integer;
i: Byte;
begin
Ma:= Mas[l];
for i:= 2 to N do
if Ma < Mas[i] then
Ma:= Mas[i];
Max:= Ma
end;

Параметры-переменные

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

Параметр-переменная указывается в заголовке подпрограммы аналогично параметру-значению, но только перед именем параметра записывается зарезервированное слово var.

Действие слова var распространяется до ближайшей точки с запятой, т. е. в пределах одной группы.

Пример.

procedure MaxMin(A: tArr; var Max, Min: Real; N: Word);

Здесь Max, Min - параметры-переменные, А и N - параметры значения.

Тип параметров-переменных может быть любым, включая и файловый.

Параметры-константы

Часто в качестве параметра в подпрограмму следует передать ту или иную переменную, но изменять ее подпрограмма не должна.

В этом случае нежелательно передавать этот параметр как параметр-переменную. Можно его передать как параметр-значение, однако, если эта переменная имеет большой размер (массив, запись и т. д.), то копия такого параметра займет большую часть стека и даже может его переполнить.

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

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

Пример.

function NewString(const S: string): string;

Тип параметра-значения может быть любым за исключением файлового.

 

Параметры без типа

В Turbo Pascal можно использовать параметры-переменные и параметры-константы без указания типа. В этом случае фактический параметр может быть переменной любого типа, а ответственность за правильность использования того или иного параметра возлагается на программиста.

Пример.

function Equal(var Paraml, Param2; Len: Word): Boolean;

Здесь Param1, Param2 - параметры-переменные без типа; Len - параметр-значение.

Следует иметь в виду, что параметр без типа внутри подпрограммы типа не имеет и его перед использованием следует преобразовать к конкретному типу, применяя идентификатор соответствующего типа.

В этом случае в качестве первого передаваемого параметра можно использовать любой массив (и не только массив), так что подпрограмма становится более универсальной.

 

Массивы и строки открытого типа

В версии 7.0 можно в качестве параметров-переменных использовать массивы и строки открытого типа, у которых не задаются размеры. В качестве фактического параметра в этом случае можно использовать массив или строку любого размера, однако массив должен состоять из тех же компонент, что и компоненты j открытого массива.

Такие параметры введены для того, чтобы подпрограмма могла обрабатывать массив или строку любого размера.

Фактический размер массива в этом случае может быть определен с помощью функции High (высота).

Открытый массив задается как и обычный массив, но только без указания типа индекса. Следует иметь в виду, что индексация элементов открытого массива всегда начинается с нуля, а максимальный индекс элемента равен значению функции High.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...