- •7.1. Необходимость структуризации в программировании
- •7.2. Подпрограммы в языке паскаль
- •7.2.1. Стандартные библиотечные модули
- •7.2.2. Встроенные функции и процедуры
- •7.3. Процедуры и функции пользователя
- •7.3.1. Процедуры
- •7.3,2. Функции
- •7.3.3. Механизм передачи параметров
- •7.3.4. Область действия параметров
- •7.3.5. Рекурсии
- •7.3.6. Нетрадиционное использование подпрограмм
7.3.3. Механизм передачи параметров
Как было показано в приведенных выше примерах программ с использованием процедур и функций, в заголовке процедуры или функции может быть задан список параметров, которые называются формальными. Название "формальные" эти параметры получили в связи с тем, что в этом списке заданы только имена для обозначения исходных данных и результатов работы процедуры, а при вызове подпрограммы на их место будут подставлены конкретные значения (выражений) и имен. Этот список указывается после имени подпрограммы и заключается в круглые скобки.
Список формальных параметров, указываемых в заголовке подпрограммы, может включать в себя:
-
параметры-значения;
-
параметры-переменные, перед которыми должно стоять служебное слово var и за которыми указывается их тип;
-
параметры-процедуры, перед которыми должно стоять служебное слово procedure;
-
параметры-функции, перед которыми должно стоять служебное слово function и после которых указывается тип значения, возвращаемого функцией в ос новную программу;
-
нетипизированные параметры, перед которыми должно стоять служебное слово var и отсутствует указание типа.
В списке должны быть перечислены имена формальных параметров и их типы. Имя параметра отделяется от типа двоеточием, а параметры друг от друга — точкой с запятой. Имена параметров одного типа можно объединять в подсписки, в которых имена отделяются друг от друга запятой.
Примеры заголовков:
Между формальными и фактическими параметрами должно быть полное соответствие:
-
формальных и фактических параметров должно быть одинаковое количество;
-
порядок следования фактических и формальных параметров должен быть один и тот же;
-
тип каждого фактического параметра должен совпадать с типом соответст вующего формального параметра.
Параметры-значения. Параметры-значения используются только для передачи исходных данных из основной программы в подпрограмму (процедуру или функцию), в списке формальных параметров они перечисляются через запятую с обязательным указанием их типов, как было, например, в выше приведенных примерах:
procedure Abort(Msg: string);
function Step(N : integer; X : real): real;
Если формальный параметр объявлен как параметр-значение, то фактическим параметром может быть произвольное выражение. При вызове подпрограммы фактические параметры вычисляются и используются как начальные значения формальных параметров, т. е. осуществляется подстановка значений. Если формальный параметр определен как параметр-значение, то перед вызовом процедуры это значение вычисляется, полученный результат помещается во временную память и передается процедуре. Даже если фактический параметр — простейшее выражение в виде константы или переменной, все равно процедуре будет передана лишь копия этой константы (переменной). В процессе выполнения подпрограммы формальные параметры могут изменяться, но это никак не отразится на соответствующих фактических параметрах-переменных, которые сохранят те значения, которые имели до вызова подпрограммы, так как меняются не они, а их копия. Поэтому параметры-значения нельзя использовать для передачи результатов из подпрограммы в основную программу.
Пример программы с использованием передачи параметров по значению:
При вызове процедуры Sum_Square с фактическими параметрами А, В значения этих параметров (один раз) копируются в соответствующие формальные параметры X, Y, и дальнейшие преобразования формальных параметров X,Y внутри процедуры Sum_Square уже никак не влияют на значения переменных А, В.
Упражнение 3. Запустите интегрированную среду программирования. Введите текст программы Par_Znach, запишите файл на диск под соответствующим именем, а затем откомпилируйте его. После того как компиляция выполнится успешно, задайте для просмотра в окне отладчика величины А, В, X, Y. Установите видимыми одновременно окно редактора с текстом программы и окно просмотра. Исполните программу в пошаговом режиме с заходом в процедуру и пронаблюдайте за изменениями значений переменных в основной программе и в процедуре, обратите внимание на передачу значений при вызове процедуры ее формальным параметрам, а также на то, что в процессе выполнения процедуры и по ее окончании значения переменных А, В не изменялись.
Параметры-переменные. Параметры-переменные используются для определения результатов выполнения процедуры и в списке формальных параметров перечисляются после зарезервированного слова var с обязательным указанием типа. Каждому формальному параметру, объявленому как параметр-переменная, должен соответствовать фактический параметр в виде переменной соответствующего типа, например:
Если формальный параметр определен как параметр-переменная, то при вызове процедуры ей передается сама переменная, а не ее копия,и изменение параметра-переменной приводит к изменению фактического параметра в вызывающей программе. Следовательно, исходные данные в процедуру из программы могут передаваться как через параметры-значения, так и через параметры-переменные, а результаты работы процедуры возвращаются в вызывающую программу только через параметры-переменные .
Пример программы, использующей параметры-переменные:
Упражнение 4. Запустите интегрированную среду программирования. Введите текст программы Sum_Sub_Square и запишите файл на диск под соответствующим именем, а затем откомпилируйте его. После того как компиляция выполнится успешно, задайте для просмотра в окне отладчика величины А, В, Sum, Sub, SumAB, SubAB. Установите видимыми одновременно окна редактора с текстом программы и окно просмотра. Исполните программу в пошаговом режиме с заходом в процедуру и пронаблюдайте за изменениями значений переменных в основной программе и в процедуре, обратив внимание на передачу значений при вызове процедуры ее формальным параметрам, а также на то, что значения переменных SumAB и SubAB в основной программе изменялись в процессе выполнения процедуры.
Параметры-процедуры и параметры-функции. В качестве расширения стандартного Паскаля, Турбо Паскаль позволяет рассматривать процедуры и функции как объекты, которые можно присвоить переменным и которые могут выступать в качестве параметров; процедурные типы делают это возможным.
Как только процедурный тип определен, можно объявлять переменные этого типа. Такие переменные называются процедурными переменными. Они могут быть использованы в качестве формальных параметров при вызове процедур и функций. Подобно тому, как целочисленной переменной можно присвоить целочисленное значение, процедурной переменной можно присвоить процедурное значение. Такое значение может, конечно, быть и другой процедурной переменной, но может также §ыть идентификатором процедуры или функции. В этой ситуации объявление процедуры или функции можно рассматривать как особый вид объявления константы, значением которой является процедура или функция.
Как и во всех других операциях присваивания, переменная в левой части и переменная в правой части оператора присваивания должны быть совместимыми по присваиванию. Для того чтобы считаться совместимыми по присваиванию, процедурные типы должны иметь одинаковое число параметров, параметры в соответствующих позициях должны быть тождественных типов; наконец, типы результатов функций должны быть идентичны. Дополнительно к совместимости типов процедура или функция должны удовлетворять следующим требованиям, если они присваиваются процедурной переменной.
-
Они должны быть объявлены с директивой far (использование дальнего типа зызова подпрограмм) и откомпилированы в состоянии {$F+};
-
Они не должны быть:
стандартной процедурой или функцией;
вложенной процедурой или функцией;
inline процедурой или функцией;
interrupt процедурой или функцией.
При использовании параметров-процедур или параметров-функций в списке ~еред соответствующими формальными параметрами указывается зарезервирован-~*ое слово procedure или function, например:
В списке формальных параметров процедуры Exampl:
К, L — параметры-значения;
М — параметр-переменная;
Prob — параметр-процедура;
Step — параметр-функция, результатом выполнения которой будет значение вещественного типа.
При вызове подпрограммы на место формальных параметров-процедур и параметров-функций осуществляется подстановка имен соответствующих фактических процедур или функций. При этом, если процедуры и функции, фигурирующие в качестве фактических параметров, имеют, в свою очередь, параметры, они могут быть только параметрами-значениями.
Параметры процедурного типа особенно полезны в ситуациях, когда над множеством процедур или функций'выполняются общие действия. Примером использования параметров-функций может служить программа, которая с помощью одной и той же процедуры печати таблицы выводит на экран три таблицы арифметических функций (сложения, умножения и произведения суммы на разность чисел), каждая из которых выполняется отдельной функцией.
Примечание. {$F+} — указание (директива) компилятору Турбо Паскаль на использование дальнего (far) типа вызова для корректной обработки вызова процедуры Туре_ТаЫ с параметрами-функциями.
В данной программе процедура Туре_ТаЫ представляет собой общее действие, выполняемое над параметрами-функциями Add, Mult, Funny. После запуска программы сначала вызывается процедура Туре_ТаЫ для фактических параметров 10, 10 и Add, в результате чего формальным параметрам X и Y присваиваются значения чисел 10 и 10, а формальному параметру Operation процедурного типа Func присваивается имя фактической функции Add. В результате этого на экран будет
•введена таблица сложения от 1 до 10. Затем процедура Туре_ТаЫ вызывается к -слолнению для фактических параметров 10, 10 и параметра-функции Mult, в ре-:;-льтате чего на экран будет выведена таблица умножения от 1 до 10. Аналогично = ызов процедуры Туре_ТаЫ с параметрами 10, 10 и Funny даст в результате на эк--~-не таблицу произведения суммы на разность чисел от 1 до 10.
Упражнение 5. Запустите интегрированную среду программирования. Введите текст тгограммы Demo_Tabl и запишите файл на диск под соответствующим именем, а затем от-v змпилируйте его. После того как компиляция выполнится успешно, исполните программу : пошаговом режиме с заходом в процедуру и пронаблюдайте за вызовом функций вычисле- ' -:ия суммы, произведения двух чисел или произведения их суммы и разности. Обратите внимание на исполнение оператора Write(Operation(X,Y):5), как в зависимости от фактического значения параметра-функции Operation процедурного типа Func осуществляется вызов раз-~гчных функций Add, Mult или Funny. Попробуйте удалить строку с директивой компиля-т эру об использовании дальнего типа вызова или возьмите в фигурные скобки описание "гоцедурного типа Func и пронаблюдайте за результатом. В случае появления ошибок нажа-~!гм клавиши F1 получите справку о причинах ошибки и рекомендации на коррекцию.