Операции и работа с массивами

Ввод и вывод массивов.

Type

massiv1=array[byte] of Boolean;

massiv2=array[char] of real;

massiv3=array[red,yellow] of char;

Massiv1 будет содержать 256 элементов (с 0 по 255-ый) и все его элементы могут принимать всего 2 логических значения – истину или ложь (true или false):

var d: massiv1;

d[56]:=false;

Как видите, совершенно необязательно заполнять все элементы массива, а также заполнять их по порядку.

Massiv2 будет содержать также 256 элементов (с 0-го по 255-ый символ) дробного типа данных real:

Varg: massiv2;

g[‘k’]:=23.56;

Massiv3 будет содержать 2 символа:

var s: massiv3;

s[red]:=’p’;

Можно записать так:

var d: massiv1;

i: byte;

i:=1*9

d[i*5]:=true;

В этом случае элементу massiv1 с номером 9*5=45 будет присвоено значение истины. Как видите, индекс можно формировать в процессе выполнения программы.

Значение элементов массива можно вводить и выводить, как это сделано ниже:

readln(d[16]);

writeln(d[20]);

С помощью первого оператора мы вводим значение 16-го элемента массива d, а с помощью второго операнда выводим значение 20-го элемента.

Обратите внимание, что важно следить за тем, чтобы индекс не вышел за допустимые пределы массива. Например, применение операции:

d[i*10]:=false;

зависит от того, чему будет равно значение iв момент определения индекса элемента, которому мы хотим присвоить значение false. Если i будет больше 25, то обращение к элементу массива с номером 260 (26*10) и выше будет ошибкой, поскольку у нас всего может быть 255 элементов.

Посмотрим, как можно заполнить массив. Для заполнения нашего массива очень удобно воспользоваться циклом For, так как мы заранее знаем, сколько элементов будет содержать наш массив.

Заполнение массива иллюстрирует следующий фрагмент программы:

Type

Ar=array[1..14] of byte; // массив, состоящий из 14-ти элементов типа

// byte

Var

m: ar; //переменная m имеет заданный выше тип ar

i: 1..14;

Begin

Writeln(‘Введите 14 целых чисел массива через пробелы’);

Write(‘->’);

For i:=1 to 14 do

Read(m[i]);//каждый раз прочитываем по следующему элементу

//и заполняем им наш массив

Writeln(‘Массив введён’);

Readln;

End.

Точно так же можно и вывести наш введённый массив:

For i:=1 to 14 do

write(m[i]);

Посмотрим некоторые наиболее часто используемые операции, выполняемые над данной структурой.

Представим, что вы храните большую коллекцию именованных кружек и решили написать для неё программу, которая будет эту коллекцию обрабатывать (например, сортировать по возрастанию, по дате появления в коллекции или производить иные действия). В этом случае каждой кружке мы определяем одну ячейку в массиве данных, который назовём kruzki:

Type

kruzki=array[1..2000] of word;

Var

a: kruzki;

w: word;

Пускай у каждой кружки с именем будет свой собственный номер. Здесь мы завели массив с расчётом на максимальное количество кружек 2000, в каждой из ячеек которого будет храниться номер кружки (типа word).

У нас появились некоторые задачи:

Нам нужно поменять 2 кружки местами. Мы знаем номера ячеек, хранящих эти кружки – i1 и i2.

Чтобы поменять местами кружки, нам нужно ввести дополнительный элемент w, куда мы сначала вытолкнем первую кружку, затем на её место поместим вторую кружку и только потом на место второй поместим первую – которую теперь содержит только элемент w:

w:=a[i1];

a[i1]:=a[i2];

a[i2]:=w;

Нам нужно найти кружки с минимальным и максимальным номерами и поменять их местами. Для этого мы изначально считаем, что минимальный и максимальный номер носит первый элемент массива – первая кружка, а затем организуем цикл, который пройдёт по всем элементам и сравнит их номера. Если какой-то номер окажется больше или меньше текущего максимального и минимального соответственно, тогда текущий максимальный и минимальный индекс такой кружки меняется на индекс такого элемента. Рассмотренный ниже пример иллюстрирует данный алгоритм:

const m=2000;

Var

a: kruzki;

w: word;

i, m, i min, i max: 1..m; // imin и imax – индексы минимального и// максимального эл-та

Begin

imax:=1;

imin:=1;

For i:=2 to m do

begin

if a[i]>a[imax] then imax:=i;

if a[i]<a[imin] then imin:=i;

end;

w:=a[imax];

a[imax]:=a[imin];

a[imin]:=w;

End;

Нам нужно сдвинуть все элементы массива влево на единицу. В этом случае первый элемент вылетит (пропадёт) из массива, а последний дублируется:

Алгоритм, выполняющий данную процедуру, показан ниже:

For i:=1 to (m-1) do

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

Если мы хотим произвести сдвиг на k элементов (k раз), то в этом случае мы можем воспользоваться вложенным циклом:

For j:=1 to k do

For i:=1 to (m-1) do

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

Или использовать такой алгоритм:

For i:=1 to m-k do

a[i]:=a[i+k];

Теперь мы сдвигаем все элементы вправо.

В этом случае пользуемся обратным циклом:

For i:=n down to 2 do

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

Как видно из примеров, во всех случаях сдвига мы теряем либо первый (первую кружку), либо последний (последнюю кружку) элемент массива. Теперь давайте напишем вариант сдвига, при котором мы поместим вылетевший первый элемент на место последнего, таким образом сделав циклический сдвиг наподобие передвижения автомобильного счётчика-барабана.

w:=a[1];

For i:=1 to (m-1) do

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

a[n]:=w;

Давайте посмотрим, как занести в наш массив новую кружку. Допустим, сейчас в нашем массиве n кружек. Понятно, что это количество должно быть заведомо меньше максимального числа кружек m. Когда мы вставляем новый элемент, текущее количество кружек нужно не забыть увеличить на 1. Если мы вставляем кружку не в новую ячейку, а в какую-нибудь текущую занятую ячейку, то нам также нужно позаботиться и о том, чтобы сдвинуть все элементы вправо, начиная со следующей после ячейки, в которую производится вставка:

For i:=n+1 down to p+1 do

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

p – это номер позиции, с которой производится вставка.

Рассмотрим обратную задачу, когда нам нужно удалить одну чашку из нашей коллекции. Удалять её будем из позиции p. После удаления нам нужно будет сдвинуть элементы, находящиеся после удаляемого, на одну позицию влево. Описанный алгоритм иллюстрирует следующим пример:

For i:=p to n-1 do

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

n:=n-1;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: