Массивы массивов. Матрицы.
Массивы (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-мерного массива?