Список параметров процедуры (функции)

Список параметров процедуры (функции) состоит из описаний переменных и оформляется по тем же правилам, что и объявления переменных в разделе 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, оформив обработку матрицы процедурой.

Наши рекомендации