Podręcznik

2. Tablice wielowymiarowe

W języku C++ możliwa jest także implementacja tablic wielowymiarowych. Tablice wielowymiarowe statyczne w języku C++ to struktury danych pozwalające przechowywać elementy tego samego typu w wielu wymiarach. Możliwe jest tworzenie tablic o w zasadzie dowolnym zagnieżdżeniu. 

Ogólna postać definicji tablic wielowymiarowych jest następująca:

typ_elementów  nazwa_zmiennej [rozmiar 1] [rozmiar 2]...[rozmiar n];

gdzie rozmiar 1, rozmiar 2, ... , rozmiar n - są odpowiednimi zakresami indeksów dla poszczególnych wymiarów. Czyli, jak wspomnieliśmy - nic nowego.

Poniżej przedstawiono przykład definicji tablicy trójwymiarowej o wymiarach 4x5x8.
int tab[4][5][8];
Najczęściej spotykaną formą tablic wielowymiarowych są tablice dwuwymiarowe, które można sobie wyobrazić jako macierze lub tabele o ustalonej liczbie wierszy i kolumn.
Tablicę dwuwymiarową możemy zdefiniować w następujący sposób: typ_danych nazwa_tablicy[liczba_wierszy][liczba_kolumn]; gdzie liczba_wierszy - liczba wierszy w tablicy, liczba_kolumn - liczba kolumn w tablicy.
Inicjalizacja tablicy może być połączona z jej definicją analogicznie jak w przypadku tablicy jednowymiarowej.
const int w=3, k=4;
int tab[w][k]={2,3,8,6,4,2,9,0,7,1,12,5};
Kolejne wartości podane w nawiasach klamrowych umieszczane są w tablicy wierszami. Analogicznie jak w przypadku tablic jednowymiarowych możemy uzupełnić tablicę wartościami zerowymi podczas deklaracji.
const int w=3, k=4; int tab[w][k]={0};
Dostęp do poszczególnych elementów odbywa się za pomocą indeksów. W przypadku tablicy dwuwymiarowej pierwszy podawany jest indeks kolumny, a następnie indeks wiersza tablicy. Wartości indeksów zmieniają się od 0 do n-1 (gdzie n - rozmiar danego wymiaru tablicy). 




Poniżej przedstawiono nagranie demonstrujące deklarację tablicy dwuwymiarowej, wypełnianie jej przykładowymi danymi oraz drukowanie zawartości tablicy na ekranie.
  Szczególnym przypadkiem tablic dwuwymiarowych są tablice kwadratowe, które mają tyle samo kolumn i wierszy, więc można wyróżnić w nich dwie przekątne: główną przekątna i drugą przekątną

Możemy wyróżnić elementy znajdujące się na głównej przekątnej.


oraz elementy znajdujące się na drugiej przekątnej.


Poniżej przedstawiono przykładową aplikację, która umożliwia wydrukowanie na ekranie wartości z głównej przekątnej tablicy oraz z drugiej przekątnej.
  
Wartość możemy wydrukować przy pomocy pojedynczej pętli for.  Nie ma konieczności wykorzystywania dwóch pętli. Jeśli mamy tablicę tab[n][n] i chcemy wydrukować elementy jej głównej przekątnej, robimy to tak:

for (int i = 0; i < n; i++)
    cout << a[i][i] << "\t";
    
Natomiast po drugiej przekątnej poruszamy się tak:

for (int i = 0; i < n; i++)
    cout << a[i][n-1-i] << "\t";
    
W tablicy kwadratowej oprócz elementów leżących na poszczególnych przekątnych możemy wyróżnić m.in.:
  • elementy leżące nad główną przekątną,
  • elementy leżące pod główną przekątną,


  • elementy leżące pod drugą przekątną,
  • elementy leżące nad drugą przekątną,


  • elementy leżące nad obiema przekątnymi,
  • elementy leżące pod obiema przekątnymi,
  • elementy leżące na prawo od obu przekątnych,
  • elementy leżące na lewo od obu przekątnych,


  • elementy leżące na obwodzie tablicy oraz poza obwodem.

To te najbardziej charakterystyczne. Zapewne jest dużo więcej możliwości. W kolejnym przykładzie zademonstrujemy w jaki sposób "przechodzić" po tych charakterystycznych elementach. Przykład demonstruje w jaki sposób wydrukować elementy znajdujące się nad główną przekątną.

 

 Analogicznie jak w przedstawionym przykładzie można "przechodzić" po innych charakterystycznych elementach tablicy kwadratowej. Należy przeprowadzić w każdym przypadku analizę w jaki sposób zmieniają się indeksy kolumn oraz wierszy.