На этом шаге мы рассмотрим пример инициализации двумерного массива.
Как и одномерный массив, двумерный массив можно инициализировать при создании. В этом случае переменной массива присваивается список со значениями, которыми инициализируется двумерный массив. Список значений заключается в фигурные скобки. Его элементами являются вложенные списки. Каждый вложенный список выделяется парой фигурных скобок. Значения, указанные во вложенных списках, определяют строки двумерного массива. Например, командой
int[,] nums = { {1, 2, 3}, {4, 5, 6} };
int[,] nums = { {1, 2}, {3, 4}, {5, 6} }; ,
int[,] nums = { {1, 2, 3}, {4, 5, 6} };
int[,] nums = new int [2, 3]{ {1, 2, 3}, {4, 5, 6} } ;
int[,] nums = new int [,]{ {1, 2, 3}, {4, 5, 6} } ; .
Далее рассматривается пример, в котором, кроме прочего, используется инициализация двумерного массива. В символьный массив из двух строк и трех столбцов вставляется строка и столбец. Индексы добавляемых строки и столбца определяются с помощью генератора случайных чисел. Чтобы понять, как это делается, рассмотрим приведенный ниже программный код.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr57_1 { class Program { static void Main() { // Создание и инициализация двумерного массива: char[,] symbs = { {'A', 'B', 'C'}, {'D', 'E', 'F'} }; Console.WriteLine("Исходный массив:"); // Отображение массива: for(int i = 0; i < symbs.GetLength(0); i++) { for(int j = 0; j < symbs.GetLength(1); j++) { // Отображение значения элемента: Console.Write(symbs[i,j] + " "); } // Переход к новой строке: Console.WriteLine(); } // Объект для генерирования случайных чисел: Random rnd = new Random(); // Строка и столбец: int row = rnd.Next(symbs.GetLength(0)+1); int col = rnd.Next(symbs.GetLength(1)+1); Console.WriteLine("Добавляется {0}-я строка и {1}-й столбец", row, col); // Создание нового массива: char[,] tmp = new char[symbs.GetLength(0)+1, symbs.GetLength(1)+1]; // Целочисленные переменные: int a, b; // Символьная переменная: char s = 'a'; // Заполнение массива. Копирование значений // из исходного массива: for (int i = 0; i < symbs.GetLength(0); i++) { // Первый индекс для элемента нового массива: if (i < row) a = i; else a = i + 1; for (int j = 0; j < symbs.GetLength(1); j++) { // Второй индекс для элемента нового массива: if (j < col) b = j; else b = j + 1; // Присваивание значения элементу массива: tmp[a, b] = symbs[i, j]; } } // Заполнение добавленной строки в новом массиве: for(int j = 0; j < tmp.GetLength(1); j++){ // Значение элемента в строке: tmp[row, j] = s; // Новое значение для следующего элемента: s++; } for(int i = 0; i < tmp.GetLength(0); i++){ // Если элемент не в добавленной строке: if ( i != row ) { // Значение элемента в столбце: tmp[i, col] = s; // Новое значение для следующего элемента: s++; } } // Присваивание массивов: symbs = tmp; Console.WriteLine("Новый массив:"); // Отображение массива: for (int i = 0; i < symbs.GetLength(0); i++) { for (int j = 0; j < symbs.GetLength(1); j++) { // Отображение значения элемента: Console.Write(symbs[i, j] + " "); } // Переход к новой строке: Console.WriteLine(); } // Задержка: Console.ReadLine(); } } }
С поправкой на использование генератора случайных чисел результат выполнения программы может быть таким.
Рис.1. Результат работы приложения
Проанализируем программный код.
Исходный символьный массив symbs создается и инициализируется командой
char[,] symbs = { {'A', 'B', 'C'}, {'D', 'E', 'F'} }; .
Это массив из двух строк и трех столбцов, заполненный английскими буквами в алфавитном порядке (хотя в данном случае это не принципиально). С помощью вложенных конструкций цикла содержимое этого массива отображается в консольном окне. Поскольку нам понадобится генерировать случайные числа, командой
Random rnd = new Random();
Console.WriteLine("Добавляется {0}-я строка и {1}-й столбец", row, col);
char[,] tmp = new char[symbs.GetLength(0)+1, symbs.GetLength(1)+1];
tmp[a, b] = symbs[i, j];
После выполнения вложенных циклов в массиве tmp присвоены значения всем элементам, за исключением тех, что находятся в добавляемой строке и добавляемом столбце. Эти строка и столбец заполняются отдельно. Сначала заполняется добавляемая строка: запускается конструкция цикла, в котором индексная переменная j перебирает элементы в строке с индексом row. Значение элементу в строке присваивается командой
tmp[row, j] = s; .
Начальное значение переменной s равно 'а' (маленькая буква русского алфавита). Такое значение будет у первого элемента в добавленной строке. Для следующего элемента значением будет следующая буква в алфавите, поскольку мы использовали команду s++, которой значение переменной s "увеличивается на единицу": значением переменной становится следующий символ в алфавите.
После заполнения добавленной строки заполняется добавленный столбец. В соответствующем операторе цикла индексная переменная i перебирает элементы в столбце с индексом col. Значение элементам присваивается командой
tmp[i, col] = s; .
Единственное, это происходит лишь в случае, если элемент не находится в добавленной строке (значение этого элемента уже определено при заполнении строки). Поэтому мы использовали условный оператор с условием i!=row (первый индекс i элемента не совпадает с индексом row добавленной строки).
На этом заполнение массива tmp завершается. Но мы идем дальше и выполняем присваивание массивов командой
symbs = tmp; .
В результате и переменная symbs, и переменная tmp ссылаются на один и тот же массив: это новый массив, созданный путем добавления к исходному массиву строки и столбца. Для проверки содержимого созданного массива использованы вложенные циклы.
Что касается исходного массива, на который ранее ссылалась переменная symbs, то, поскольку на этот массив больше не ссылается ни одна переменная, массив из памяти будет удален системой сборки мусора.
На следующем шаге мы рассмотрим многомерные массивы.