Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КОМП. НАУКИ_1сем.doc
Скачиваний:
6
Добавлен:
05.11.2018
Размер:
902.14 Кб
Скачать
    1. Открытые массивы

Открытый массив  это формальный параметр подпрограммы, описывающий базовый тип элементов массива, но не указывающий тип его индексов. Это дает возможность использовать одни и те же подпрограммы для обработки одномерных массивов различных размеров.

Параметр открытый массив может передаваться как по значению, так и по адресу. Например:

procedure P1(V: array of integer); //V ─ открытый массив, параметр-значение

procedure P2(var V: array of integer); //V ─ открытый массив, параметр-переменная

procedure P3(const V: array of integer);//V ─ открытый массив, параметр-константа

В теле подпрограммы открытый массив трактуется как одномерный массив с нижней границей, равной 0, и верхней границей, равной N-1, где N = число элементов в фактическом параметре.

Эти границы возвращают соответственно стандартные функции Low(V)и High(V). Т.е. диапазон изменения индексов открытого массива равен Low(V)..High(V), причем функция Low(V) для открытого массива всегда выдает 0.

Для обработки всех элементов открытого массива в подпрограмме можно использовать цикл:

for i:=Low(V) to High(V) do V[i] … или for i:=0 to High(V) do V[i]

В качестве фактических параметров можно передавать массивы с элементами указанного в заголовке подпрограммы типа, но с произвольными границами индексов. Например, можно передать массивы:

var v1:array[-10..10] of integer; //В массиве 21 элемент

v2:array[1..1000] of integer; //В массиве 1000 элементов

v3:array[’a’..’d’] of integer; //В массиве 5 элементов

begin P2(v1); P2(v2); P2(v3);

Диапазон изменения индекса фактического параметра-массива отображается при вызове подпрограммы в диапазон изменения индекса открытого массива:

  1. -10..10 в 0..20;

  2. 1..1000 в 0..999;

  3. ’a’..’d’ в 0..3.

    1. Типичные задачи для одномерных массивов

const n=50; //Глобальная константа, используется во всех подпрограммах type vector=array[1..n] of integer;// Пусть задан для примера такой тип одномерных массивов

procedure ReadVec(var V:vector);

// Заполнение массива числами с клавиатуры

var i:integer;

begin

for i:=1 to n do

begin

write(‘V[‘, i, ‘]=’)

readln(V[i])

end end;

procedure RandomVec(var V:vector; B:integer);

// Заполнение массива случайными числами от 0 до B-1

var i:integer;

begin

for i:=1 to n do

V[i]:=Random(B) //Random выдает случайное число, удовлетворяющее условию 0<= число < B

end;

Перед вызовом функции Random надо вызвать процедуру Randomize для инициализации датчика случайных чисел. Randomize гарантирует несовпадение последовательностей случайных чисел, выдаваемых функцией Random. Замечание: для заполнения вещественных массивов используют вызов функции Random без параметра, которая выдает случайное вещественное число, удовлетворяющее условию: 0<= число <1

procedure WriteVec(const V:vector; L,B:integer);

// Вывод элементов массива по L элементов в строке, ширина поля вывода B

var i:integer;

begin

for i:=1 to n do

begin write(M[i]:B) //Вывод элемента, остаемся в той же строке

if (i mod L)=0 //Если это последний элемент из L элементов в строке,

else writeln //то переход на новую строку

end;

writeln //Переход на новую строку после вывода всего массива

end;

function EqualVec(const V1,V2:vector):boolean;

// Сравнение двух векторов

var i:integer;

begin

Result:=true; //Пока считаем, что векторы равны

for i:=1 to n do

if V1[i]<>V2[i]

then begin Result:=false; break end //Найдена пара несовпадающих элементов

end;

procedure LeftVec(var V:vector);

// Сдвиг элементов вектора влево

var i:integer;

begin

for i:=1 to (n-1) do

V[i]:=V[i+1]

end;

procedure RightVec(var V:vector);

// Сдвиг элементов вектора вправо

var i:integer;

begin

for i:=n downto 2 do

V[i]:=V[i-1]

end;

procedure CirLeftVec(var V:vector);

// Циклический сдвиг элементов вектора влево

var i, tmp:integer;

begin

tmp:=V[1];

for i:=1 to (n-1) do

V[i]:= V[i+1];

V[n]:=tmp

end;

procedure CirRightVec(var V:vector);

// Циклический сдвиг элементов вектора вправо

var i, tmp:integer;

begin

tmp:=V[n];

for i:=n downto 2 do

V[i]:=V[i-1];

V[1]:=tmp

end;

function SumVec(const V:vector):integer;

// Сумма элементов вектора

var i:integer;

begin

Result:=0;

for i:=1 to n do

Result:=Result+V[i]

end;

function IndMaxVec(const V:vector):integer;

// Индекс максимального элемента. Если одинаковых максимальных элементов несколько,

// то индекс последнего из них

var i:integer;

begin

Result:=1;

for i:=2 to n do

if V[i] >= V[Result] then Result:=i

end;

procedure AllIndMaxVec(const V:vector; var Ind:vector; var K:integer);

// Индексы всех максимальных элементов вектора.

// Результат – массив индексов Ind, K – количество индексов совпадающих максимальных элементов

var i, max:integer;

begin

max:=V[1]; K:=0;

for i:=2 to n do //Поиск максимального значения в массиве

if V[i] > max then max:=V[i];

for i:=1 to n do //Занесение индексов всех совпадающих максимальных элементов в Ind

if V[i] = max

then begin K:=K+1; Ind[K]:=i end

end;