Механизм параметров
В список параметров включаются исходные данные для работы процедуры/функции (входные параметры) и, если надо, указания, куда поместить результаты работы процедуры (выходные параметры).
Существует два способа передачи данных через список параметров из вызывающей программы в процедуру. Первый способ заключается в том, что процедуре передается некоторое данное в виде его значения, например, если данное числового типа, передается само число. Второй способ заключается в том, что передается не значение данного, а адрес ячейки, где это данное находится (говорят, что передается имя переменной). Таким образом, параметры могут передаваться по значению и по имени. В каких случаях какой способ следует использовать? Обычно входные параметры передаются в процедуру по значению, а выходные – всегда по имени.
Есть некоторые особенности при передаче массивов (и других составных данных большого размера) в качестве фактических параметров. Даже если массив представляет собой входные данные и не меняется в процессе выполнения процедуры, его обычно передают по имени, так как это требует передачи только адреса начала массива, а не копии всего массива, как это потребовалось бы при передаче массива по значению. Кроме того, массив основной программы (фактический параметр) и массив в списке формальных параметров должны иметь один и тот же тип – т.е. должен использоваться один и тот же явный описатель.
Отметим, что когда параметры передаются по имени, они занимают в памяти по 4 байта. Подробнее об этом смотри лабораторную работу № 9.
Примеры написания списков формальных и фактических параметров:
..(A,B,C:real;VAR X1,X2:real;VAR N:integer); – формальные,
..(0.762,Alfa,C[3]-1.2,X,Y,Num); соответствующие фактические.
Для передачи массива в процедуру:
TYPE
Vect = array[1..10] of real;
Mas5x8 = array[1..5,1..8] of integer;
. . .
VAR
C1,C2: Vect;
A: Mas5x8;
Metod: Integer;
. . .
PROCEDURE GetMatr(M:integer; Var X,Y:Vect;
Var Z:Mas5x8;...);
VAR A1,C1:integer;
. . .
Begin
<Операторы тела процедуры >
End;
FUNCTION MinValueMatr( Var Z:Mas5x8; M,N:integer)
:Integer;
VAR MinZ, I, j :integer;
Begin
<Операторы тела функции >
MinValueMatr:= MinZ;
End;
BEGIN
<Операторы основной программы >
. . .
GetMatr(0, C2, C1, A,...); {обращение к процедуре}
. . .
If MinValueMatr(A,5,7) div 2 < 3 then {обращение к функции}
. . .
END.
Разбор контрольного варианта
Задание
Таблица 24. Данные к заданию 31 варианта
№ вар. | Программа | Процедуры (Функции) | M<= | N<= | Файл с данными |
Прямоугольный массив заполнить числами из файла, начиная с 33 числа. С помощью функции в исходном массиве сделать элементы последнего столбца равными сумме всех четных элементов соответствующей строки. | 1)Исходный и полученный массивы печатать процедурой. 2)Построить функцию, которая возвращает сумму четных по значению элементов заказанной строки прямоугольного массива. | DATI.BIN |
Таблица идентификаторов
Составляется как для основной программы, так и для каждой подпрограммы пользователя.
Таблица 25. Идентификаторы программы 31 варианта
Имя | Тип | Р-р (байт) | Назначение |
Основная программа | |||
KorrMass | Имя программы | - | Обработка массива |
Massiv | Описатель типа | - | Описатель целочисл. массивов |
Stroka | Описатель типа | - | Описатель строки до 30 символов |
M | Целое | Количество строк массива | |
N | Целое | Количество столбцов массива | |
i | Целое | Номер текущей строки массива | |
j | Целое | Номер текущего столбца массива | |
Fin | Двоичный файл прямого доступа | Файл с исходн. целыми числами | |
Fout | Последовательный символьный файл | Файл с результатами работы | |
Ouest1 | Инициализирован-ная строка | Запрос числа строк массива | |
Ouest2 | Инициализирован-ная строка | Запрос числа столбцов массива | |
A | Целочисленный массив | Обрабатываемый массив | |
InpMN | Имя процедуры | - | Ввод размеров массива |
PrintMas | Имя процедуры | - | Вывод массива в файл протокола |
DATI.BIN | Строка – константа | Имя набора данных с числами | |
Umnik_7.res | Строка – константа | Имя набора данных с протоколом | |
Sum | Имя функции | - | Суммирование четных значений |
InpMN –-Процедура ввода размеров массива | |||
Txt | Строка | Формальный параметр – строка запроса | |
Kol | Адрес целочисленной переменной | Формальный параметр – имя переменной для результата ввода | |
MaxK | Целое | Формальный параметр – предельное возможное значение | |
PrintMas–- Процедура вывода массива в файл протокола (распечатки массива) | |||
Txt | Строка | Формальный параметр – текст заголовка | |
Mas | Адрес массива | Формальный параметр – имя выводимого массива | |
NStr | Целое | Формальный параметр – число строк массива | |
NKol | Целое | Формальный параметр – число столбцов массива | |
i | Целое | Номер строки | |
j | Целое | Номер столбца | |
Sum – Функция вычисления суммы четных элементов заданной строки массива | |||
Mas | Адрес массива | Формальный параметр – имя исходного массива | |
N | Целое | Формальный параметр – число столбцов массива | |
St | Целое | Формальный параметр – номер обрабатываемой строки | |
J | Целое | Номер элемента | |
S | Целое | Сумма | |
Odd | Стандартная логическая функция | - | Проверка нечетности аргумента |
Блок-схема алгоритма