Список параметров процедуры (функции)
Список параметров процедуры (функции) состоит из описаний переменных и оформляется по тем же правилам, что и объявления переменных в разделе 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.
Имеется матрица размерностью MxN. Написать программу, выполняющую следующие функции:
1. Ввод c клавиатуры элементов матрицы.
2. Обработку матрицы.
3. Вывод результатов обработки матрицы на дисплей.
Задача №2.
Написать программу, решающую задачу №1, оформив обработку матрицы процедурой.