Процедуры и функции. В языке PASCAL определяются два типа подпрограмм - процедуры и функции
В языке PASCAL определяются два типа подпрограмм - процедуры и функции. Любая подпрограмма обладает той же структурой, который обладает и вся программа. При вызове подпрограммы выполнение основной программы приостанавливается и управление передается в подпрограмму. По окончании работы подпрограммы управление возвращается основной программе. Основное, не формальное, различие между процедурой и функцией состоит в том, что процедура только выполняет какую-либо законченную последовательность действий, не возвращая результата работы в основную программу, а функция и выполняет действия, и возвращает результат. Например, вызов функции М:= MIN (X, Y) вернет в основную программу значение наименьшего из двух чисел и это значение будет присвоено переменной М. Любая подпрограмма должна быть описана до того, как она будет вызвана в программе или в другой подпрограмме. Все переменные, которые использует подпрограмма, могут быть либо глобальные, т. е. объявленные в основной программе и доступные как программе, так и всем ее подпрограммам, либо локальные, объявленные внутри подпрограммы и доступные только ей самой. Обмен информацией между основной программой и подпрограммой может осуществляться только с помощью глобальных переменных. Подпрограмма может непосредственно использовать любые глобальные переменные за исключением тех, которые имеют те же имена, что и ее локальные переменные. Любая процедура начинается с заголовка, который является обязательным. Он состоит из зарезервированного слова PROCEDURE, за которым следует идентификатор имени процедуры, а далее в круглых скобках - список формальных параметров: PROCEDURE <ИМЯ ПРОЦЕДУРЫ> (<СПИСОК ФОРМАЛЬНЫХ ПАРАМЕТРОВ>); За заголовком следуют такие же разделы, что и в основной программе. Завершается процедура точкой с запятой. Досрочный выход из подпрограммы возможен только с помощью EXIT. При вызове процедуры необходимо указать ее имя и в круглых скобках список фактических параметров, которые должны совпадать по количеству и типам с формальными параметрами. Все формальные параметры можно разбить на 4 категории: - параметры-значения (эти параметры в основной программе подпрограммой не изменяются); - параметры-переменные (эти параметры подпрограмма может изменить в основной программе); - параметры-константы (используются только в версии 7.0); - параметры-процедуры и параметры-функции. Параметры-значения передаются основной программой в подпрограмму через стек в виде их копий, и, следовательно, собственный параметр программы подпрограммой измениться не может. Параметр-значение указывается в заголовке подпрограммы своим именем и - через двоеточие - типом. Тип параметра-значения может быть любым, за исключением файлового. Если параметров-значений одного типа несколько, их можно объединить в одну группу, перечислив их имена через запятую, а затем уже указать общий тип. Отдельные группы параметров отделяются друг от друга точкой с запятой. При передаче параметров-переменных в подпрограмму фактически передаются их адреса в порядке, объявленном в заголовке подпрограммы. Это означает, что подпрограмма имеет доступ к этим параметрам и может их изменять. Параметр-переменная указывается в заголовке подпрограммы аналогично параметру-значению, но только перед именем параметра записывается зарезервированное слово VAR. Действие слова VAR распространяется до ближайшей точки с запятой, т. е. в пределах одной группы. Параметр-константа указывается в заголовке подпрограммы подобно параметру-значению, но перед именем параметра записывается зарезервированное слово CONST, действие которого распространяется до ближайшей точки с запятой. Тип параметра, значения может быть любым за исключением файлового. Параметр-константу нельзя передавать в другую подпрограмму в качестве фактического параметра. В TURBO PASCAL можно использовать параметры-переменные и параметры-константы без указания типа. В этом случае фактический параметр может быть переменной любого типа, а ответственность за правильность использования того или иного параметра возлагается на программиста. В версии 7.0 можно в качестве параметров-переменных использовать массивы и строки открытого типа, у которых не задаются размеры. Для дополнительной информации о размещении подпрограмм используются директивы. Одной из самых употребляемых директив является FORWARD. Если одна подпрограмма использует другую, а та, в свою очередь, первую, то построить их описание без FORWARD невозможно. Директива FORWARD позволяет как бы разбить на две части одну из подпрограмм. В этом случае сначала записывается полный заголовок первой подпрограммой. Тело этой подпрограммы заменяется директивой FORWARD. Затем полностью описывается вторая подпрограмма, а уже после этого полностью описывается первая подпрограмма. Рассмотрим следующие задачи. Задача 9.1 Написать процедуру ввода элементов матрицы Т. Описание процедуры можно построить следующим образом: PROCEDURE TAB(VAR L, К: INTEGER); VAR I, J: INTEGER; BEGIN FOR I:= 1 TO L DO BEGIN FOR J:= 1 TO К DO BEGIN WRITE('T [', I,',', J,'] ='); READ(T[I, J]) END;
|