Массивы массивов. Матрицы.

Массивы (array) наиболее часто применяемые структурированные типы в системе программирования Delphi. Они обладают рядом свойств, которые позволяют использовать их для хранения и обработки значительных объемов различной информации. Данное занятие посвящено дальнейшему изучению типа данных ARRAY.

До сих пор вы применяли тип ARRAY только для хранения и обработки линейных массивов информации. В этом случае массив можно представить как линейную таблицу содержащую однотипную информацию. Например, объявлен массив a: array[1..9] of Integer, который уже заполнен (определен). Его можно представить следующим образом:

В этом случае, для того чтобы обратиться к элементу массива, необходимо указать имя данного массива с индексом элемента в квадратных скобках. Например: a[4].

Для данного массива базовым типом является стандартный, простой тип Integer. Поэтому содержимое каждой ячейки массива, это целое число. Но базовым типом для массивов может быть практически любой тип, в том числе и сам тип массив. То есть в Delphi может быть объявлена переменная следующего вида:

Var a: array[1..3] of array [1..4] of Integer;

Для того, чтобы не возникало переменных с таким длинным описанием, удобно сначала описать базовый тип массив в разделе описания типов пользователя, а затем объявлять переменную-массив описанного выше типа. В этом случае сделанное выше объявление переменной-массива а будет выглядеть следующим образом:

Type mas=array[1..4] of Integer;

Var a:array[1..3] of mas;

Объявленный таким образом массив массивов а можно изобразить следующим образом:

В данном случае элементами массива (базовым типом) является тоже массив. в результате мы имеем 3 ячейки для хранения массивов целых чисел, или просто 12 ячеек для хранения целочисленной информации. Для того, чтобы обратиться к элементу такого массива, необходимо дважды указывать его индекс. Например, к ячейке отмеченной крестиком обращаются в данном случае, так: a[2][3].

Описанный способ объявления массивов относят к объявлению так называемых многомерных массивов. В данном случае мы объявили двумерный массив для хранения целых чисел. Для того, чтобы обратиться к элементу такого массива, нам необходимо после  имени массива указать всего два индекса этого элемента. Хотя существует возможность работать с более сложными массивами. Например:

Type c1=array[1..5] of Integer;

         c2=array[1..4] of c1;

         c3=array[1..5] of c2;

         c4=array[1..10] of c3;

Var mas:c4;

Для того, чтобы обратиться к элементу массива mas, необходимо после имени массива указать четыре индекса элемента: a[2][3][5][1].

В системе программирования Delphi существует более простой или более "прямой", а в результате этого, и чаще применяемый способ объявления многомерных массивов. Начнем сразу с примера:

Var matr:array[1..3,1..5] of Integer;

Таким образом, мы объявили двумерный массив, который можно изобразить следующм образом:

Для того, чтобы обратиться к элементу массива, отмеченному крестиком, необходимо после смены имени массива указать два индекса через запятую в одних квадратных скобках: matr[2..4].

Таким способом можно описывать и более сложные массивы. Например, 5-мерный массив можно объявить следующим образом:

Var ex:array[1..10,1..10,1..5,1..15,1..4] of Real;

Обращаясь к элементу данного массива, необходимо указывать пять его индексов: ex[1,1,1,1,1].

Матрицы

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

Первый индекс — номер строки, второй — номер столбца; а13 читается "а один три", а не "а тринадцать". В программах на Delphi используются соответственно конструкции a[1,3].

Про матрицу имеющую m строк и n столбцов, говорят, что она имеет размер m x n ("m на n"). Если m=n, то матрица называется квадратной.

Для квадратной матрицы элементы с одинаковыми индексами для строк и столбцов составляют главную диагональ матрицы. Для изображенной выше матрицы элементы а11,а12,а33. Противоположная диагональ называется побочной диагональю. К ней относятся элементы а13,а22,а31.

Как работать с матрицами

Для обработки матриц наиболее удобно применять вложенные циклы с параметром. Описанный ниже фрагмент программы предназначен для заполнения матрицы целых чисел размером 4 x 5 с помощью компонента TStringGrid.

For i:=1 to 4 do

For j:=1 to 5 do

a[i,j]:=StrToFloat(StringGrid1.Cells[i,j]);

Допустимая операция присваивания

В системе программирования Delphi, для одинаковых массивов допустима операция присваивания массива массиву. Например, если описано два массива следующим образом:

Var A,B:array[1..50,1..60] of Real;

то допустима следующая операция присваивания: А:=В;

Примеры программ:

Дана матрица действительных чисел размером 3x5. Вычислить сумму элементов матрицы.

Procedure TForm1.Button1Click(Sender:TObject);

Const n=3;    {Количество строк}

           m=5;  {Количество столбцов}

Type mas=array[1..n,1..m] of Real;

Var a:mas;  {Массив}

       i:Integer;  {Индекс строки}

       j:Integer;  {Индекс столбца}

       s:Real;  {Сумма}

Begin

      {Ввод значений матрицы}

For i:=1 to n do

For i:=1 to m do

a[i,j]:=StrToFloat(StringGrid1.Cells[i,j]);

       {Вычисление суммы}

s:=0;

For i:=1 to n do

For j:=1 to m do

s:=s+a[i,j];

Label1.Caption:='S= '+FloatToStr(s);

End;

Дана матрица целых чисел размером 4x4. Заменить все элементы главной диагонали на нули. Вывести на экран монитора содержимое матрицы после обработки.

Procedure TForm1.Button1Click(Sender:TObject);

Type mas=array[1..4,1..4] of Integer;

Var matr:mas;  {Матрица}

       i:Integer;    {Индекс строки}

       j:Integer;    {Индекс столбца]

Begin

      {Ввод значений матрицы}

For i:=1 to 4 do

For j:=1 to 4 do

matr[i,j]:=StrToInt(StringGrid1.Cells[i,j]);

       {Обработка матрицы}

For i:=1 to 4 do

matr[i,i]:=0;

        {Вывод содержимого матрицы после обработки}

For i:=1 to 4 do

For j:=1 to 4 do

StringGrid2.Cells[i,j]:=IntToStr(matr[i,j]);

End;

Контрольные вопросы

1.  Какие способы объявления многомерных массивов вы знаете?

2.  Как обратиться к элементу многомерного массива?

3.  В каких случаях допускается обращение к многомерному массиву целиком?

4.  Какая конструкция применяется для обработки n-мерного массива?

На главную.
Используются технологии uCoz