metod_15.03.04_atppp_oaip_ump_2016 (1016599), страница 38
Текст из файла (страница 38)
Примервызова процедуры без параметров: PRINT ;.Выполнение оператора вызова процедуры или функции состоит в том, что всеформальные параметры заменяются соответствующими фактическими.Функция – это подпрограмма, определяющая одно скалярное, вещественное илистроковое значение, которое всегда выдается в вызывающую программу.Описание функции также содержит заголовок функции и блок такого строения, как иблок программы.Заголовок функции:FUNCTION имя функции (список формальных параметров) : тип результата ; Имяфункции – идентификатор, по которому функция вызывается. Тип результатаможет быть любым простым типом, причем значение результата должно бытьсовместимо с типом результата функции, определенным в операторе FUNCTION. Дляформирования результата выполнения в теле функции должен быть операторприсваивания имени функции значения результата в виде:Имя функции : = выражение ;Описание формальных параметров может иметь вид:< список имен > : < тип > или var < список имен > : < тип >В первом случае формальные параметры называют параметры-значения, а во втором– параметры-переменные.Стандартные (предопределенные) функции и процедурыСтандартные функции и процедуры предназначены для вычисления значенийматематических и логических функций, выполнения операций преобразования,получения псевдослучайных чисел, времени и даты, обработки символов, строк и т.д.Список предопределенных функций и процедур Паскаля содержит большеполусотни наименований.
Вот некоторые из них (* помечены уже рассмотренныеранее).a) математические функции (были рассмотрены ранее):Например, *abs (x) – абсолютное значение числа x;b) функции преобразования:chr (x) – аргумент x – номер символа типа BYTE – определяет значение символа поего номеру;ord (x) – аргумент x порядкового типа (логический, строковый, перечисляемый) –определяет порядковый номер аргумента (0 или 1 для логического x; целое 0 – 255 длястрокового x; целое 0 – 65535 для перечисляемого x);*round (x) – аргумент x вещественного типа – округляет число x до целого;175*trunc (x) – аргумент x вещественного типа – отсекает целую часть числа (типрезультата Longint);*frac (x) – аргумент x вещественного типа – определяет дробную часть числа (типрезультата Longint или Real, если отсутствует сопроцессор);c) функции и процедуры порядкового типа:odd (x) – аргумент x целого типа – выдает true, если x четно, и false, если x нечетно;pred (x) – аргумент x порядкового типа – находит предшествующий элемент x – 1;succ (x) – аргумент x порядкового типа – определяет последующий элемент x + 1;*процедура dec (x [, ] ) – аргумент x порядкового типа, – тип longint – уменьшаетзначение переменной x на величину Δ, а если не задано, то на 1(тогда x := pred (x));*процедура ins (x [,] ) – аргумент x порядкового типа,– тип longint –увеличивает значение переменной x на величину Δ, а если не задано, то на 1(тогда x:= succ (x));d) функции разного назначения:sizeof (x) – x порядкового типа – определяет максимальное значение порядковоготипа;аргумент x произвольного типа – определяет число байтов, занимаемыхаргументом x – тип результата Word;high (x) – x порядкового типа – определяет максимальное значение порядковоготипа;low (x) – x порядкового типа – определяет минимальное значение порядкового типа;*length (x) – аргумент x типа String – определяет в виде целого числа логическуюдлину строки;random (x) – аргумент типа Word – определяет псевдослучайное число (еслипараметр x опущен, результат – вещественное число из промежутка [0;1]; еслипараметр x задан, результат целое число из промежутка [0; x-1].
Для генерацииразличающихся последовательностей псевдослучайных чисел предназначен операторRANDOMIZE. Он, используя текущее время, сообщаемое компьютером, задаетначальное случайное число.Параметры подпрограммСписки формальных параметровПодпрограммы могут быть с параметрами и без параметров, т.е. список параметровможет отсутствовать. В подпрограммах без параметров можно использовать какглобальные, так и локальные объекты.Параметры подпрограмм позволяют при каждой активации (вызове) процедуры илифункции работать с объектами (значениями, переменными, процедурами и функциями),заданными в точке активации, т.е. при вызове.
В подпрограммах с параметрами всписок параметров включают объекты вызываемой программы, которые при разныхвызовах подпрограммы будут разными. Например, в списке параметров обязательнодолжно быть имя массива, если при вызове подпрограммы для обработки передается томассив А, то массив В.
Если при всех вызовах внутренней подпрограммы именаобрабатываемых ею данных и имена результатов одинаковы, т.е. подпрограммавызывается для одних и тех же фактических параметров, то целесообразно рассмотреть176возможность использования подпрограммы без параметров, с использованиемглобальных переменных.Все формальные параметры должны быть определены в списке формальныхпараметров заголовка подпрограммы под своими именами, известными в блокепроцедуры или функции, а также определен тип параметров.Примеры.PROCEDURE MNMX ( A : REAL ; M : ITEGER ; VAR MN, MX : REAL ) ;FUNCTION FACT ( B : MYTYPE ; N : INTEGER ) : INTEGER ;MYTYPE - тип параметра, определенный пользователем.MN, MX – параметры-переменные.
A, B, M, N – параметры-значения.При вызове подпрограммы фактические параметры должны быть в той жепоследовательности, что и соответствующие им формальные.В Паскале различают следующие формальных параметров: параметры-значения,параметры-переменные, параметры-константы, бестиповые параметры, параметрымассивы, строки открытого типа, процедурные параметры.Основные типы параметров подпрограммПараметры-значенияпередаютсяосновнойпрограммойввызываемуюподпрограмму через стек в виде их копий. Поэтому фактический параметрподпрограммой измениться не может.При передаче в подпрограмму из основной программы параметров-переменныхфактически через стек передаются их адреса в порядке, объявленном в заголовкеподпрограммы.
Поэтому подпрограмма имеет доступ к этим параметрам и может ихизменить.Следовательно, входные параметры подпрограммы могут быть как параметрамизначениями, так и параметрами-переменными. Выходные же - только параметрамипеременными.Нецелесообразно использовать в качестве параметров-значений массивы большихразмеров, так как это приведет к существенным дополнительным затратам ОП ивремени на их копирование из ОП вызывающей программы в ОП стека для вызваннойподпрограммы при многократных обращениях к этой подпрограмме.В версии 7.0 может быть использованы параметры-константы, которые вподпрограммах не изменяются. Их объявление осуществляется по форме:PROCEDURE P (CONST Par : WORD ) ;Если в теле процедуры появитсяоператор: P := <выражение> ;то это вызовет диагностическое сообщение об ошибке. В качестве параметровконстант можно использовать параметры любого типа, простые и сложные.В Паскале можно использовать параметры-переменные и параметры-константы безуказания типа.
В этом случае фактическим параметром может быть переменная любоготипа, являющаяся глобальным объектом – ответственность за правильностьиспользования параметра возлагается на программиста:FUNCTION EQUAL (VAR PARAM1, PARAM2; LEN : WORD ) ;177Параметр без типа перед его использованием в подпрограмме необходимо снабдитьопределенным типом в основной программе. Для формальных параметров PARAM1,PARAM2 в качестве фактических параметров можно использовать любые переменныепростого типа, массивы записи и пр.В качестве открытых параметров-переменных в языке Паскаль могут использоватьсямассивы и строки.
Открытые массивы – это параметры-массивы подпрограмм, размеркоторых не указывается в списке формальных параметров заголовка подпрограммы:FUNCTION SUM ( VAR A : ARRAY OF BYTE ) : BYTE ;Ключевое слово VAR в объявлении параметра открытого типа обязательно.Фактическим параметром открытого массива может быть массив любого размера.Тип элементов фактического массива должен совпадать с типом массива – формальногопараметра.
В качестве открытых массивов могут использоваться только одномерныемассивы. Внутри подпрограмм границы переданного массива могут определяться спомощью функций LOW (low (x) возвращает минимальное значение порядкового типа)и HIGH (high (x) возвращает максимальное значение порядкового типа). При этомрезультат вызова функции LOW всегда даст 0. А результат вызова функции HIGH –верхнее значение индекса при нумерации его элементов от 0.Открытые строки аналогичны открытым массивам. Для их использования послеобъявления имени программы необходимо включить директиву {$P+}. Формальныепараметры объявляются в виде string.
В качестве фактических параметров при этомможно использовать строки любой длины. Внутри подпрограммы строка-параметрвсегда трактуется по максимуму, т.е. как строка на 255 символов.В подпрограммах в качестве параметров можно использовать параметрыподпрограммы, т.е. параметры-процедуры и параметры-функции. Таким образомможно организовать подпрограмму, которая будет в процессе выполнения вызыватьдругую подпрограмму, но не уточняя, какую именно.Поскольку при описании списка формальных параметров в Паскале требуетсяуказание идентификатора типа для каждого параметра, вводится процедурный тип.Процедурный тип описывает класс процедур или функций, имеющих однотипныезаголовки. Определение процедурного типа аналогично заголовку подпрограммы, нопри этом имя подпрограммы не задается.
Например:TYPE PROC1 = PROCEDURE ( A, B, C, : REAL ; VAR D : REAL ) ;PROC2 = PROCEDURE ( VAR A, B, C, : REAL ) ;PROC3 = PROCEDURE ;{ процедура без параметров }FUNC1 = FUNCTION ( S : STRING ): REAL ;FUNC2 = FUNCTION : STRING ;{ без параметров }В данном примере PROC1, PROC2, PROC3, FUNC1, FUNC2 - имена типовпроцедурных параметров, идентификаторы.Использование подпрограмм, в которых в качестве формальных параметровприменяются процедурные типы и в качестве фактических – имена подпрограмм,требует директивы компилятора {$f+} или опции компилятора OPTIONS / COMPILE /FORCE FAR CALLS – дальний вызов подпрограмм.178МодулиОсновные сведения о модуляхНа практике, когда речь идет о больших программных разработках, возможностейпроцедур и функций оказывается недостаточно.














