Список параметров процедуры (функции) состоит из описаний переменных и оформляется по тем же правилам, что и объявления переменных в разделе var, с двумя отличиями:
1) Перед любым списком переменных может стоять ключевое слово var. Это означает, что в процедуру передаются не значения переменных, а сами переменные (точнее их адреса в памяти). Все изменения, производимые с переменными этого списка в процедуре (функции), будут производиться и с той переменной, которая будет стоять на месте этого параметра в вызове процедуры (функции). Через такие переменные и получают результат работы процедуры.
Если перед списком переменных ключевое слово var отсутствует, то в процедуру передается только значение переменной. То есть после выполнения процедуры значение таких переменных остается прежним, хотя внутри процедуры может и изменяться.
2) В списке параметров процедуры (функции) нельзя использовать описания интервалов, массивов и файлов. Они должны быть описаны заранее, в разделе описания типов type, а в списке параметров процедуры можно использовать их имена.
Пример программы
program matr(input, output);
{ Вводит с клавиатуры матрицу размером от 1х1 до MaxIndex x MaxIndex
Вычисляет сумму элементов каждого столбца и
Записывает результат в указанный файл в текстовой форме. }
Const
MaxIndex = 10; { Максимальный индекс массива }
Type
index = 1..MaxIndex; { Индекс массива }
matrix = array[ index, index ] of real; { Массив данных }
vector = array[ index ] of real; { Вектор результатов }
Var
Data: matrix; { Массив данных }
Result: vector; { Массив результатов }
Raw, { Число строк матрицы }
Colon: index; { Число столбцов матрицы }
cnt: integer; { Счетчик цикла }
query: integer; { Подтверждение }
procedure InpSize(var Raw, Col: index);
{ Процедура ввода размера массива }
begin {InpSize}
repeat { Ввод числа строк с проверкой диапазона }
Write('Введите число строк матрицы (от 1 до ', MaxIndex, '):');
readln(Raw);
until (Raw >= 1) and (Raw <= MaxIndex);
repeat { Ввод числа столбцов с проверкой диапазона }
Write('Введите число солбцов матрицы (от 1 до ', MaxIndex, '):');
readln(Col);
until (Col >= 1) and (Col <= MaxIndex);
end; {InpSize}
procedure InpData(var Data: matrix; Raw, Col: index);
{ Процедура ввода данных }
Var
rw, cl: index; { Индексные переменные }
begin {InpData}
Writeln('Введите элементы матрицы (', Raw, ' строк, ', Col, ' столбцов)');
for rw:= 1 to Raw do
for cl:= 1 to Col do
Begin
Write(' Элемент [', rw, ', ', cl, ']= ');
readln(Data[ rw, cl ]);
end;
end; {InpData}
procedure OutData(Data: matrix; Raw, Col: index);
{ Вывод массива на дисплей }
Var
rw, cl: index; { Индексные переменные }
cnt: integer; { Счетчик выведенных элементов }
begin {OutData}
Writeln; { Пропустить строку }
Writeln('Введена матрица (', Raw, ' строк, ', Col, ' столбцов)');
Writeln; { Пропустить строку }
cnt:= 0;
for rw:= 1 to Raw do
for cl:= 1 to Col do
Begin
Write(' Элемент [', rw, ', ', cl, ']= ', Data[ rw, cl ]);
cnt:= succ(cnt);
if not odd(cnt) then Writeln;
end;
Writeln;
end; {OutData}
procedure CountRes(Data: matrix; var Res: vector; Raw, Col: index);
{ Вычисления результата }
Var
rw, cl: index; { Индексные переменные }
begin {CountRes}
Writeln; { Пропустить строку }
Writeln('Подсчет сумм элементов.');
Writeln; { Пропустить строку }
for cl:= 1 to Col do { Перебор столбцов }
Begin
Writeln('Столбец ', cl);
Res[ cl ]:= 0; { Начальное значение (очистка) }
for rw:= 1 to Raw do { Подсчет суммы }
Res[ cl ]:= Res[ cl ] + Data[ rw, cl ]; { Накопление суммы }
end;
end; {CountRes}
procedure OutResult(Res: vector; Col: index);
{ Процедура выода данных }
Type
fl_real = text; { Тип файла для вывода }
Var
ouf: fl_real; { Выходной файл }
fname: string; { Имя файла }
cnt: index; { Счетчик цикла }
begin {OutResult}
Writeln; { Пропустить строку }
Writeln('Программа запишет результат в указанный файл.');
Write('Имя файла? ');
readln(fname); { Читает строку с клавиатуры в переменную nm }
assign(ouf, fname); { Назначает имя файла файловой переменной }
reWrite(ouf); { Открывает файл на запись }
for cnt:= 1 to Col do { Запись элемента cnt в файл fl }
Write(ouf, Res[ cnt ], ' ');
close(ouf); { Закрыть файл }
Writeln; { Пропустить строку }
Writeln('Готово.');
end; {OutResult}
Begin
Writeln; { Пропустить строку }
Writeln('Программа:');
Writeln(' Вводит с клавиатуры матрицу размером от 1х1 до ', MaxIndex, 'x', MaxIndex);
Writeln(' Вычисляет сумму элементов каждого столбца и');
Writeln(' Записывает результат в указанный файл в текстовой форме.');
Writeln; { Пропустить строку }
repeat
InpSize(Raw, Colon); { Ввод размеров матрицы }
InpData(Data, Raw, Colon); { Ввод данных }
OutData(Data, Raw, Colon); { Вывод данных }
Write('Все правильно (1=да, 0=нет)?');
readln(query);
until query = 1;
CountRes(Data, Result, Raw, Colon); { Вычисление результата }
OutResult(Result, Colon); { Вывод результата }
end.
Задача №1.
Имеется матрица размерностью M x N. Написать программу, выполняющую следующие функции:
1. Ввод c клавиатуры элементов матрицы.
2. Обработку матрицы.
3. Вывод результатов обработки матрицы на дисплей.
Задача №2.
Написать программу, решающую задачу №1, оформив обработку матрицы процедурой.