Параметры-массивы
Раздел типов
Если мы хотим передать в подпрограмму отдельный элемент
массива, то в качестве соответствующего ему формального параметра указывается переменная того же типа.
Проблемы возникают, если в подпрограмму необходимо передать весь массив, так как структурный тип массива нельзя указывать в списке формальных параметров. В этом случае тип массива объявляется заранее с помощью раздела TYPE. Например, определим имена типов для вектора


Type
Vect = array[1..10] of real;
Matr = array[1..5,1..8] of real;
В дальнейшем имена типов Vect и Matr можно использовать в разделе описания переменных, например:
Var
X: Vect;
A: Matr;
Объявленные типы указываются также в списке формальных параметров, например:
Function (X: Vect; A: Matr): real;
Если по условию задачи в подпрограмме требуется при разных обращениях обрабатывать массивы с разными размерами, то в разделе TYPE объявляется тип массива с наибольшим размером. Например, при передаче в подпрограмму массивов


Type
Vect = array[1..15] of real;
Тогда по описанию
Var
X, Y: Vect;
в памяти компьютера выделяется максимальная область из 15 ячеек для каждого массива. При обработке массива с меньшим размером, часть выделенной памяти остается неиспользованной. В обращнии к подпрограмме в этом случае необходимо указать размер массива.
Примеры программирования задач с использованием подпрограмм
В приведенных ниже примерах для каждой задачи составим два варианта программы: с использованием процедуры и с использованием функции. На практике выбор того или иного варианта зависит от опыта программиста.
Задача 1
Даны два вектора:


Вычислить значение:









Вариант 1.
Использование процедуры.
Program P1_P;
Type
Vect = array[1..20) of real;
Var
X, Y: Vect;
i: integer;
Dx, Dy, D: real;
Procedure Mod_Otkl (A: Vect; n: integer; var Da: real);
var
ma, sa: real;
i: integer;
begin
ma := -1E6;
sa := 0;
for i := 1 to n do
begin
if a[i]>ma then ma := a[i];
sa := sa + a[i];
end;
sa := sa/n;
Da := abs(ma - sa);
end;
Begin {начало основной программы}
writeln(‘Введите массив X’);
for i :=1 to 8 do read(x[i]);
writeln(‘Введите массив Y’);
for i := 1 to 20 do read(y[i]);
Mod_Otkl(X, 8, Dx);
Mod_Otkl(Y, 20, Dy);
D := Dx / Dy;
writeln(‘D=’, D:6:2);
End.
Вариант 2.
Использование функции.
Program P1_F;
Type
Vect = array[1..20) of real;
Var
X, Y: Vect;
i: integer;
Dx, Dy, D:real;
Function Mod_Otkl (A: Vect; n: integer): real;
var
ma, sa, Da: real;
i: integer;
begin
ma := -1E6;
sa:=0;
for i :=1 to n do
begin
if a[i]>ma then ma := a[i];
sa := sa +a i];
end;
sa := sa / n;
Da := abs(ma - sa);
Mod_Otkl := Da;
end;
Begin {начало основной программы}
writeln(‘Введите массив X’);
for i := 1 to 8 do read(x[i]);
writeln(‘Введите массив Y’);
for i := 1 to 20 do read(y[i]);
Dx := Mod_Otkl(X, 8);
Dy := Mod_Otkl(Y, 20);
D := Dx / Dy;
writeln(‘D=’, D:6:2);
End.
Задача 2
Даны две матрицы:


Вычислить разность

где


Вариант 1.
Использование процедуры.
Program P2_P;
Type
Matr = array[1..5, 1..7) of real;
Var
A, B: Matr;
i, j, KA, KB, C: integer;
Procedure CP(D: Matr; m, n: integer; Var KD: integer);
var
i, j: integer;
begin
KD := 0;
for i := 1 to m do
for j := 1 to n do
if d[i,j]>0 then KD := KD + 1;
end;
Begin {начало основной программы}
writeln(‘Введите матрицу A’);
for i := 1 to 5 do
for j := 1 to 6 do read(a[i,j]);
writeln(‘Введите матрицу В’);
for i := 1 to 4 do
for j := 1 to 7 do read(b[i,j]);
CP(A, 5, 6, KA);
CP(B, 4, 7, KB);
C := KA - KB;
writeln(‘C=’, C:6:2);
End.
Вариант 2.
Использование функции.
Program P2_F;
Type
Matr = array[1..5, 1..7) of real;
Var
A, B: Matr;
i, j, C: integer;
Function CP(D: Matr; m, n: integer): integer;
var
i, j, KD: integer;
begin
KD := 0;
for i := 1 to m do
for j := 1 to n do
if d[i,j]>0 then KD := KD + 1;
CP := KD;
end;
Begin {начало основной программы}
writeln(‘Введите матрицу A’);
for i := 1 to 5 do
for j := 1 to 6 do read(a[i,j]);
writeln(‘Введите матрицу В’);
for i := 1 to 4 do
for j := 1 to 7 do read(b[i,j]);
C := CP(A, 5, 6) - CP(B, 4, 7);
writeln(‘C=’, C);
End.
ГЛАВА 9. Текстовые данные
В Турбо Паскале текстовая информация может быть представлена двумя типами данных: символьный (CHAR) и строковый (STRING).