<<
>>

Прямоугольные массивы и массивы массивов

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

Объявление двухмерного прямоугольного массива var M: array [1 .. 3, 1 .. 2] of integer;

можно рассматривать как три двухэлементных подмассива M[1], M[2], M[3], которые являются строками в следующей матрице элементов:

254

Глава 10. Составные типы данных

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

Размещение массива по строкам проиллюстрировано на рис. 10.2.

Рис.
10.2. Размещение двухмерного массива по строкам

В этом случае быстрее всего изменяется последний индекс j каждого элемента

Адрес элемента можно определить по формуле:

Очевидно, что Wj = n2 х w2

где n2 — количество элементов в строке,

n2 = high2 - low2 + 1

При размещении массива по столбцам быстрее всего изменяется первый индекс i каждого элемента M[i, j]:

M[1,1], M[2,1], M[3,1], M[1,2], M[2,2], M[3,2]

Прямоугольные массивы можно создавать в языках Fortran, Pascal, Ada, F# и C#.

В этих случаях все индексные выражения в ссылках на элемент помещаются в единую пару скобок (круглых — в языках Fortran и Ada, и квадратных — во всех остальных языках). Например, на языке C# можно записать: myArray[3, 7]

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

Рассмотрим пример построения не выровненного массива средствами языка C#, в котором элементы подобного массива имеют ссылочный тип и инициализируются значением null.

Прямоугольные массивы и массивы массивов

255

Объявим одномерный массив из трех элементов, каждый из которых является одномерным массивом целых чисел: int[][] JaggedArray = new int[3][];

Перед использованием jaggedArray его элементы нужно инициализировать. Сделать это можно следующим образом:

JaggedArray[0] = new int[5];

JaggedArray[1] = new int[4];

JaggedArray[2] = new int[2];

Каждый элемент представляет собой одномерный массив целых чисел. Первый элемент массива состоит из пяти целых чисел, второй — из четырех и третий — из двух.

Для заполнения элементов массива значениями можно выполнить инициализацию, при этом размер массива знать не требуется:

JaggedArray[0] = new int[] { 1, 3, 5, 7, 9 };

JaggedArray[1] = new int[] { 0, 2, 4, 6 };

JaggedArray[2] = new int[] { 11, 22 };

Также массив можно инициализировать в объявлениях: int[][] jaggedArray2 = new int[][]

{

new int[] {1,3,5,7,9}, new int[] {0,2,4,6}, new int[] {11,22}

};

В языке C# можно использовать и сокращенную форму.

Следует помнить, что при инициализации элементов оператор new опускать нельзя, так как инициализация по умолчанию не предусмотрена: int[][] JaggedArray3 =

{

new int[] {1,3,5,7,9}, new int[] {0,2,4,6}, new int[] {11,22}

};

Напомним, что не выровненный массив является массивом массивов и поэтому его элементы имеют ссылочные типы и инициализируются значением null.

Доступ к отдельным элементам массива организуется следующим образом:

// Присвоить 77 второму элементу ([1]) первого массива ([0]):

JaggedArray3[0][1] = 77;

// Присвоить 88 второму элементу ([1]) третьего массива([2]):

JaggedArray3[2][1] = 88;

Массивы массивов можно смешивать с прямоугольными массивами. Покажем объявление и инициализацию одномерного массива массивов, состоящего из трех двухмерных элементов различного размера: int[][,] JaggedArray4 = new int[3][,]

{

new int[,] { {1,3}, {5,7} },

new int[,] { {0,2}, {4,6}, {8,10} },

new int[,] { {11,22}, {99,88}, {0,9} }

};

256

Глава 10. Составные типы данных

Проиллюстрируем возможность доступа к отдельным элементам массива: System.Console.Write("{0}", jaggedArray4[0][1, 0]);

Здесь выводится на экран значение элемента [1,0] первого массива (значение 5). Количество массивов, содержащихся в массиве массивов, можно определить с помощью метода Length:

System.Console.WriteLine(jaggedArray4.Length);

В данном случае возвращается значение 3.

Языки C, C++ и Java поддерживают массивы массивов, но не предусматривают прямоугольные массивы. В этих языках при указании элемента многомерного массива записывается отдельная пара квадратных скобок по каждому измерению: myArray[3][7]

Например, в языке С++ массив из чисел с плавающей точкой можно объявить двумя размерами, которые заключены в квадратные скобки: float sales [ districts ][ months ];

В этом объявлении выражения districts и months определяют размеры массива по каждому измерению. Конечно, массивы могут иметь бо льшую размерность. Трехмерный массив — это массив массивов, которые состоят из массивов. Доступ к элементам трехмерного массива осуществляется с использованием трех индексов: elem = dimen3 [ x ][ y ][ z ];

Элементы же двухмерного массива требуют двух индексов: sales [ d ][ m ]

Еще раз заметим, что каждый индекс заключается в отдельные квадратные скобки. Запятые не используются. Нельзя писать sales [ d, m ]; это работает в других языках, но не в C++.

<< | >>

Еще по теме Прямоугольные массивы и массивы массивов:

  1. 18.5. Права и обязанности держателя (обладателя) по работе с массивами персональных данных
  2. 18.6. Государственное регулирование работы с персональными данными
  3. Частотный анализ и кодировка.
  4. 1.4. Цель настоящего учебника
  5. 18.7. Уполномоченный по правам субъектов персональных данных
  6. 18.3. Правовые основы работы с персональными данными
  7. 18.2. Субъекты и объекты информационных правоотношений
  8. 18.4. Права субъекта персональных данных
  9. Статья 245. Уничтожение или повреждение объектов растительного мира
  10. АУДИТОРИЯ
  11. четвертая коммуникационная революция
  12. ГИСТОГРАММА
  13. 11.1. Интернет и правовая система
  14. 2.2.3. Область формирования информационных ресурсов, подготовки информационных продуктов, предоставления информационных услуг
  15. СПТ откликается на вызов обстоятельств
  16. МАТРИЦА
  17. Глава VII ГРУППОВОЕ ИНТЕРВЬЮ