Шаг 58.
Язык программирования C#. Начала
Массивы. Многомерные массивы

    На этом шаге мы рассмотрим создание и использование таких массивов.

    Размерность массива может быть большей двух. Правда, на практике массивы размерности большей, чем два, используются достаточно редко. Но это вопрос другой.


Напомним, что размерность массива определяется количеством индексов, которые следует указать для однозначной идентификации элемента массива.

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

    Переменная для многомерного массива объявляется следующим образом: указывается идентификатор типа для элементов массива, после которого следуют квадратные скобки с запятыми внутри. Количество запятых на единицу меньше размерности массива. Скажем, если мы объявляем переменную для массива размерности 5, то внутри квадратных скобок должны быть 4 запятые. После квадратных скобок с занятыми указывается имя переменной массива. Значением этой переменной можно присвоить ссылку на массив. Он должен быть той же размерности, которая указана при создании неременной массива, а тип элементов массива должен совпадать с типом, указанным при объявлении переменной массива. Например, командой

  int[,,] nums;
объявляется переменная nums для трехмерного целочисленного массива, а командой
  char [,,,,] symbs; 
объявляется переменная symbs для символьного массива размерности 5.

    Многомерный массив создается с помощью оператора new. После оператора new указывается идентификатор типа элементов массива, и в квадратных скобках перечисляются размеры массива по каждому из индексов. Значением инструкции по созданию массива является ссылка на массив. Эта ссылка может быть записана в переменную массива. Например, командой

  int[,,] nums = new int [3,4,5];   
создается трехмерный целочисленный массив размерами 3 на 4 на 5.


Одномерный массив можно представлять в виде цепочки элементов. Двумерный массив удобно представлять в виде таблицы. Трехмерный массив можно представить как сложенный из элементов прямоугольный параллелепипед. Первый индекс определяет "длину", второй определяет "ширину", и третий определяет "высоту", на которой элемент находится в "параллелепипеде". С массивами больших размерностей геометрическая интерпретация не так очевидна.

    При создании многомерных массивов можно использовать инициализацию аналогично тому, как мы это делали для одномерных и двумерных массивов. Значением переменной массива присваивается список, элементами которого являются списки, элементами которых также являются списки, и так далее - количество вложений определяется размерностью массива. Например, командой

  int [,,] nums = {{{0,0,0,0}, {0,0,0,1}, {0,0,1,0}}, 
                   {{0,0,1,1}, {0,1,0,0}, {0,1,0,1}}};
создается трехмерный целочисленный массив, который:

    Мы также могли бы использовать команды

  int[,,] nums = new int [2,3,4] {{{0,0,0,0}, {0,0,0,1}, {0,0,1,0}}, 
                                  {{0,0,1,1}, {0,1,0,0}, {0,1,0,1}}};
или
  int[,,] nums = new int [,,] {{{0,0,0,0}, {0,0,0,1}, {0,0,1,0}}, 
                               {{0,0,1,1}, {0,1,0,0}, {0,1,0,1}}};      .

    Скромный пример, в котором использован многомерный (трехмерный, если точнее) символьный массив, представлен ниже.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace pr58_1
{
    class Program
    {
        static void Main()
        {
            // Трехмерный символьный массив: 
            char[,,] symbs = new char[4, 3, 5];
            // Одномерный символьный массив: 
            char[] s = {'б', 'Б', 'b', 'B'};
            // Заполнение трехмерного массиза и отображение 
            // значений его элементов.
            // Цикл по первому индексу:
            for(int i = 0; i < symbs.GetLength(0); i++){
                // Отображение сообщения:
                Console.WriteLine(" Слой № {0}:", i+1);
                // Цикл по зторому индексу:
                for(int j = 0; j < symbs.GetLength(1); j++){
                    // Цикл по третьему индексу:
                    for(int k = 0; k < symbs.GetLength(2); k++){
                        // Присваивание значения элементу массива: 
                        symbs[i, j, k] = s[i];
                        // Изменение элемента в одномерном массиве: 
                        s[i]++;
                        // Отображение значения элемента массива: 
                        Console.Write(symbs[i, j, k] + " ");
                    }
                    // Переход к новой строке:
                    Console.WriteLine();
                }
                // Отображение "линии":
                Console.WriteLine("----------");
            }
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

    Результат выполнения программы такой.


Рис.1. Результат работы приложения

    Командой

  char[,,] symbs = new char[4, 3, 5];
создается трехмерный символьный массив. Размер массива по первому индексу равен 4, размер массива по второму индексу равен 3, и размер массива но третьему индексу равен 5. Этот массив можно представить себе как "слойку" из четырех таблиц, каждая из трех строк и пяти столбцов. Мы эти таблицы заполняем символами - буквами алфавита. Мы используем русский и английский алфавит, маленькие и большие буквы - то есть всего четыре варианта, по количеству таблиц в "слойке". Для заполнения трехмерного массива используется конструкция из трех вложенных конструкций цикла. Первый внешний цикл индексной переменной i выполняется по первому индексу элементов массива. Для перебора второго индекса использован вложенный цикл с индексной переменной j, а третий индекс перебирается с помощью конструкции цикла с индексной переменной k. Для определения размера массива по первому индексу использована инструкция symbs.GetLength(0), инструкцией symbs.GetLength(1) вычисляется размер массива по второму индексу, а размер по третьему индексу определяется выражением symbs.GetLength(2). Значение элементу массива присваивается командой
  symbs[i, j, k] = s[i];     .
Здесь s[i] - это элемент одномерного символьного массива из четырех элементов (в соответствии с размером трехмерного массива symbs по первому индексу). Массив s содержит буквы, с которых начинается "послойное" заполнение трехмерного массива. После присваивания значения элементу s[i, j, k] значение в одномерном символьном массиве изменяется командой s[i]++, так что у следующего элемента значение будет другим. После присваивания значения элементу трехмерного массива оно выводится в консольное окно.

    На следующем шаге мы рассмотрим массив со строками разной длины.




Предыдущий шаг Содержание Следующий шаг