9.6. Использование массивов в подпрограммах
При разработке подпрограммы, в которой необходимо обработать массив, а не простые переменные, следует руководствоваться приведёнными ниже рекомендациями:
Массив описывается только в главной программе.
Описание массива выполняется в двух разделах - описания типов и описания переменных.
Фактическим параметром в операторе вызова должно быть имя описанного массива.
Формальным параметром может служить как параметр-переменная, так и параметр-значение. Если это параметр-переменная, то ее имя в списке формальных параметров должно стоять после ключевого слова var вместе с типом массива, описанным в главной программе. В случае использования параметра-значения слово var опускается.
Предпочтение следует отдавать параметрам-значениям. Однако, если через формальный параметр в вызывающую программу возвращается результат работы процедуры, то он должен быть объявлен параметром-переменной.
Пример 9.7
Даны целочисленные векторы C(20) и D(35), содержащие положительные, отрицательные и нулевые элементы. Найти первый по порядку положительный элемент вектора и его индекс.
Алгоритм главной программы
Алгоритм подпрограммы
program example97;
type
t = array [1..35] of real;
var
cd : t;
j : integer;
procedure pod (a : t; m : integer);
var
i : integer;
begin
i:=1; while (a[ i ] <= 0) and (i <= m) do i := i + 1;
if i <= m then write (a [ i ]:6:2, i:2)
else write ('положительных элементов нет')
end;
begin
for j:=1 to 20 do read ( c[ j ]); writeln;
for j:=1 to 35 do read ( d[ j ]); writeln;
pod (c, 20); pod (d, 35)
end.
Программа использует процедуру pod, с помощью которой в каждом из исходных массивов ищется первый по порядку положительный элемент и определяется его индекс. Хотя исходные массивы имеют разную длину, в главной программе они описаны как массивы одного типа и, следовательно, одинаковой длины. Сделано это для того, чтобы типы соответствующих фактических и формальных параметров совпадали.
Пример 9.8
Десять точек заданы на плоскости своими координатами xi, yi (i=1,..,10), окружность уравнением ( x - x0 )2 + ( y - y0 )2 = r2, где x0 и y0 - координаты её центра, а r - радиус. Определить число точек, лежащих внутри окружности.
Алгоритм главной программы
Алгоритм подпрограммы
program example98;
type c = array [1..10] of real;
var x, y : c;
i, j : integer;
x0, y0, r : real;
function kkk(x, y : c; a, b, r:real):integer;
var
z : real;
begin
z:=sqrt (sqr (x - a) + sqr (y - b) ) - r;
if z <= 0 then kkk := 1 else kkk := 0
end;
begin
readln(x0, y0, r);
for j:=1 to 10 do readln (x [ j ], y [ j ]);
i:=0;
for j:=1 to 10 do i := i + kkk (x [ j ],y [ j ], x0, y0, r);
write ('i= ', i:2)
end.
Взаимодействие между двумя программными единицами - главной программой и функцией kkk осуществляется следующим образом. Главная программа из тела своего цикла вызывает функцию (таких вызовов 10 - по числу пар точек), каждый раз передавая ей в качестве фактических параметров координаты xi , yi очередной точки, координаты x0, y0 центра окружности и значение её радиуса r. Функция вычисляет разность z между радиусом окружности и расстоянием от её центра до очередной точки. Если z ≤ 0, что свидетельствует о нахождении точки внутри окружности, то имени функции присваивается значение равное 1, в противном случае 0. Эти значения после их возврата в главную программу учитываются счётчиком количества точек, попавших внутрь окружности-переменной i.
Пример 9.9
Дана матрица C(4х6), каждая строка которой содержит положительные, отрицательные и нулевые элементы. Сформировать вектор D(4) по следующему правилу: если количество положительных элементов i-той строки (i=1..4) больше количества отрицательных, элементу вектора D присвоить значение равное 1, в противном случае 0. Подсчёт количества положительных и отрицательных элементов строки оформить в виде процедуры.
Алгоритм главной программы
Алгоритм подпрограммы
program example99;
type t = array [1..4,1..6] of real;
r = array [1..4] of real;
var
c : t;
d : r;
m, n, s1, s2 : integer;
procedure Pro (f : t; var k1, k2:integer; i: integer);
var
j :integer;
begin
for j:=1 to 6 do
if f [i ,j] > 0 then k1 := k1 + 1 else
if f [i, j] < 0 then k2 := k2 + 1
end;
{ ***** начало главной программы ***** }
begin
for m:=1 to 4 do
for n:=1 to 6 do read (c [m, n]);
writeln;
for m:=1 to 4 do
begin
s1:=0; s2:=0; Pro (c, s1, s2, m);
if s1 > s2 then d [ m ] := 1 else d [ m ] := 0;
end;
writeln ('Вектор D ');
for m:=1 to 4 do write ( d [ m ])
end.
Сложный цикл, который необходим для обработки заданной матрицы, разделён между процедурой и главной программой. Процедура содержит внутренний цикл, который обрабатывает строку матрицы, подсчитывая в ней количество положительных и отрицательных элементов.
Внешний цикл, расположенный в главной программе, меняет номера строк матрицы и передаёт их в процедуру в момент её вызова. Результаты счёта - количество положительных и отрицательных элементов строки возвращается в главную программу посредством глобальных переменных s1 и s2 (в процедуре им соответствуют параметры-переменные k1 и k2), которые сравниваются между собой. Исходя из результатов сравнения, принимается решение о том присвоить ли очередному элементу вектора D единицу или ноль.