Jason. Cała informatyka w jednym miejscu!

Kontynuujemy otwarty wcześniej podtemat programowania w języku C# i powrócimy sobie do tablic. Tablice jednowymiarowe zostały już wytłumaczone wcześniej, aczkolwiek nie sięgaliśmy z tym wątkiem dalej. Zatem, dzisiaj przekonacie się jak tworzona jest tablica wielowymiarowa w języku C#! Przekażę Wam wszystkie najistotniejsze porady i wskazówki jak się z taką obchodzić, przytaczając przykład tablicy 2D oraz 3D :O!

TABLICA WIELOWYMIAROWA W JĘZYKU C# MOŻE SERYJNIE NAMIESZAĆ W GŁOWIE

Niektórzy z Was mogą teraz wyrywać sobie włosy z głowy jak może wyglądać tablica wielowymiarowa, zarówno w kodzie źródłowym jak i w efekcie końcowym. Inicjalizacja? Nic strasznego! Obsługa? Tutaj już nie mogę obiecać, że będzie łatwo ;). W dalszej części niniejszego artykułu przybliżę Wam jak wygląda deklaracja, definicja oraz obsługa.

WYGLĄD W KODZIE ŹRÓDŁOWYM

Zacznijmy sobie od 2D. Tablica dwuwymiarowa w języku C# może posiadać taką oto postać:

int[,] numbers;

Te same nawiasy kwadratowe co przy jednym wymiarze, aczkolwiek teraz mamy "dodatek" w postaci przecinka umieszczonego wewnątrz nich! To jest sygnał dla kompilatora, że pragniemy aby tablica posługiwała się dwoma wymiarami. Możecie jeszcze skorzystać z takiej postaci:

int[][] numbers;

W rzeczywistości jest to "tablica tablic" (całkiem inna konstrukcja) i ten wątek poszerzyłem w innym artykule, bo wymaga on zupełnie innego podejścia gdy dyskutujemy o obsłudze przez pętle. A co z tablicą trójwymiarową? Bardzo podobnie:

int[,,] numbers;

tylko teraz DWA przecinki zamiast jednego. Co zaś się tyczy definicji takiej tablicy, to także różni się to drobnostkami:

int[,] numbers = new int[2, 3];

A tak z natychmiastowym podstawieniem wartości:

int[,] numbers =
{
	{4, 7, -4},
	{9, 45, 16}
};

Już :). A tablica wielowymiarowa w języku C# w 3D? W taki sposób:

int[,,] numbers = new int[2, 2, 3];

lub też:

int[,,] numbers =
{
	{
		{5, 8, 9},
		{3, 2, 500}
	},

	{
		{78, -90, 243},
		{45, -80, -70}
	}
};

Definicję mamy załatwioną. Teraz trudniejsza część.

OBSŁUGA TABLICY WIELOWYMIAROWEJ

Jak opisaliśmy sobie w artykule z tablicami jednowymiarowymi, obsługa każdego z jej argumentów nie obejdzie się bez pętli "for". Co by się nie działo, to gdy chcemy wykonać jakiekolwiek operacje na każdym z elementów tablicy, pętla "for" jest nieodłącznym elementem bytowania:

int[] numbers = {1, 89, 80, 702, 1984};

for (int i = 0; i < numbers.Length; ++i)
{
	Console.WriteLine(numbers[i]);
}

Co jednak zrobić kiedy mamy do czynienia z tablicą dwuwymiarową? Otóż trzeba wiedzieć, że jedna pętla "for" to każdy kolejny wymiar tablicy. Dlatego przy jednowymiarowej, była potrzebna tylko jedna pętla "for". Dla dwóch wymiarów będą DWIE pętle, a dla trzech, TRZY.

Fajnie. Tylko jak skonstruować działanie, aby gwarantowało przedostanie się do każdej komórki w każdym przypadku? Trzeba jedną pętlę osadzić w drugiej :O! A to z kolei naświetla nam przypadek występowania pętli zagnieżdżonej. Pętla zagnieżdżona polega na dosłownym "wtłoczeniu" całej kolejnej pętli wewnątrz innej pętli, w ramach bloku instrukcji:

for (int x = 0; x < M; ++x)
{
	for (int y = 0; y < N; ++y)
	{
		// instrukcje
	}
}

Oto cała tajemnica jak obchodzić się z tablicą dwuwymiarową. Co każdy następny wymiar, schodzimy w głąb niżej, aż do momentu osiągnięcia ostatniego wymiaru. Liczba pętli musi się zgadzać z liczbą wymiarów.

Teraz kolejne pytanie. W jaki sposób radzić sobie z identyfikacją granic rzędów i kolumn? Cóż. To zależy w jakiej formie budujemy naszą tablicę. W języku C#, wyróżniamy dwie formy. Albo występuje jako tablica wielowymiarowa:

int[,] numbers;

i wtedy wszystkie wiersze muszą mieć identyczną liczbę argumentów, albo jako zagnieżdżona ("tablica tablic") i tu znowu konieczna jest inna technika (i tablica może mieć nieregularne wielkości):

int[][] numbers;

Opiszę w tym artykule jak się obchodzić z tą pierwszą. Posługując się wersją "tą z przecinkiem", musimy uważać podczas uzależniania działania od właściwości "Length", gdyż ona zwróci sumę elementów wszystkich rzędów i kolumn! To jest zbyteczne, więc nauczcie się wykorzystywać metodę "GetLength", która zwróci Wam liczbę elementów w danym rzędzie, oczekując w zamian parametru całkowitoliczbowego określającego wymiar, o który nam chodzi. Zerknijcie w dół, a wszystko stanie się mniej zawiłe:

int[,] numbers =
{
	{4, 7, -4},
	{9, 45, 16}
};

for (int y = 0; y < numbers.GetLength(0); ++y)
{
	for (int x = 0; x < numbers.GetLength(1); ++x)
	{
		Console.WriteLine(numbers[y, x]);
	}
}

Jedyna rzecz pozostała do skomentowania to zapis wydobywający argument. Ponieważ przedstawiona wyżej tablica wielowymiarowa w języku C# składa się z dwóch wymiarów, potrzebujemy DWÓCH identyfikatorów określających położenie w tablicy, jak punkt na płaszczyźnie. Zatem, po nazwie tablicy wstawiamy wewnątrz nawiasów kwadratowych DWA indeksy, jeden dla jednego, drugi dla drugiego wymiaru. W taki sposób trzeba się z nimi obchodzić. Tablice trójwymiarowe będą potrzebowały jeszcze jednego stopnia zagłębienia, więc będziemy mieli wówczas trzy pętle "for":

for (int z = 0; z < numbers.GetLength(0); ++z)
{
	for (int y = 0; y < numbers.GetLength(1); ++y)
	{
		for (int x = 0; x < numbers.GetLength(2); ++x)
		{
			Console.WriteLine(numbers[z, y, x]);
		}
	}
}

Jest dla mnie całkowicie zrozumiałe, że to może budzić niemałe obawy przed poziomem skomplikowania, zwłaszcza dla kogoś kto nie miał jeszcze żadnej styczności z programowaniem. Jednak nie martwcie się. Dotychczasowa praktyka mi pokazała, że zdecydowana większość problemów jakie przyjdzie Wam rozwiązać nie będzie wymagała sięgania dalej niż po dwa wymiary. Tablica trójwymiarowa stanie się niezbędna tylko w niewielkiej części algorytmów, i to w bardziej zaawansowanych programach ;).

Tablica dwuwymiarowa w języku C#

Tablica wielowymiarowa wymaga użycia pętli zagnieżdżonych "for", a ich liczba musi odpowiadać liczbie wymiarów.


Dobra, tyle! Tablica wielowymiarowa w języku C# potrafi nieźle dokopać poziomem skomplikowania z powodu konieczności zaznajomienia się z mniej oczywistą metodą obsługiwania wszystkich komórek. Bądźcie przygotowani na stwierdzenia wielu ludzi, że "to są podstawy". Bo są!

PODOBNE ARTYKUŁY