Двумерные массивы в C# (.NET 6): подробное руководство
Двумерные массивы в C#
Представь себе шахматную доску. У неё есть строки и столбцы. Или представь таблицу умножения, которую ты учил в школе. Обычный массив — это как список книг на одной полке. А двумерный массив — это уже целый стеллаж с несколькими полками! На каждой полке (строке) лежит по несколько книг (элементов).
В программировании двумерные массивы помогают хранить данные, которые удобно представлять в виде таблицы: карту острова, схему кинозала, результаты игр, таблицу температур по дням недели.
Как объявить двумерный массив?
В C# двумерный массив объявляется с помощью запятой внутри квадратных скобок: [,]. Первое число в скобках — количество строк, второе — количество столбцов.
// Создаём пустой массив 3 строки на 4 столбца (например, 3 ряда по 4 места в кинотеатре)
int[,] cinema = new int[3, 4];
Можно сразу заполнить массив данными:
int[,] numbers = new int[,]
{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
Здесь у нас 3 строки и 3 столбца. Обрати внимание: каждая строка — это свой набор чисел в фигурных скобках.
Как обратиться к элементу?
Чтобы получить или изменить элемент, нужно указать его индекс строки и индекс столбца. Помни: счёт начинается с нуля!
int[,] map = new int[2, 3]; // 2 строки, 3 столбца
map[0, 0] = 5; // Первая строка, первый столбец
map[0, 1] = 10; // Первая строка, второй столбец
map[1, 2] = 15; // Вторая строка, третий столбец
Console.WriteLine(map[0, 1]); // Выведет 10
Как пройти по всем элементам (двойной цикл)?
Чтобы перебрать все элементы двумерного массива, используют два вложенных цикла for. Первый цикл идёт по строкам, второй — по столбцам.
int[,] matrix = new int[,] { {1, 2}, {3, 4} };
for (int i = 0; i < matrix.GetLength(0); i++) // i — номер строки
{
for (int j = 0; j < matrix.GetLength(1); j++) // j — номер столбца
{
Console.Write(matrix[i, j] + " ");
}
Console.WriteLine(); // Переход на новую строку после каждой строки таблицы
}
Важно! GetLength(0) даёт количество строк, а GetLength(1) — количество столбцов.
Разбор типичных задач
Задача 1: Создание схемы зала (ввод с клавиатуры)
Представь, что мы создаём схему кинозала. Сначала узнаем у пользователя, сколько рядов и мест, а потом заполняем массив.
Console.Write("Введите количество рядов: ");
int rows = int.Parse(Console.ReadLine());
Console.Write("Введите количество мест в ряду: ");
int cols = int.Parse(Console.ReadLine());
int[,] hall = new int[rows, cols];
// Заполняем массив (например, всеми единицами — свободные места)
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
hall[i, j] = 1; // 1 — место свободно
}
}
// Выводим схему зала
Console.WriteLine("Схема зала:");
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
Console.Write(hall[i, j] + " ");
}
Console.WriteLine();
}
Задача 2: Поиск максимального элемента (например, самое сильное землетрясение)
Допустим, у нас есть массив 2x2 с магнитудой землетрясений. Нужно найти самое сильное.
double[,] earthquakes = new double[2, 2];
Console.WriteLine("Введите 4 значения магнитуды:");
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
earthquakes[i, j] = double.Parse(Console.ReadLine());
}
}
double maxMagnitude = earthquakes[0, 0];
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
if (earthquakes[i, j] > maxMagnitude)
{
maxMagnitude = earthquakes[i, j];
}
}
}
Console.WriteLine($"Максимальная магнитуда: {maxMagnitude}");
Частые ошибки новичков
- Выход за границы массива. Если массив размером 3x3, то индексы строк и столбцов от 0 до 2. Обращение к
arr[3, 0]вызовет ошибку. - Путаница строк и столбцов. Первый индекс — это всегда строка (ряд), второй — столбец (место).
- Забывают про вложенный цикл. Чтобы заполнить или вывести двумерный массив, нужно два цикла, один внутри другого.
- Использование
LengthвместоGetLength(). СвойствоLengthвернёт общее количество элементов (строки * столбцы), а не отдельно количество строк или столбцов.
Итоговый пример: Карта сокровищ капитана Сильвера
Капитан Сильвер спрятал клад на острове. У нас есть карта 3x3, где 'X' — это сокровище, а 'O' — пустое место. Напишем программу, которая находит координаты сокровища.
char[,] island = new char[3, 3];
Console.WriteLine("Введите карту острова (3 строки по 3 символа, X или O):");
for (int i = 0; i < 3; i++)
{
string line = Console.ReadLine(); // Читаем целую строку
for (int j = 0; j < 3; j++)
{
island[i, j] = line[j]; // Записываем каждый символ в массив
}
}
bool found = false;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (island[i, j] == 'X')
{
Console.WriteLine($"Сокровище найдено! Ряд: {i + 1}, Место: {j + 1}");
found = true;
}
}
}
if (!found)
{
Console.WriteLine("Сокровище не найдено. Капитан Сильвер обманул!");
}
Двумерные массивы — мощный инструмент. Они позволяют работать с табличными данными, картами и игровыми полями. Главное — запомнить: первый индекс — строка, второй — столбец, и всегда использовать два цикла для обхода. Удачи в программировании!