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

Параметры-процедуры и параметры-функции




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

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

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

Процедуры и функции должны быть объявлены с директивой Far (использование дальнего типа вызова подпрограмм) и откомпилированы в состоянии {$F+}. А также они не должны быть:

  • стандартной подпрограммой;
  • вложенной подпрограммой;
  • Inline процедурой или функцией (п/программы, записанные в машинных кодах);
  • Interrupt процедурой или функцией (п/программы обработки прерываний).

При использовании параметров-процедур или параметров-функций в списке перед соответствующими формальными параметрами указывается зарезервированное слово Procedure или Function.

Например,

Procedure Exampl(k,l: integer; Var M: real; Procedure Prob; Function Step: real);

В списке формальных параметров процедуры Exampl:

k, l - параметры-значения;
M - параметр-переменная;
Prob - параметр-процедура;
Step - параметр-функция.

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

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

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

Program ProcType;
Type
Func=Function(x, y: integer): integer;{Описание процедурного типа}
{$F+};{Директива компилятору на использование дальнего типа вызова п/программ}
{ - - - - - - - - - - - - - - - - - - - -}
Function Add(x, y:integer): integer;
Begin
Add:= x+y;
End;
{ - - - - - - - - - - - - - - - - - - - -}
Function Mult(x, y:integer): integer;
Begin
Mult:= x+y;
End;
{ - - - - - - - - - - - - - - - - - - - -}
Function Funny(x, y:integer): integer;
Begin
Funny:= (x+y)*(x-y);
End;
{ - - - - - - - - - - - - - - - - - - - -}
{$F-};
Procedure Tab(w,h: integer; Operation: Func);
Var
x, y: integer;
Begin
for y:= 1 to w do
begin
for x:= 1 to w do
write(Operation(x,y):5);
writeln;
end;
End;
{ - - - - - - - - - - - - - - - - - - - -}
Begin
Tab(10,10,Add);
Tab(10,10,Mult);
Tab(10,10,Funny);
End.

В данной программе процедура Tab представляет собой общее действие, выполняемое над параметрами-функциями Add, Mult, Funny. После запуска программы сначала вызывается процедура Tab для фактических параметров 10, 10 и Add, в результате чего формальным параметрам х и y присваиваются значения чисел 10 и 10, а формальному параметру Operation процедурного типа Func присваивается имя фактической функции Add. В результате этого на экран будет выведена таблица сложения от 1 до 10. Затем процедура Tab вызывается к исполнению для фактических параметров 10, 10 и параметра-функции Mult, в результате этого на экран будет выведена таблица умножения от 1 до 10. Аналогично вызов процедуры Tab с параметрами 10, 10 и Funny даст в результате на экране таблицу произведения суммы на разность чисел от1 до 10.

Задание. Введите текст этой программы, запишите полученный файл на диск и откомпилируйте его. после того как компиляция выполнится успешно, исполните программу в пошаговом режиме с заходом в процедуры и пронаблюдайте за вызовом функций вычисления суммы, произведения двух чисел или произведения их суммы и разности. Обратите внимание на исполнение оператора write(Operation(x,y):5), как в зависимости от фактического значения параметра-функции Operation процедурного типа Func осуществляется вызов различных функций Add, Mult или Funny. Попробуйте удалить строку с директивой компилятору об использовании дальнего типа вызова или возьмите в фигурные скобки описание процедурного типа Func и пронаблюдайте за результатом. В случае появления ошибок нажатием клавиши F1 получите справку о причинах ошибки и рекомендацию на коррекцию.

Модули, созданные программистом.

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

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

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

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

Модуль модно разделить на несколько разделов: заголовок, интерфейсная часть, реализационная часть, инициализационная часть.

Заголовок модуля

Unit <Имя модуля>;
{$N+} <Глобальные директивы компилятора>;

Интерфейсная часть

Interface

Uses<список подключаемых модулей>;
Const<описания констант, определенных в данном модуле и доступных для других модулей>;
Type<описания типов, определенных в данном модуле и доступных для других модулей>;
Var<описания переменных, определенных в данном модуле и доступных для других модулей>;
Procedure<Заголовки процедур, определенных в данном модуле и доступных для других модулей>;
Function<Заголовки функций, определенных в данном модуле и доступных для других модулей>;

Реализационная часть

Implementatoin

Uses<список подключаемых модулей>;
Const<описания констант, определенных в данном модуле и недоступных для других модулей>;
Type<описания типов, определенных в данном модуле и недоступных для других модулей>;
Var<описания переменных, определенных в данном модуле и недоступных для других модулей>;
Procedure<реализация процедур, определенных в данном модуле и доступных для других модулей>;
Function<реализация функций, определенных в данном модуле и доступных для других модулей>;
Procedure<реализация процедур, определенных в данном модуле и недоступных для других модулей>;
Function<реализация функций, определенных в данном модуле и недоступных для других модулей>;

Инициализационная часть

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

Заголовок модуля

Заголовок модуля мало чем отличается от заголовка программы. В модуле вместо зарезервированного слова Program используется слово Unit. Здесь же могут присутствовать директивы компилятору, дающие общие установки для всего модуля.

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

Интерфейсная часть

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

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

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

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

Примечание. Интерфейсная часть может быть пуста.

Реализационная часть

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

Реализационная часть также может быть пустой.

Инициализационная часть

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

Примечание. Создание собственного модуля не является обязательным для учащегося.

 

Тема: Примеры решения задач.  
   
  1. Вывести все совершенные числа в данном диапазоне.
program sov1; { Задача. Вывести все совершенные числа в данном диапазоне.} var a, b, i, j, s: longint; begin write('Введите диапазон для вывода совершенных чисел: '); readln(a, b); writeln('Совершенные числа в данном диапазоне:'); for i:= a to b do begin s:= 0; for j:= 1 to i - 1 do if i mod j = 0 then s:= s + j; if s = i then writeln(i); end; readln;end.

 

 

Поделиться:





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



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