🔷 C#

Двумерные массивы в 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("Сокровище не найдено. Капитан Сильвер обманул!");
}

Двумерные массивы — мощный инструмент. Они позволяют работать с табличными данными, картами и игровыми полями. Главное — запомнить: первый индекс — строка, второй — столбец, и всегда использовать два цикла для обхода. Удачи в программировании!