1. Wprowadzenie
Wyobraź sobie zwykłą tablicę jako długie pudełko po pizzy, gdzie wszystkie kawałki leżą w jednym rzędzie — smacznie, ale trochę nudno.
A teraz pomyśl o grafiku pracy albo szachownicy. Tam wszystko jest już zorganizowane w wiersze i kolumny — czyli w tabelę. To właśnie klasyczne zadanie dla tablicy dwuwymiarowej.
W prawdziwym życiu tablice dwuwymiarowe spotykasz na każdym kroku:
- Tabele z wypłatami pracowników (wiersze — pracownicy, kolumny — miesiące).
- Obrazek na ekranie (każde "pole" — kolor piksela, dwie współrzędne: X i Y).
- Obliczenia macierzowe i przetwarzanie danych.
- Szachownica albo plansza do kółko-krzyżyk.
Czasem tablicę dwuwymiarową nazywa się macierzą (to określenie przyszło z matematyki).
Jest mnóstwo miejsc, gdzie jako programista możesz potrzebować tablicy dwuwymiarowej. Realizacja praktycznie każdej gry planszowej — to gotowa tablica dwuwymiarowa: „Szachy”, „Warcaby”, „Kółko-Krzyżyk”, „Statki”:
Plansza do „Szachów” albo „Statków” jest tak zrobiona, że idealnie pasuje do tablicy dwuwymiarowej, gdzie jako współrzędne pól używasz po prostu liczb. Nie „pionek e2 → e4”, tylko „pionek (4,1) → (4,3)”. Tak programiście jest nawet łatwiej.
2. Składnia deklaracji tablic dwuwymiarowych
Straszne tylko do pierwszej deklaracji! Rozkminiamy krok po kroku.
Ogólna zasada
typ[,] nazwaTablicy;
Tutaj przecinek , w nawiasach — to nie błąd kompilatora po nocy z kawą, tylko wskazanie: tablica jest dwuwymiarowa.
Przykłady
int[,] macierz;
double[,] tabelaOcen;
string[,] szachownica;
Tworzenie tablicy
Podajemy rozmiary: ilość wierszy i kolumn.
macierz = new int[3, 4]; // 3 wiersze, 4 kolumny
To tabelka 3x4: wyobraź sobie tabelę w Excelu z 3 wierszami i 4 kolumnami.
Można od razu zadeklarować zmienną i stworzyć tablicę dwuwymiarową:
int[,] macierz = new int[3, 4];
Można też od razu zainicjalizować wartościami (prawie jak z jednowymiarową):
int[,] przyklad = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// Tabela 3 wiersze, 3 kolumny
Ważne: WSZYSTKIE wiersze przy takiej inicjalizacji muszą mieć tę samą długość. Nie można zrobić pierwszego wiersza z 3 elementów, a drugiego — z 2.
Schemat wizualny
┌─────┬─────┬─────┬─────┐
│ 0 │ 1 │ 2 │ 3 │ ← kolumny (Columns)
├─────┼─────┼─────┼─────┤
│ 0,0 │0,1 │0,2 │0,3 │ ← wiersz 0 (Row 0)
├─────┼─────┼─────┼─────┤
│ 1,0 │1,1 │1,2 │1,3 │ ← wiersz 1 (Row 1)
├─────┼─────┼─────┼─────┤
│ 2,0 │2,1 │2,2 │2,3 │ ← wiersz 2 (Row 2)
└─────┴─────┴─────┴─────┘
Każdy element określasz parą indeksów [wiersz, kolumna].
3. Indeksowanie i dostęp do elementów
W tablicy dwuwymiarowej, żeby dostać się do elementu, podajesz dwa indeksy:
- Pierwszy — numer wiersza
- Drugi — numer kolumny
macierz[1, 2] = 99; // W drugim wierszu (indeks 1), trzecia kolumna (indeks 2)
Jeśli ktoś jest przyzwyczajony do szachów, przypominam: indeksowanie zaczyna się od zera. Czyli pierwszy element to [0, 0].
Zapis i odczyt
int[,] dane = new int[5, 2];
dane[1, 1] = 5; // zapis
int wartosc = dane[1, 1]; // odczyt
Tak to wygląda w pamięci:
4. Wypełnianie tablicy dwuwymiarowej
Napiszmy kod, który wypełni macierz kolejnymi liczbami od 1 do 12, żeby było jasne, jak to działa.
int[,] macierz = new int[3, 4];
int wartosc = 1;
for (int wiersz = 0; wiersz < 3; wiersz++)
{
for (int kol = 0; kol < 4; kol++)
{
macierz[wiersz, kol] = wartosc;
wartosc++;
}
}
Tutaj zewnętrzna pętla przechodzi po wierszach, a wewnętrzna — po kolumnach.
Ilustracja:
Po wykonaniu:
┌────┬────┬────┬────┐
│ 1 │ 2 │ 3 │ 4 │
├────┼────┼────┼────┤
│ 5 │ 6 │ 7 │ 8 │
├────┼────┼────┼────┤
│ 9 │10 │11 │12 │
└────┴────┴────┴────┘
5. Wymiary: pobieranie liczby wierszy i kolumn
Często rozmiary tablicy trzeba poznać "w locie". W C# do tego jest wygodna metoda GetLength().
int[,] macierz = new int[3, 4];
int wiersze = macierz.GetLength(0); // liczba wierszy (pierwszy wymiar) - 3
int kolumny = macierz.GetLength(1); // liczba kolumn (drugi wymiar) - 4
Console.WriteLine($"Wierszy: {wiersze}, Kolumn: {kolumny}");
nie myl z Length — w tablicy dwuwymiarowej to ogólna liczba wszystkich elementów (wiersze × kolumny).
6. Wyświetlanie tablicy dwuwymiarowej na ekranie
Do wyświetlania tabeli dwuwymiarowej zwykle używa się podwójnej pętli — i to trochę jak rysowanie labiryntu w konsoli. Przykład:
for (int wiersz = 0; wiersz < macierz.GetLength(0); wiersz++)
{
for (int kol = 0; kol < macierz.GetLength(1); kol++)
{
Console.Write(macierz[wiersz, kol] + "\t"); // "\t" — tabulacja dla estetyki
}
Console.WriteLine(); // przejście do nowego wiersza
}
Przykład wyjścia:
1 2 3 4
5 6 7 8
9 10 11 12
Przy okazji, właśnie nauczyłeś się ładnie "rysować" tabele za pomocą kilku linijek kodu!
7. Tablice wielowymiarowe
I jeszcze jeden ciekawy fakt o tablicach, o którym pewnie już się domyślasz. Skoro można zrobić tablicę dwuwymiarową, to można też trójwymiarową?
Tak, można stworzyć tablicę dowolnej liczby wymiarów. Takie tablice nazywamy wielowymiarowymi.
Jak deklarować tablice wielowymiarowe
Wystarczy po prostu podać odpowiednią liczbę wymiarów, oddzielając je przecinkami:
int[,,,] macierz = new int[2, 3, 4, 5];
Tutaj mamy tablicę czterowymiarową:
- 2 elementy po pierwszej współrzędnej,
- 3 — po drugiej,
- 4 — po trzeciej,
- 5 — po czwartej.
W pamięci taka tablica to jeden wielki “sześcian” danych, upakowany po kolei.
Jak odwoływać się do elementów
Dostęp do elementu odbywa się przez wszystkie indeksy naraz:
macierz[0, 1, 2, 3] = 42;
int wartosc = macierz[1, 2, 0, 4];
- Indeksy zaczynają się od zera, jak zawsze w C#.
- W takiej tablicy będzie 2 × 3 × 4 × 5 = 120 elementów.
Praktyczne przykłady tablic wielowymiarowych
- 2D — tabele, szachownice, obrazy.
- 3D — “kostki” w grafice komputerowej, dane do obliczeń naukowych (np. temperatura w różnych punktach przestrzeni i czasu).
- 4D i wyżej — rzadko używane, ale spotykane w zaawansowanej matematyce, symulacjach, machine learningu itd.
GO TO FULL VERSION