Массивы. Часть 2. Многомерные массивы. Ступенчатые массивы

Массивы. Часть 2. Многомерные массивы. Ступенчатые массивы


Содержание



1. Какой массив называется многомерным?

Многомерный массив – это массив, который имеет два и более измерений. Для доступа к элементу многомерного массива используется комбинация из двух и более индексов.

 

2. Какая общая форма объявления многомерного массива?

Общая форма объявления многомерного массива следующая:

тип[,...,] имя_массива = new тип[размер1, размер2, ..., размерN];

где

  • тип – непосредственно тип элементов массива;
  • размер1, размер2, размерN – размерность каждого измерения массива. Значение N означает, что массив N-мерный.

 

3. Пример объявления и использования двумерного массива вещественных чисел размером 3×4

В примере объявляется двумерный массив вещественных чисел, которые имеют тип float

// объявление и использование массива вещественных чисел размером 3*4
float[,] M = new float[3, 4]; // выделить память для массива

// заполнение массива произвольными значениями
for (int i = 0; i < 3; i++)
    for (int j = 0; j < 4; j++)
        M[i, j] = (float)(i * 0.2 + j * 0.3);

// запись значений в отдельные ячейки массива
M[0, 1] = 0.35f;
M[2, 2] = 1.45f;

 

4. Пример объявления и использования трехмерного массива целых чисел размером 3×4×5
// объявление трехмерного массива целых чисел размером 3*4*5
ulong[, ,] A; // описать переменную (ссылку) типа "трехмерный массив целых чисел"

A = new ulong[3, 4, 5]; // выделить память для массива

// записать в отдельные ячейки массива значение
A[0, 2, 3] = 232;
A[0, 0, 1] = 300;
A[2, 3, 1] = 20000;

 

5. Как выглядит общая форма инициализации многомерного массива?

Инициализация массива позволяет записать значения в ячейки массива в момент его объявления в программе.

Общая форма инициализации многомерного массива имеет следующий вид:

тип[,] имя_массива = { { значение, значение, ..., значение },
                       { значение, значение, ..., значение },
                       ...
                       { значение, значение, ..., значение } };

где

  • тип – тип элементов массива;
  • значение – значение, которыми инициализируются элементы массива.

 

6. Пример инициализации двумерного массива размером 5×3. Элементы массива имеют тип char
// инициализация двумерного массива
char[,] M = { { 'A', 'B', 'C', 'D', 'E' },
              { '8', '-', '=', '>', '+' },
              { '~', 'U', '&', '\\', '@' } };

 

7. Пример инициализации трехмерного массива целых чисел размером 2×3×4
// инициализация трехмерного массива целых чисел
short[, ,] B = {
                   {
                       { 1, 2, 3, 4 },
                       { 5, 6, 7, 8 },
                       { 9, 10, 11, 12 }
                   },
                   {
                       { 13, 14, 15, 16 },
                       { 17, 18, 19, 20 },
                       { 21, 22, 23, 24 }
                   }
               };

 

8. Что такое ступенчатый массив? Какая общая форма объявления ступенчатого массива?

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

  • прямоугольный массив в виде таблицы;
  • ступенчатый массив. В этом массиве количество элементов каждой строки (массива) может отличаться. Ступенчатый массив еще называют массивом массивов.

Общая форма объявления ступенчатого массива:

тип [][] имя_массива = new тип[размер][];

где

  • тип – тип элементов массива;
  • размер – количество строк в массиве.

 

9. Пример объявления и использования ступенчатого массива
// ступенчатые массивы
// объявление массива из 4-х строк, элементы которого имеют тип ulong
ulong[][] A = new ulong[4][];

// выделение памяти для каждой строки
A[0] = new ulong[5]; // в строке с индексом 0 есть 5 элементов
A[1] = new ulong[3]; // в строке с индексом 1 есть 3 элемента
A[2] = new ulong[6];
A[3] = new ulong[4];

// демонстрация доступа к элементам массива A
A[0][0] = 2003;
A[0][4] = 199008;
A[1][2] = 302909;
A[3][3] = 10000000;

for (int i = 0; i < 6; i++)
    A[2][i] = (ulong)(i * i * i);

Как видно из примера, доступ к элементам ступенчатого массива происходит иначе чем в прямоугольном массиве.

 

10. В каких случаях целесообразно использовать ступенчатые массивы?

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

На рисунке 1 отображено преимущество применения ступенчатых массивов в сравнении с прямоугольными. Продемонстрирована возможная экономия памяти в случае, когда данные представляются прямоугольным массивом в котором все элементы некоторых строк (0, 2, 3, 4) не используются.

Способ 1. Объявление прямоугольного массива с именем M.

// объявление прямоугольного массива
int[,] M = new int[5,100]; // выделяется 500 ячеек типа int

Способ 2. Объявление ступенчатого массива.

// объявление ступенчатого массива
int[][] M = new int[5][];

// выделяется 50+100+30+60+40 = 280 ячеек типа int
M[0] = new int[50];
M[1] = new int[100];
M[2] = new int[30];
M[3] = new int[60];
M[4] = new int[40];

С# пример ступенчатый массив

Рис. 1. Пример экономии памяти с помощью ступенчатого массива из 5 строк в сравнении с прямоугольным массивом размером 5×100

 

11. Каким образом реализовать массив двумерных массивов? Пример

В примере реализуется массив двумерных массивов с именем M. Массив имеет 10 строк. В каждой строке формируется двумерный массив размером 3×4.

// объявление массива из 10 двумерных массивов вещественных чисел, каждый из которых имеет размер 3*4
float[][,] M; // объявление переменной типа "массив двумерных массивов"

// выделение памяти для 10 двумерных массивов типа float
M = new float[10][,];

// выделение памяти для каждого массива размером 3*4
for (int i = 0; i < 10; i++)
    M[i] = new float[3, 4];

// заполнение массивов произвольными значениями
for (int i = 0; i < 10; i++)
    for (int j = 0; j < 3; j++)
        for (int k = 0; k < 4; k++)
            M[i][j, k] = i * 10 + j * 3 + k;

// заполнить конкретные ячейки
M[0][2, 1] = 20.44f;
M[2][0, 2] = 100.08f;

 


Связанные темы