Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по Паскалю.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
2.06 Mб
Скачать

6.1. Параметры подпрограмм

В Паскале существует 4 вида параметров: значение, константа, переменная и нетипизованное значение. Они характеризуются следующим:

  1. Группа параметров без предшествующего ключевого слова и завершенная указанием типа является списком параметров-значений.

  2. Группа параметров, предваренных словом const и завершенная определением типа, является списком параметров-констант.

  3. Группа параметров, предваренная словом var и завершенная указанием типа, является списком параметров-переменных.

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

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

Параметры-константы доступны только для чтения.

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

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

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

Ниже приводится вариант программы РF, в котором используется процедура для получения двух значений и функция для вычисления отношения:

program РF;

var A,B: integer;

Ratio : real;

procedure GetData(var X,Y : integer);

begin

Write('Введите два числа: ');

Readln(X,Y);

end;

function GetRatio(I,J : integer) : real;

begin

GetRatio := I/J;

end;

begin

GetData(A,B);

Ratio := GetRatio(A,B);

Writeln('Отношение равно ',Ratio);

Readln;

end.

Эта программа иллюстрирует использование процедур и функций.

При компиляции и запуске программы первым в теле программы выполняется оператор GetData(A, В). Этот тип оператора называется вызовом процедуры. При обработке этого вызова программа выполняет операторы в GetData, заменяя Х и Y (формальные параметры) на A и В (фактические параметры). Ключевое слово var перед Х и Y в операторе вызова процедуры GetData указывает, что фактические параметры должны быть переменными, и что значения переменных могут быть изменены и переданы обратно вызывающей программе. Поэтому процедуре GetData нельзя передавать литералы, константы, выражения и так далее. При завершении выполнения GetData управление передается в основное тело программы оператору, следующему за вызовом GetData.

Этим следующим оператором является вызов функции GetRatio. Отметим здесь некоторые важные отличия. Во-первых, GetRatio возвращает значение, которое затем должно быть где-нибудь использовано. В данном случае это значение присваивается Ratio. Во-вторых, в основном теле функции значение присваивается GetRatio. Таким образом функция определяет, какое значение следует возвратить. В-третьих, перед формальными параметрами I и J здесь отсутствует ключевое слово var. Это означает, что фактические параметры могут быть любыми целочисленными выражениями, например, Ratio := GetRatio(A+В, 300), и что даже если значения формальных параметров в теле функции будут изменены, новые значения не будут переданы обратно вызывающей программе. Это, кстати, не является различием между процедурами и функциями. Вы можете использовать оба типа параметров с любым видом подпрограммы [8,9].

Вопросы:

  1. Какие типы параметров могут передаваться в подпрограммы?

  2. В чем их отличия?