Tablice

Tablice w programowaniu to struktury danych umożliwiające przechowywanie wielu wartości tego samego typu w sposób ciągły w pamięci. W języku C++ tablice są jednym z najprostszych i najczęściej używanych sposobów organizacji danych, szczególnie gdy liczba elementów jest znana w momencie kompilacji. Tablica pozwala na szybki dostęp do elementów poprzez indeksowanie, co jest wydajne zarówno czasowo, jak i pamięciowo. Tablica C++ to narzędzie zarówno do podstawowych operacji na danych, jak i do bardziej złożonych algorytmów, a zrozumienie jej działania jest niezbędne przy pracy z językiem. W niniejszych notatkach zostanie szczegółowo omówione tworzenie tablic, ich inicjalizacja, operacje na elementach oraz uzupełnienie tablic.

Podstawowe informacje o tworzeniu tablic C++ i sposobach deklaracji tablic jednowymiarowych

Tworzenie tablic w C++ zaczyna się od określenia typu elementów, z których tablica będzie się składać, oraz liczby elementów. Składnia deklaracji tablicy jednowymiarowej wygląda następująco:

typ_nazwy tablica[n];

gdzie typ_nazwy to typ przechowywanych danych (np. int, double, char), tablica jest nazwą zmiennej, a n jest liczbą elementów.

Przykład deklaracji tablicy liczb całkowitych o pięciu elementach:

int liczby[5];

Elementy tablicy są indeksowane od zera, co oznacza, że pierwszy element ma indeks 0, a ostatni indeks n-1. Wartości w tablicy mogą być zainicjalizowane w momencie deklaracji:

int liczby[5] = {1, 2, 3, 4, 5};

Jeżeli podamy mniej elementów niż rozmiar tablicy, pozostałe elementy zostaną automatycznie ustawione na wartość zerową (dla typów podstawowych). Warto pamiętać, że w C++ deklaracja tablicy o zmiennym rozmiarze nie jest standardowa (chyba że używa się tablic dynamicznych lub std::vector).

Przykład inicjalizacji częściowej:

int liczby[5] = {1, 2}; // elementy 2,3,4 będą 0

Operacje na tablicach C++ obejmujące odczyt, zapis i iterowanie po elementach

Dostęp do elementów tablicy odbywa się poprzez operator indeksowania []. Wartość elementu można odczytać lub przypisać nową wartość:

int x = liczby[2]; // pobranie trzeciego elementu
liczby[0] = 10; // zmiana wartości pierwszego elementu

Typową operacją jest iteracja po wszystkich elementach tablicy przy użyciu pętli for:

for(int i = 0; i < 5; i++) {
liczby[i] = i * 2; // wypełnienie tablicy wartościami
}

Ważne jest, aby nie przekraczać indeksów tablicy, ponieważ w C++ nie ma kontroli zakresu indeksów przy użyciu zwykłych tablic statycznych. Próba dostępu do elementu spoza zakresu może prowadzić do niezdefiniowanego zachowania i nadpisania pamięci.

Tworzenie tablic wielowymiarowych w C++ i zasady uzupełniania tablic dwuwymiarowych

Tablice wielowymiarowe w C++ są rozszerzeniem idei tablic jednowymiarowych. Najczęściej spotykane są tablice dwuwymiarowe, które można traktować jak macierz:

typ_nazwy tablica[wymiar1][wymiar2];

Przykład deklaracji tablicy 3×4 przechowującej liczby całkowite:

int macierz[3][4];

Uzupełnienie tablic dwuwymiarowych można wykonać zarówno element po elemencie, jak i w pełnej inicjalizacji:

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

Dostęp do elementów tablicy dwuwymiarowej odbywa się poprzez dwa indeksy:

int y = macierz[1][2]; // pobranie elementu z drugiego wiersza, trzeciej kolumny
macierz[0][0] = 42; // zmiana wartości pierwszego elementu

Iterowanie po tablicy dwuwymiarowej wymaga zazwyczaj dwóch pętli zagnieżdżonych:

for(int i = 0; i < 3; i++) {
for(int j = 0; j < 4; j++) {
macierz[i][j] = i + j; // proste wypełnienie
}
}

Dla większych wymiarów należy pamiętać, że liczba elementów rośnie wykładniczo, co może prowadzić do szybkiego zużycia pamięci, szczególnie przy tablicach statycznych.

Tablica C++ dynamiczna i zasady przydzielania pamięci oraz uzupełnienie tablic w czasie działania programu

Statyczne tablice w C++ mają stały rozmiar ustalany w czasie kompilacji. W przypadku gdy liczba elementów jest znana dopiero w czasie działania programu, konieczne jest użycie tablic dynamicznych. Przydzielenie pamięci wykonuje się za pomocą operatora new:

int* dynamiczna = new int[n];

Elementy tablicy dynamicznej można inicjalizować tak samo jak zwykłe tablice:

for(int i = 0; i < n; i++) {
dynamiczna[i] = i * 3;
}

Po zakończeniu korzystania z tablicy dynamicznej należy pamiętać o zwolnieniu pamięci:

delete[] dynamiczna;

Brak tej operacji prowadzi do wycieków pamięci. Tablice dynamiczne pozwalają także na tworzenie tablic wielowymiarowych poprzez dynamiczną alokację tablic wskaźników, ale wtedy konieczna jest ręczna alokacja i zwolnienie każdego wymiaru.

Przykłady zastosowania tablic C++ w różnych językach programowania dla utrwalenia koncepcji

  1. C++ – jednowymiarowa tablica liczb całkowitych:
#include <iostream>
using namespace std;int main() {
int tab[5] = {1, 2, 3, 4, 5};
for(int i = 0; i < 5; i++) {
cout << tab[i] << " ";
}
return 0;
}
  1. C – podobnie jak w C++:
#include <stdio.h>int main() {
int tab[5] = {1, 2, 3, 4, 5};
for(int i = 0; i < 5; i++) {
printf("%d ", tab[i]);
}
return 0;
}
  1. Python – lista jako odpowiednik tablicy:
tab = [1, 2, 3, 4, 5]
for i in range(len(tab)):
print(tab[i], end=" ")
  1. PHP – tablica indeksowana numerycznie:
<?php
$tab = array(1, 2, 3, 4, 5);
for ($i = 0; $i < count($tab); $i++) {
echo $tab[$i] . " ";
}
?>

Uwagi praktyczne dotyczące stosowania tablic C++ i typowe pułapki przy uzupełnianiu tablic

  • Przekroczenie zakresu indeksu prowadzi do niezdefiniowanego zachowania i może nadpisać pamięć.
  • Tablice statyczne muszą mieć rozmiar znany w czasie kompilacji; w przeciwnym razie należy użyć tablic dynamicznych lub std::vector.
  • Przy tablicach dynamicznych konieczne jest zwolnienie pamięci, inaczej wystąpią wycieki.
  • W przypadku tablic wielowymiarowych pamiętać, że pamięć jest ciągła dla pierwszego wymiaru, ale przy dynamicznych tablicach wskaźników – niekoniecznie.
  • W C++11 i nowszych możliwe jest użycie list inicjalizacyjnych {} do wygodnego uzupełniania tablic.

Tablice C++ stanowią fundament zarówno dla prostych programów, jak i bardziej złożonych struktur danych, takich jak stosy, kolejki czy macierze w algorytmach numerycznych. Opanowanie tworzenia tablic, iteracji po elementach i prawidłowego uzupełnienia tablic jest kluczowe dla efektywnego programowania w C++.