4. Массивы

Описание массивов

В языке Паскаль можно обрабатывать не только отдельные переменные, но и их совокупности. Одной из таких совокупностей (структурированных) данных является массив.
Дадим три различных определения массива, каждое из которых верно по-своему:

1. Массив представляет собой совокупность данных одного типа с общим для всех элементов именем. Элементы массива пронумерованы, и обратиться к каждому элементу можно по номеру (или по нескольким номерам ).Номера иначе называются индексами, а элементы массивов - переменными с индексами. Размерность массива определяется количеством индексов у каждого эл-та массива.(Рапаков Ржеуцкая)

2. Массив - совокупность переменных одного типа, названная одним именем и имеющая индексный механизм доступа к каждой переменной.(Михаил Сухарев)

3. Массив - это структурированный тип данных, состоящий из фиксированного числа элементов одного типа, упорядоченных по индексам,определяющим положение каждого элемента в массиве.(В. Попов)

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

Массивы могут быть одномерные:

вектор a1, a2, a3, a4, a5, ...an, т. е. линейка величин - - - - - - - - - - - -

двумерные массивы представляют собой матрицы:

a11 a12 . . . a1n , т. е. матрицу величин или прямоугольник величин

a21 a22 . . . a2n ---- ---- ----

- - - - - - - - - - ---- ---- ----

am1 am2 . . . amn ---- ---- ----

Трехмерный массив - трехмерная матрица или параллелепипед величин, состоящий из набора двухмерных матриц.

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

Описание массивов может быть, как и других величин, прямое или через описание типов Тype.

Прямое описание Var - идентификатор, идентификатор, …, идентификатор:

array - [границы индекса, границы индекса, …, границы индекса] of - базовый тип.

Описание через TYPE:

TYPE - имя типа=array [границы индекса, границы индекса, . . ., границы индекса] of базовый тип;

Var - идентификатор, идентификатор, . . . , идентификатор: имя типа;

Пример: описать двумерные массивы с количеством элементов 4 строки по 5 элементов в каждой строке (5 столбцов),

базовый тип real, массивов три: а, b, c.

Прямое описание:

Var a, b, c: array [1. . . 4, 1 . . . 5] of real;

через TYPE:

TYPE mas=array [1. . . 4, 1. . . 5] of real;

Var a, b, c : mas;

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

Const a1=4; a2=6;

Var mas y1: array [1. . . a1, 1. . . a2] of integer;

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

Например, описана ma: array [1. . . 12] of integer; выделено 12 ячеек памяти для хранения целых данных типа integer с именами

ma [1], ma [2], ma [3], и т. д. , ma [12].

Пример:

TYPE klass = ( K1, K2, K3, K4);

znak = array [1. . . 255] of char;

Var m1: znak; {описан массив с именем M1 типа znak для хранения данных}

{типа char в количестве 255 шт. M1[1], M1[2], ... , M1[255]}

M2: array [1...60] of integer {прямое описание, описан массив с именем M2 для хранения целых величин. всего ячеек 60. M2[1], ... , M2[60] }

M3: array [1 ... 8] of klass; {описан массив М3, выделено 8 ячеек памяти М3[1], ... , M3[8], в каждой из которых могут храниться только величины из klass, т. е. туда могут быть занесены только K1, K2, K3, K4}

Пример:

Program Prim25;

Var i:integer; s:real;

a:array[1..10] of real;

BEGIN

for i:=1 to 10 do

Begin
writeln('введите значение величины a[',i,']');

readln(a[i]); end; {ввод элементов массива}

s:=0;

for i:=1 to 10 do

s:=s+a[i]; {нахождение суммы элементов а [i]}

writeln('s=',s);
readln;

END.

Здесь мы проиллюстрировали работу с одномерным массивом. Конечно, данную программу легче представить в следующем виде:

Program Prim25a;

Var i:integer; s,a:real;

BEGIN

s:=0;

for i:=1 to 10 do

begin
writeln('введите значение величины a[',i,']');

readln(a); { ввод по одному а (без массива)}

{ имитация ввода элементов массива }

s:=s+a;

writeln('s=',s);
end;

readln;
END.

Никаких массивов здесь не применять. На примере prim25 мы четко проследим два момента: занесение данных в массив (первый цикл) и обработка данных в массиве (второй цикл).

Пример: дана квадратная матрица. Вывести на экран элементы ее главной диагонали (элементы главной диагонали перечеркнуты)

a11 a12 a13 a14

a21 a22 a23 a24

a31 a32 a33 a34

a41 a42 a43 a44

Если принять, что индекс строк i, а столбцов j, то на главной диагонали лежат элементы, у которых i = j.

Program Prim26;

Var i,j,k:integer;

a:array[1..4,1..4] of integer;

b:array[1..4] of integer;

BEGIN

for i:=1 to 4 do

for j:=1 to 4 do

Begin
writeln('введите a[',i,',',j,']');
readln(a[i,j])
end; {ввод элементов массива а закончен }

k:=1; { устанавливаем индекс для занесения b[1] }

for i:=1 to 4 do

for j:=1 to 4 do

if i=j then Begin
b[k]:=a[i,j];
k:=k+1;
end;

{отыскиваем и заносим в b[1] a[1,1]}

{меняем k и заносим в b[2] a[2,2] и т.д.}

writeln('на главной диагонали лежат злементы:');

writeln('a[1,1]=',b[1],' a[2,2]=',b[2],' a[3,3]=',b[3],' a[4,4]=',b[4]);

readln;

END.

В этой программе машина запросит ввод 16 элементов матрицы А, найдет элементы главной диагонали, занесет их в массив B и напечатает результат в следующем виде:

на главной диагонали лежат элементы:

A[1,1] = число A[2,2] = число A[3,3] = число A[4,4] = число

Program Prim26a;
Var i,j,k:integer;
a:array[1..4,1..4] of integer;
b:array[1..4] of integer;

BEGIN
for i:=1 to 4 do
for j:=1 to 4 do

Begin
writeln
('ввести a[',i,',',j,']');
readln(a[i,j]);
end; { ввести массив а }

{ вывести элементы массива а }

for i:=1 to 4 do
Begin
writeln; { перевести курсор на новую строку}

for j:=1 to 4 do
write(a[i,j],' '); {вывести элементы в одну строку}
end;

k:=1;

for i:=1 to 4 do

for j:=1 to 4 do
if i=j then
Begin
b[k]:=a[i,j];
k:=k+1;
end;

{отыскиваем и заносим в b[1] a[1,1]}

{меняем k и заносим в b[2] a[2,2] и т.д.}

writeln(' на главной диагонали лежат элементы:');

writeln('a[1,1]=',b[1],' a[2,2]=',b[2],' a[3,3]=',b[3],' a[4,4]=',b[4]);

readln;

END.

Эта программа отличается от предыдущей тем, что она вначале вводит массив А, затем его распечатывает в виде

a11 a12 a13 a14

a21 a22 a23 a24

a31 a32 a33 a34

a41 a42 a43 a44

а после выводит результаты в том же виде, что и программа Prim26, т.е.

Program Prim26b;

Var i,j,k,n:integer;

a:array[1..40,1..40] of integer;

b:array[1..40] of integer;

BEGIN
writeln('введите размерность массива');

readln(n);

for i:=1 to n do

for j:=1 to n do
Begin
writeln('введите a[',i,',',j,']');
readln(a[i,j]);
end;

{вывести элементы массива а }

for i:=1 to n do
Begin
writeln; {перевести курсор на новую строку}

for j:=1 to n do
write(a [i , j],' '); {вывести элементы в одну строку}
end;

k:=1;

for i:=1 to n do

for j:=1 to n do

if i=j then
Begin
b[k]:=a[i , j];
k:=k+1;
end;

{отыскиваем и заносим в b[1] a[1,1]}

{меняем k и заносим в b[2] a[2,2] и т.д.}

writeln(' на главной диагонали лежат элементы:');

for k:=1 to n do

write(' a[',k,',',k,']=',b[k]);

readln;

END.

Эта программа работает так же, как и предыдущая, но с массивами и с переменными измерениями.

Величина входного массива может быть до 40 строк и 40 столбцов. Чтобы это обеспечить, в разделе Var описываем массив a: array [1..40,1..40] of integer; а затем в программе вводим по запросу n, которое будет определять, с матрицей какой величины мы будем работать конкретно (n должно быть в диапазоне 1-40). Далее все циклы программы работают от 1 до n, т.е. машина решит задачу для массива введенной размерности n.

Program Prim27;

Var i,j,k,n:integer;

a:array[1..40,1..40] of integer;

b:array[1..40] of integer;

BEGIN
writeln('
ввести n'); readln(n);

for i:=1 to n do

for j:=1 to n do

Begin
writeln('ввести a[',i,',',j,']');
readln(a[i,j]);
end;

{ вывести элементы массива а }

for i:=1 to n do

Begin
writeln; {перевести курсор на новую строку}

for j:=1 to n do
write(a[i,j],' '); {вывести элементы в одну строку}
end;

k:=1;

for i:=1 to n do

for j:=1 to n do

if i+j-1=n then
Begin
b[k]:=a[i,j];
k:=k+1;
end;

{отыскиваем и заносим в b[1] a[1,1]}

{меняем k и заносим в b[2] a[2,2] и т.д.}

writeln;

writeln(' на дополнительной диагонали лежат элементы:');

for k:=1 to n do

write(b[k],' ');

readln;

END.

Программа Prim 27 работает аналогично программе Prim 26b, однако выводит элементы, лежащие на дополнительной диагонали.

Program Prim28;

Var i,j,min,m,n,k:integer;

a:array[1..20,1..10] of integer;

b:array[1..10] of integer;

BEGIN
writeln('ввести m,n');
readln(m,n);

for i:=1 to m do {m - количество строк }

for j:=1 to n do {n - количество столбцов}

Begin
writeln('ввести a[', i ,', ', j,']');
readln(a[i , j]); end;

{ вывести элементы массива а }

for i:=1 to m do
Begin
writeln;

for j:=1 to n do
write(a[i,j],' ');
end;

min:=32767; {максимальное integer, чтобы в последующем сравнивать}

{и заносить в min все элементы a[i,j], которые меньше min}

for i:=1 to m do

for j:=1 to n do

if a[i , j]<min then Begin
min:=a[i , j];
k:=i;
end;

writeln(' строка, содержащая наименьший элемент');

for j:=1 to n do

write(' a[', k ,',', j ,']=',a[k , j]);

readln; END.

Программа Prim 28 находит в массиве строку размером до 20х10, содержащую наименьший элемент.

Program Prim29;

Var i,j:integer; a:array[1..5, 1..7] of integer;

b:array[1..7] of integer;

c:array[1..5] of integer;

BEGIN
for i:=1 to 5 do

for j:=1 to 7 do

begin
writeln('введите a[',i,',',j,'] элемент матрицы а');
readln(a[i,j]);
end;

for j:=1 to 7 do

begin
writeln('введите b[',j,'] элемент вектора b');
readln(b[j]);
end;

for i:=1 to 5 do {начало перемножения матрицы на вектор}

begin
c[i]:=0;

for j:=1 to 7 do
c[i]:=c[i]+ a[i,j]*b[j];
end;

<{конец перемножения матрицы на вектор}

writeln('распечатка массива а');

for i:=1 to 5 do

begin
writeln; {начать новую строку}

for j:=1 to 7 do

write(' ',a[i,j]);
end;

writeln;

 writeln('распечатка массива b');

for j:=1 to 7 do

write(' ',b[j]);
writeln;

writeln('результирующий масcив с');

for i:=1 to 5 do

write(' ',c[i]);

readln;
END.

Программа вводит матрицу А размером 5х7 и вектор размером 7 элементов, затем их перемножает по правилу Сi = Сi + a[i,j]b[j] и выводит пять элементов массива С.

Заметим, что для вычисления каждого с необходимо каждый элемент строки массива a умножить на соответствующий по индексу элемент массива b, а затем все эти произведения сложить. таким образом, количество элементов массива с будет равно количеству строк матрицы a (и, соответственно, количеству элементов массива b).

Program Prim29a;

Var i,j,n,m:integer; a:array[1..50,1..70] of integer;

b:array[1..70] of integer;

c:array[1..50] of integer;

BEGIN
writeln('ввести количество строк и столбцов');

readln(n,m);

for i:=1 to n do

for j:=1 to m do

begin
writeln('ввести a[',i,',',j,'] элемент матрицы а');
readln(a[i,j]);
end;

for j:=1 to m do

begin
writeln('ввести b[',j,'] элемент вектора b');
readln(b[j]);
end;

for i:=1 to n do {начало перемножения матрицы на вектор}

begin
c[i]:=0;

for j:=1 to m do

c[i]:=c[i]+ a[i,j]*b[j];
end;

{конец перемножения матрицы на вектор}

writeln('распечатка массива а');

for i:=1 to n do

Begin
writeln; {начать новую строку}

for j:=1 to m do

write(' ',a[i,j]);
end;
writeln;

writeln('распечатка массива b');

for j:=1 to m do

write(' ',b[j]);
writeln;

writeln('результирующиймассив с');

for i:=1 to n do

write(' ',c[i]);

readln;
END.

Программа Prim 29a тоже перемножает матрицу на вектор. Здесь матрица может иметь размеры до 50х70, соответственно вектор B может иметь размер до 70, а вектор С - размер до 50 элементов.