Wróć do informacji o e-podręczniku Wydrukuj Pobierz materiał do PDF Pobierz materiał do EPUB Pobierz materiał do MOBI Zaloguj się, aby dodać do ulubionych Zaloguj się, aby skopiować i edytować materiał Zaloguj się, aby udostępnić materiał Zaloguj się, aby dodać całą stronę do teczki

Definicja i własności tablic dwuwymiarowych

Zazwyczaj o tablicytablicatablicy myślimy jak o ciągu komórek, w których możemy przechowywać wartości tego samego typu. Każda z komórek ma swój unikatowy numer – indeks. Jeżeli zwizualizujemy tablicę, to może ona wyglądać tak:

Rb9aeyCEFul4Z
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Powyższa tablica zbior ma długość równą 5. Możemy ją skojarzyć z listą elementów. Jest to tablica jednowymiarowa.

Tablica dwuwymiarowa to inaczej jedna tablica, która zawiera w sobie inne tablice, a te z kolei zawierają wartości. W przedstawionym przykładzie każdy z elementów tablicy ma dwa indeksy.

R1C7k9HE05NRU
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

W tym przypadku liczba 89 znajduje się na miejscu o indeksach 1, 1. Podobnie jak w przypadku tablicy jednowymiarowej, aby dostać się do wybranego elementu, podajemy jego indeks w nawiasach kwadratowych. W tablicy dwuwymiarowej podajemy dwa indeksy, pierwszym z nich jest indeks wiersza, a kolejnym jest indeks kolumny. Jeżeli chcemy wypisać wartość zapisaną w wierszu o indeksie 2 i kolumnie o indeksie 1, w języku C++ używamy następującej linijki kodu:

Linia 1. cout otwórz nawias ostrokątny otwórz nawias ostrokątny zbior otwórz nawias kwadratowy 2 zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.

Wynikiem działania tej instrukcji będzie wypisanie liczby 47 w konsoli.

Tablicę dwuwymiarową możemy przyrównać do tablicy tablic wartości danego typu. Jeżeli spróbujemy uzyskać wartość z tablicy dwuwymiarowej, podając tylko jeden indeks, uzyskamy tablicę jednowymiarową. Prezentowanie tablicy dwuwymiarowej przez tabelę jest wygodniejsze do opisania sposobu działania programu. Z kolei w celu zrozumienia sposobu działania samych tablic dwuwymiarowych użyjemy poniższej wizualizacji.

R8iysiCc92P9T
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Jak widzimy powyżej, mamy trzy tablice, które przechowują wartości liczbowe. Te trzy tablice są przechowywane w tablicy o nazwie zbior. Dlatego też wywołując:

Linia 1. zbior otwórz nawias kwadratowy 2 zamknij nawias kwadratowy.

jako wynik otrzymujemy tablicę, która w tablicy zbior ma indeks o wartości 2. Następnie z otrzymanej tablicy pobieramy element o indeksie 1. Te dwa wywołania łączymy w jedno, zapisując indeksy obok siebie:

Linia 1. zbior otwórz nawias kwadratowy 2 zamknij nawias kwadratowy otwórz nawias kwadratowy 1 zamknij nawias kwadratowy. Linia 2. prawy ukośnik prawy ukośnik zbior otwórz nawias kwadratowy 2 zamknij nawias kwadratowy minus zamknij nawias ostrokątny tablica. Linia 3. prawy ukośnik prawy ukośnik tablica otwórz nawias kwadratowy 1 zamknij nawias kwadratowy minus zamknij nawias ostrokątny wartość 47.

Znamy już strukturę danych, jaką są tablice dwuwymiarowe, ale nadal nie wiemy, jak je zdefiniować. W języku C++ jest to bardzo podobne do tworzenia tablicy jednowymiarowej.

Linia 1. int zbior otwórz nawias kwadratowy 3 zamknij nawias kwadratowy otwórz nawias kwadratowy 3 zamknij nawias kwadratowy średnik.

Na początek określamy typ elementów tablicy. W tym przypadku jest to int. Następnie podajemy nazwę tablicy oraz liczbę wierszy i kolumn. Tablica zbior będzie miała trzy wiersze oraz trzy kolumny, dokładnie tak jak w przykładzie.

Po takiej inicjalizacji tablica zbior będzie wypełniona wartościami znajdującymi się w obszarze pamięci, w którym tablica została zapisana. Jeżeli chcemy, aby tablica została zainicjowana podanymi przez nas liczbami, używamy tego zapisu:

Linia 1. int zbior otwórz nawias kwadratowy 3 zamknij nawias kwadratowy otwórz nawias kwadratowy 3 zamknij nawias kwadratowy znak równości otwórz nawias klamrowy otwórz nawias klamrowy 56 przecinek 12 przecinek 34 zamknij nawias klamrowy przecinek otwórz nawias klamrowy 91 przecinek 89 przecinek 13 zamknij nawias klamrowy przecinek otwórz nawias klamrowy 67 przecinek 47 przecinek 28 zamknij nawias klamrowy zamknij nawias klamrowy średnik.

Pierwsza klamra reprezentuje tablicę zbior, natomiast klamry zawarte w niej reprezentują tablice, które są jej elementami. Jeżeli w tym zapisie nie podamy wszystkich elementów, te, które nie zostaną podane, będą zainicjowane wartością 0.

Ciekawostka

Jeżeli nie podamy wartości dla żadnego elementu, cała tablica zostanie zainicjowana zerami. Jedyne co musimy zrobić to:

Linia 1. int zbior otwórz nawias kwadratowy 3 zamknij nawias kwadratowy otwórz nawias kwadratowy 3 zamknij nawias kwadratowy znak równości otwórz nawias klamrowy zamknij nawias klamrowy średnik.

Ponieważ tablice dwuwymiarowe mają dwa indeksy, przejście przez wszystkie pola będzie nieco trudniejsze. Dobrą praktyką jest tworzenie zmiennych, które będą przechowywać rozmiar tablicy. W przypadku tablicy dwuwymiarowej będą potrzebne dwie takie zmienne – jedna będzie przechowywać liczbę wierszy, natomiast druga liczbę kolumn. Do przeglądania tablicy dwuwymiarowej najwygodniej będzie zastosować dwie pętle for, chociaż można użyć dowolnych pętli. Pierwsza z nich posłuży do przejścia przez wiersze, a druga przez kolumny.

Zobaczmy, jak będzie wyglądać prosty program wypisujący wszystkie wartości z tablicy do konsoli.

Linia 1. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny liczbaWierszy średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny liczbaKolumn średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. cout otwórz nawias ostrokątny otwórz nawias ostrokątny zbior otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów cudzysłów średnik. Linia 4. zamknij nawias klamrowy. Linia 6. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 7. zamknij nawias klamrowy.

Tablice wielowymiarowe

Tak jak w przypadku tablic jednowymiarowych, elementami tablic dwuwymiarowych mogą być także inne typy danych niż liczby. Mogą to być na przykład wartości tekstowe, logiczne, czy zdefiniowane przez użytkownika struktury danych.

Szczególna sytuacja ma miejsce wtedy, kiedy elementem tablicy dwuwymiarowej jest kolejna tablica jednowymiarowa. W ten sposób powstaje tablica trójwymiarowa. Rządzi się ona dokładnie takimi samymi prawami jak tablica dwuwymiarowa – oczywiście z tym wyjątkiem, że musimy podawać dodatkowy, trzeci indeks.

Przykładowa tablica trójwymiarowa, wraz z kodem wyświetlającym wszystkie jej elementy:

Linia 1. int trojwymiar otwórz nawias kwadratowy 3 zamknij nawias kwadratowy otwórz nawias kwadratowy 3 zamknij nawias kwadratowy otwórz nawias kwadratowy 3 zamknij nawias kwadratowy znak równości. Linia 2. otwórz nawias klamrowy. Linia 3. otwórz nawias klamrowy otwórz nawias klamrowy 1 przecinek 1 przecinek 1 zamknij nawias klamrowy przecinek otwórz nawias klamrowy 2 przecinek 2 przecinek 2 zamknij nawias klamrowy przecinek otwórz nawias klamrowy 3 przecinek 3 przecinek 3 zamknij nawias klamrowy zamknij nawias klamrowy przecinek. Linia 4. otwórz nawias klamrowy otwórz nawias klamrowy 4 przecinek 4 przecinek 4 zamknij nawias klamrowy przecinek otwórz nawias klamrowy 5 przecinek 5 przecinek 5 zamknij nawias klamrowy przecinek otwórz nawias klamrowy 6 przecinek 6 przecinek 6 zamknij nawias klamrowy zamknij nawias klamrowy przecinek. Linia 5. otwórz nawias klamrowy otwórz nawias klamrowy 7 przecinek 7 przecinek 7 zamknij nawias klamrowy przecinek otwórz nawias klamrowy 8 przecinek 8 przecinek 8 zamknij nawias klamrowy przecinek otwórz nawias klamrowy 9 przecinek 9 przecinek 9 zamknij nawias klamrowy zamknij nawias klamrowy. Linia 6. zamknij nawias klamrowy średnik. Linia 8. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny 3 średnik i plus plus zamknij nawias okrągły. Linia 9. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny 3 średnik j plus plus zamknij nawias okrągły. Linia 10. for otwórz nawias okrągły int k znak równości 0 średnik k otwórz nawias ostrokątny 3 średnik k plus plus zamknij nawias okrągły. Linia 11. cout otwórz nawias ostrokątny otwórz nawias ostrokątny trojwymiar otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias kwadratowy k zamknij nawias kwadratowy średnik.
Ciekawostka

Tablice wielowymiarowe (najczęściej dwu- lub trójwymiarowe) są powszechnie używane do reprezentacji światów w grach komputerowych. Popularna gra Minecraft do przechowywania bloków w poszczególnych częściach świata używa właśnie tablic trójwymiarowych. Same części świata, tak zwane chunki, przechowywane są z kolei w tablicy dwuwymiarowej.

Nic nie stoi na przeszkodzie, abyśmy w ten sam sposób tworzyli tablice o większej liczbie wymiarów. Tablicę czterowymiarową stworzymy, implementując tablicę trójwymiarową, której elementami są tablice jednowymiarowe.

Słownik

macierz
macierz

zbiór liczb lub wyrażeń zapisanych w postaci prostokątnej tablicy

tablica
tablica

kontener (struktura danych) służący do przechowywania danych (wartości) tego samego typu; każdy element ma określony indeks (kolejny numer); w pamięci komputera elementy tablicy są ułożone kolejno jeden obok drugiego