Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава9.doc
Скачиваний:
1
Добавлен:
16.04.2019
Размер:
252.42 Кб
Скачать

9.6. Использование массивов в подпрограммах

При разработке подпрограммы, в которой необходимо обработать массив, а не простые переменные, следует руководствоваться приведёнными ниже рекомендациями:

  1. Массив описывается только в главной программе.

  2. Описание массива выполняется в двух разделах - описания типов и описания переменных.

  3. Фактическим параметром в операторе вызова должно быть имя описанного массива.

  4. Формальным параметром может служить как параметр-переменная, так и параметр-значение. Если это параметр-переменная, то ее имя в списке формальных параметров должно стоять после ключевого слова var вместе с типом массива, описанным в главной программе. В случае использования параметра-значения слово var опускается.

  5. Предпочтение следует отдавать параметрам-значениям. Однако, если через формальный параметр в вызывающую программу возвращается результат работы процедуры, то он должен быть объявлен параметром-переменной.

Пример 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 единицу или ноль.