Tablice dwuwymiarowe w C#

Tablice dwuwymiarowe pozwalają na przechowywanie danych w formie tabeli (wiersze i kolumny). Są szczególnie przydatne do reprezentowania macierzy, tabel ocen, planów lekcji czy map.

Deklaracja i inicjalizacja tablic 2D

// Deklaracja pustej tablicy 2D
int[,] macierz = new int[3, 4]; // 3 wiersze, 4 kolumny

// Inicjalizacja z wartościami
int[,] oceny = {
    {5, 4, 3, 5},  // Wiersz 0 (np. uczeń 1)
    {3, 5, 4, 4},  // Wiersz 1 (np. uczeń 2)
    {4, 3, 5, 5}   // Wiersz 2 (np. uczeń 3)
};

// Można też zapisać w taki sposób:
int[,] macierz2 = new int[,] {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

Dostęp do elementów w tablicy 2D

int[,] oceny = {
    {5, 4, 3, 5},  // Matematyka, Polski, Angielski, Historia
    {3, 5, 4, 4},
    {4, 3, 5, 5}
};

// Dostęp do elementu: [wiersz, kolumna]
Console.WriteLine($"Ocena ucznia 1 z polskiego: {oceny[0, 1]}");  // 4
Console.WriteLine($"Ocena ucznia 2 z historii: {oceny[1, 3]}");   // 4

// Zmiana oceny
oceny[0, 1] = 5; // Poprawa oceny ucznia 1 z polskiego na 5
Console.WriteLine($"Nowa ocena: {oceny[0, 1]}");  // 5

Właściwości tablic 2D

int[,] macierz = new int[4, 3]; // 4 wiersze, 3 kolumny

Console.WriteLine($"Liczba wierszy: {macierz.GetLength(0)}");      // 4
Console.WriteLine($"Liczba kolumn: {macierz.GetLength(1)}");       // 3
Console.WriteLine($"Całkowita liczba elementów: {macierz.Length}"); // 12

Iterowanie przez tablicę 2D

int[,] liczby = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

// Wyświetlanie wszystkich elementów
for (int wiersz = 0; wiersz < liczby.GetLength(0); wiersz++)
{
    for (int kolumna = 0; kolumna < liczby.GetLength(1); kolumna++)
    {
        Console.Write(liczby[wiersz, kolumna] + " ");
    }
    Console.WriteLine(); // Nowa linia po każdym wierszu
}

Praktyczny przykład – tabela ocen

// Dane uczniów i przedmiotów
string[] uczniowie = {"Anna", "Piotr", "Maria"};
string[] przedmioty = {"Matematyka", "Polski", "Angielski", "Historia"};

int[,] oceny = {
    {5, 4, 3, 5},  // Anna
    {3, 5, 4, 4},  // Piotr  
    {4, 3, 5, 5}   // Maria
};

Console.WriteLine("Tabela ocen:");
Console.WriteLine("=============");

// Wyświetl nagłówki przedmiotów
Console.Write("Uczeń".PadRight(10));
for (int j = 0; j < przedmioty.Length; j++)
{
    Console.Write(przedmioty[j].PadRight(12));
}
Console.WriteLine();

// Wyświetl oceny każdego ucznia
for (int i = 0; i < uczniowie.Length; i++)
{
    Console.Write(uczniowie[i].PadRight(10));
    for (int j = 0; j < przedmioty.Length; j++)
    {
        Console.Write(oceny[i, j].ToString().PadRight(12));
    }
    Console.WriteLine();
}

Obliczenia na tablicach 2D

int[,] oceny = {
    {5, 4, 3, 5},  // Anna
    {3, 5, 4, 4},  // Piotr
    {4, 3, 5, 5}   // Maria
};

Console.WriteLine("Średnie uczniów:");

// Oblicz średnią dla każdego ucznia (wiersza)
for (int i = 0; i < oceny.GetLength(0); i++)
{
    int suma = 0;
    for (int j = 0; j < oceny.GetLength(1); j++)
    {
        suma += oceny[i, j];
    }
    double srednia = suma / (double)oceny.GetLength(1);
    Console.WriteLine($"Uczeń {i + 1}: {srednia:F2}");
}

Console.WriteLine("\nŚrednie przedmiotów:");

// Oblicz średnią dla każdego przedmiotu (kolumny)
for (int j = 0; j < oceny.GetLength(1); j++)
{
    int suma = 0;
    for (int i = 0; i < oceny.GetLength(0); i++)
    {
        suma += oceny[i, j];
    }
    double srednia = suma / (double)oceny.GetLength(0);
    Console.WriteLine($"Przedmiot {j + 1}: {srednia:F2}");
}

Wyszukiwanie w tablicy 2D

int[,] macierz = {
    {1, 5, 3},
    {7, 2, 8},
    {4, 9, 6}
};

int szukanaLiczba = 7;
bool znaleziono = false;
int znalezionyWiersz = -1, znalezionyKolumna = -1;

// Przeszukaj całą macierz
for (int i = 0; i < macierz.GetLength(0) && !znaleziono; i++)
{
    for (int j = 0; j < macierz.GetLength(1) && !znaleziono; j++)
    {
        if (macierz[i, j] == szukanaLiczba)
        {
            znaleziono = true;
            znalezionyWiersz = i;
            znalezionyKolumna = j;
        }
    }
}

if (znaleziono)
{
    Console.WriteLine($"Liczba {szukanaLiczba} znaleziona na pozycji [{znalezionyWiersz}, {znalezionyKolumna}]");
}
else
{
    Console.WriteLine($"Liczba {szukanaLiczba} nie została znaleziona");
}