- •Лабораторная работа № 5 Цель работы
- •Теоретическая часть
- •Процедура
- •Функция
- •Формальные и фактические параметры
- •Процедура exit
- •Рекурсивные процедуры и функции
- •Директивы подпрограмм
- •Варианты заданий
- •Лабораторная работа № 6 Цель работы
- •Теоретическая часть
- •Стандартные подпрограммы для всех файлов
- •Стандартные подпрограммы для текстовых файлов
- •Стандартные подпрограммы для типизированных файлов
- •Варианты заданий
- •Содержание и оформление отчета
- •Литература
- •Паскаль: процедуры и функции, работа с файлами
Формальные и фактические параметры
Формальные параметры подпрограммы указывают, с каким параметрами следует обращаться к этой подпрограмме (количество параметров, их порядок, типы). Фактические параметры – параметры, указываемые при вызове подпрограммы.
Все формальные параметры можно разбить на следующие категории:
параметры-значения (не меняются подпрограммой в основной программе);
параметры-переменные (подпрограмма может их изменить в основной программе);
параметры-константы;
параметры-процедуры и параметры-функции.
Имена параметров могут быть любым идентификатором, в том числе совпадать с имена объектов программы. В этом случае параметр основной программы с таким именем становится недоступным для непосредственного использования подпрограммой.
Пример 5:
var A, B : Integer; function Sum2(A : Integer) : Integer; var B : Integer; begin B := 15; A := A + 2; Sum2 := A; end; begin A := 2; B := 3; writeln(A); writeln(B); writeln(Sum2(A)); writeln(Sum2(4)); writeln(A); writeln(B); end.
|
Результат работы программы в примере 5 (с добавленными комментариями) будет следующим:
2 3 4 6 2 (значение A не изменилось!) 3 (значение B не изменилось!) |
В заголовке подпрограммы нельзя вводить новый тип, например, следующая запись будет ошибочной:
function Max(A : Array [1..100] of Real) : Real; |
В этом случае нужно сначала объявить тип-массив, а затем использовать его в заголовке.
type TArr=array[1..100] of Real; function Max(A : TArr) : Real; |
Параметры значения
Передаются основной программой в подпрограмму через стек в виде копии переменной, поэтому собственный параметр программы измениться не может.
Параметр-значение указывается в заголовке подпрограммы своим именем и через двоеточие – типом.
function Mult(X, Y : Integer) : Real; |
Параметры-переменные
При передаче их в подпрограмму фактически через стек передаются их адреса в порядке, объявленном в заголовке подпрограммы. Т.о., подпрограмма имеет доступ к этим параметрам и может их изменять.
При описании параметра-переменной перед ее именем записывается зарезервированное слово var. Действие var распространяется до ближайшей точки запятой.
Пример 6:
Program Test; var M : Real; procedure Mult(X, Y : Real; var Result : real); begin Result := X * Y; end; begin M := 15; Mult(6, 1.5, M); writeln('M=',M:10:2); end. |
В примере 6 значение переменной M измениться внутри подпрограммы Mult. Результат работы программы:
M=3.00 |
Пример 7:
Program Test; type TArr=array[1..100] of Real; var A : TArr; i : Integer;
function Max(var Mass : TArr; N : Byte) : Real; var Ma, i : Integer; begin Ma := Mass[1]; for i := 2 to N do if Mass[i]>Ma then Ma := Mass[i]; Max := Ma; end; begin {Ввод 5 элементов массива} for i := 1 to 5 do begin write('A[',i,']:'); readln(A[i]); end; {Поиск и вывод максимального} writeln('Максимальный элемент=',Max(A, 5):10:2); end. |
В примере 7 реализована функция поиска максимального элемента массива. Пример работы программы приведен ниже.
A[1]:3 A[2]:1 A[3]:7 A[4]:1.2 A[5]:4 Максимальный элемент=7 |
В примере 7 можно было описать массив как переменную-значение:
function Max(Mass : TArr; N : Byte) : Integer; |
При этом было бы исключено несанкционированное изменение его элементов. Но первый вариант улучшает быстродействие и экономит память, так как в этом случае в стеке не создается копия массива.
Параметры-константы
В этом случае в подпрограмму передается адрес переменной, но предусматривается защита ее изменения еще на стадии компиляции. Перед именем такого параметра записывается зарезервированное слово const. Тип параметра-константы может быть любой, за исключением типа-файла.
Пример 8
Program Test; var St : String; function NewString(const S : String) : String; begin NewString := '('+S +')'; end; begin St := 'Example'; writeln(NewString(S)); end. |
В результате работы программы из примера 8 на экране будет выведено:
(Example) |
Параметр-константу нельзя передавать в другую подпрограмму в качестве фактического параметра-переменной.
Параметры без типа
Можно использовать параметры-переменные и параметры-константы без указания типа. В этом случае фактический параметр может быть переменной любого типа, а ответственность за правильность использования такого параметра возлагается на программиста.
Параметр без типа внутри подпрограммы типа не имеет, поэтому перед использованием его следует привести к конкретному типу. При этом полученный результат может быть любого размера (см. пример 9).
Пример 9:
Program Test; var A : array [1..5] of Integer; i : Integer; function Max(var Mass; N : Byte) : Integer; type TArray = array [1..MaxInt] of Integer; var I, Ma : Integer; begin Ma := TArray(Mass)[1]; {Приведение к типу TArray и взятие первого элемента} for i := 2 to N do if TArray(Mass)[i]>Ma then Ma := TArray(Mass)[i]; Max := Ma; end; begin {Ввод 5 элементов массива} for i := 1 to 5 do begin write('A[',i,']:'); readln(A[i]); end; {Поиск и вывод максимального} writeln('Максимальный элемент=',Max(A, 5):10:2); end.
|
Удобство использования параметров без типа заключается, например, в возможности нахождения максимального элемента в любом массиве с элементами целого типа, тогда как рассмотренная в примере 7 для параметров-переменных функция могла работать только с массивами типа TArr.
Массивы открытого типа
В качестве параметров можно использовать массивы открытого типа, у которых не задаются размеры, например, массив целых чисел:
function Max(var Mass : array of Integer) : Integer; |
Подпрограмма может обрабатывать массивы любого размера. Элементы фактического массива должны быть указанного в заголовке типа. Индексация элементов массива начинается с 0. Максимальный индекс элемента равен значению функции High.
Пример 10:
function Max(var Mass : array of Integer) : Integer; var I, Ma : Integer; begin Ma := Mass[0]; for i := 1 to High(Mass) do if Mass[i]>Ma then Ma := Mass[i]; Max := Ma; end; |
В примере 10 описана функция нахождения максимального элемента в массиве с элементами целого типа. В отличие от примера 9 здесь нет необходимости в приведении типов и указании количества элементов массива.