Массивы – параметры процедур и функций Массив является структурным типом данных, поэтому для того, чтобы передать массив в качестве параметра в подпрограмму, необходимо в разделе типов основной программы объявить требуемый тип «массив». Например,
TYPE Vect =array[1..20] of real; { тип одномерного массива}
TMatrix=array[1..10,1..10] of real; { тип двумерного массива} .
С помощью имени этого объявленного пользователем типа описывается массив – параметр подпрограммы в списке формальных параметров и соответствующий ему фактический параметр, используемый в операторе вызова подпрограммы.
Рассмотрим пример, в котором функции передается одномерный массив в качестве параметра. Пусть требуется написать программу, которая находит произведение максимальных элементов двух одномерных массивов. Для определения максимального элемента массива использовать функцию.
Постановка задачи.
Входные данные:
A , B – одномерные массивы размера n1 и n1, соответственно.
Выходные данные:
Proizv – произведение максимальных элементов массивов A и B.
Метод решения: для определения максимального элемента массива использовать функцию.
Программа будет включать внутреннюю функцию MaxEl. Алгоритм основной программы Main представлен на рис. 9.6, алгоритм функции MaxEl представлен на рис. 9.7.
Текст программы на языке Паскаль.
Program Main;
Type Vect = array[1..20] of real;
Var A,B: Vect;
n1, n2, I: integer;
Proizv, MaxA, MaxB: real;
Function MaxEl(M: Vect; nm : integer): real;
Var I: integer;
Max: real;
Begin
Max:=M[1] ;
For I:=1 to n1 do
If (M[I]>Max) then
Max:=M[I];
MaxEl:=Max;
End;
Begin
Writeln('Input n1: ');
Readln(n1);
Writeln('Input ',n1, ' real numbers: ');
For I:=1 to n1 do readln(A[I]);
Writeln('Input n2: ');
Readln(n2);
Writeln('Input ',n2, ' real numbers: ');
For I:=1 to n2 do readln(B[I]);
MaxA:=MaxEl(A,n1);
MaxB:=MaxEl(B,n2);
Proizv:= MaxA*MaxB;
Writeln('MaxA = ', MaxA);
Writeln('MaxB = ', MaxB);
Writeln('MaxA*MaxB = ', Proizv);
Write('Press any key!!!');
Readln;
End.
Результаты тестирования.
Input n1:
Input 5 real numbers:
1.6
-5.8
1.45
Input n2:
Input 3 real numbers:
1.5
-8
MaxA = 7.00000000000000E+0000
MaxB = 2.00000000000000E+0000
MaxA*MaxB = 1.40000000000000E+0001
Press any key!!!
Аналогично можно передавать двумерные массивы в качестве параметра процедурам и функциям. Рассмотрим пример программы обработки матриц с использованием подпрограмм.
Задание. В двумерном массиве (матрице) определить номер строки, в которой находится максимальное количество положительных элементов. Для определения числа положительных элементов в строке использовать процедуру. Если положительных элементов нет в массиве, вывести сообщение об этом.
Постановка задачи.
Исходные данные:
· число строк в матрице n<=10;
· число столбцов в матрице m<=10;
· двумерный массив (матрица) размером n x m , содержащий положительные и отрицательные значения.
Выходные данные: номер строки, в которой находится максимальное количество положительных элементов.
Метод решения: для определения числа положительных элементов в строке матрицы использовать функцию.
Аномалии: отсутствие положительных элементов в массиве.
Реакция на аномальную ситуацию – выдача сообщения.
Блок-схема основной программы представлена на рис. 9.8.
Блок-схема подпрограммы - процедуры для подсчета количества положительных элементов в каждой строке матрицы и записи счетчиков в массив K из n элементов представлена на рис. 9.9.
K[I]= количество A[I, J], для которых справедливо неравенство A[I, J]>0.
Текст программы на языке Паскаль.
Program Main;
Type Tmatrix = array[1..10,1..10] of integer;
Vect = array[1..10] of integer;
Var
A: Tmatrix;
K: Vect;
i, j, n, m, kmax, imax: integer;
Procedure PositiveEl(M:Tmatrix; n, m: integer; VAR K: Vect);
Var i, j: integer;
begin
for i:=1 to n do
begin
K[i]:=0;
for j:=1 to m do
if (Mt[i,j]>0) then
K[i]:= K[i]+1;
end;
end;
begin
write('input n<10 ');
readln(n);
write('input m<10 ');
readln(m);
for i:=1 to n do
for j:=1 to n do
read(A[i,j]);
PositiveEl(A, n, m, K);
kmax:=K[1];
imax:=1;
for i:=1 to n do
if (K[i]>kmax) then
begin
kmax:=K[i];
imax:=i;
end;
if kmax=0 then
writeln('Not A[i][j]>0 !')
else
writeln('imax= ',imax);
write('PRESS ANY KEY!');
readln;
end.
Результаты тестирования.
1. Исходные данные:
n=3
m=3
A=((-1,-2,-3), (-1,0,-3), (-5,-2,-8)
Результат- сообщение «not A[i,j]>0».
Результаты, выданные программой.
input n<10 3
input m<10 3
-1 -2 -3
-1 0 -3
-5 -2 -8
Not A[i][j]>0 !
PRESS ANY KEY!
2. Исходные данные:
n=3
m=3
A=((1,2,3), (1,0,-3), (-5,-2,-8)
Результат- сообщение «imax=1».
Результаты, выданные программой.
input n<10 3
input m<10 3
1 2 3
1 0 -3
-5 -2 -8
imax= 1
PRESS ANY KEY!
|