Студопедия — Описание и вызов процедур и функций
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

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






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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

var x,y,m,n: integer; procedure MaxNumber(a,b: integer; var max: integer);begin if a>b then max:=a else max:=b;end; begin write('Введите x,y '); readln(x,y); MaxNumber(x,y,m); MaxNumber(2,x+y,n); writeln('m=',m,'n=',n);end.

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

var x,y,m,n: integer; function MaxNumber(a,b: integer): integer; var max: integer;begin if a>b then max:=a else max:=b; MaxNumber:= max;end; begin write('Введите x,y '); readln(x,y); m:= MaxNumber(x,y); n:= MaxNumber(2,x+y); writeln('m=',m,'n=',n);end.

 

 

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

На этом шаге мы рассмотрим использование параметров-констант.

При описании параметров-констант в заголовках процедур/функций перед идентификаторами таких параметров ставится ключевое const.

Заголовок процедуры с описанными параметрами-константами имеет такой вид:

procedure MyProc (const Par1, Par2: Type1; const РаrЗ, Раr4: Туре2);

Приведем упрощенную схему и описание механизма работы параметров-констант:

 


Рис.1. Механизм передачи параметров

 

При вызове процедуры/функции:

выполняется выделение памяти только для локальных данных и для сохранения адресов фактических параметров-констант;

выполняется копирование адресов (но не значений!) фактических параметров в выделенную для них память;

 

Во время работы процедуры/функции:

запрещено изменение значений формальных параметров-констант;

использовать значения формальных параметров разрешено только в качестве исходных данных;

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

 

При окончании процедуры/функции:

влияние вызываемой процедуры/функции на вызывающую через параметры-константы отсутствует;

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

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

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

На следующем шаге мы рассмотрим безтиповые параметры.

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

На этом шаге мы рассмотрим использование параметров-значений.

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

Заголовок процедуры с описанными параметрами-значениями имеет следующий вид:

procedure MyProc (Par1, Par2: Type1; РаrЗ, Раr4: Туре2);

Приведем упрощенную схему и описание механизма работы параметров-значений:

 


Рис.1. Механизм передачи параметров

 

При вызове процедуры/функции:

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

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

 

Во время работы процедуры/функции:

никаких ограничений на использование параметров данного вида не накладывается;

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

 

При окончании процедуры/функции:

память, выделенная под формальные параметры-значения и локальные данные, очищается;

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

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

На следующем шаге мы рассмотрим передачу параметров по ссылке.

 

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

На этом шаге мы рассмотрим передачу параметров по ссылке.

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

Заголовок процедуры с описанными параметрами-переменными имеет следующий вид:

procedure MyProc (var Par1, Par2: Type1; var РаrЗ, Раr4: Туре2);

Приведем упрощенную схему и описание механизма работы параметров-переменных:


Рис.1. Механизм передачи параметров

 

При вызове процедуры/функции:

выполняется выделение памяти только для локальных данных и для сохранения адресов фактических параметров-переменных;

выполняется копирование адресов (но не значений!) фактических параметров в выделенную для них память;

использовать в качестве фактических параметров константы запрещено.

 

Во время работы процедуры/функции:

никаких ограничений на использование параметров данного вида не накладывается;

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

 

При окончании процедуры/функции:

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

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

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

.

Открытые параметры-массивы для передачи параметров одинакового типа

На этом шаге мы рассмотрим использование параметров-массивов для передачи параметров.

В заголовке процедуры открытые параметры-массивы описываются следующим образом:

procedure OpenVector (Vector: array of TypeVector);

Открытый параметр-массив может быть параметром-значением, параметром-константой или параметром-переменной.

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

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

array [ 0..N-1] of TypeVector;

где N - число элементов в фактическом параметре.

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

Для определения характеристик переданного фактического параметра-массива в теле процедуры используются стандартная функция Low, которая всегда возвращает 0, стандартная функция High, которая возвращает индекс последнего элемента в формальном параметре-массиве, и функция SizeOf, которая возвращает размер фактического параметра-массива.

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

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

 

const

m = 10;

n = 15;

type

TVector1 = array [1..m] of Byte;

TVector2 = array [1..n] of Byte;

var

Vector1: TVector1;

Vector2: TVector2;

{--------------------------------------------------}

procedure SortVector (var Vector: array of Byte);

var

Min: Byte;

Imin: Word;

i, j: Word;

begin

for i:= 0 to High (Vector) do

begin

Min:= Vector[i];

Imin:= i;

for j:= i+1 to High (Vector) do

if Vector [j] < Min then

begin

Min:= Vector[j];

Imin:= j

end;

Vector[Imin]:= Vector[i];

end;

end;

{--------------------------------------------------}

begin

.....

SortVector (Vector1);

SortVector (Vector2);

.....

end.

 







Дата добавления: 2015-04-19; просмотров: 584. Нарушение авторских прав; Мы поможем в написании вашей работы!



Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

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

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Медицинская документация родильного дома Учетные формы родильного дома № 111/у Индивидуальная карта беременной и родильницы № 113/у Обменная карта родильного дома...

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

Ученые, внесшие большой вклад в развитие науки биологии Краткая история развития биологии. Чарльз Дарвин (1809 -1882)- основной труд « О происхождении видов путем естественного отбора или Сохранение благоприятствующих пород в борьбе за жизнь»...

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

Закон Гука при растяжении и сжатии   Напряжения и деформации при растяжении и сжатии связаны между собой зависимостью, которая называется законом Гука, по имени установившего этот закон английского физика Роберта Гука в 1678 году...

Характерные черты официально-делового стиля Наиболее характерными чертами официально-делового стиля являются: • лаконичность...

Studopedia.info - Студопедия - 2014-2024 год . (0.009 сек.) русская версия | украинская версия