W przypadku języka C++, podobnie jak w wielu innych językach programowania pojedyncze zmienne mogą być łączone w tzw. tablice (ang. Array). Tablica (zwana czasami zmienną tablicową) jest to struktura języka programowania, która zbudowana jest z elementów będących tego samego typu i zajmujących ciągły obszar pamięci. W C++ elementy tablicy mogą posiadać następujące typy: int, char, float, short, long, wskaźnikowy, mogą również być tablicami bądź klasami. Tablicę definiuje się za pomocą typu, identyfikatora oraz wymiaru. Ujęty w prostokątne nawiasy wymiar ([ ]) określa ilość elementów, z których składa się tablica i musi on mieć wartość minimum jeden. Wartość wymiaru musi stanowić wyrażenie stałe całkowitego typu, które jest możliwe do obliczenia podczas kompilacji (w praktyce znaczy to, że do określania wymiaru tablic nie wolno stosować zmiennych). Tablica jest uporządkowanym zbiorem wielu zmiennych tego samego typu. Typ zmiennych składających się na tablicę określa typ samej tablicy (przykładowo, gdy w tablicy będą przechowywane zmienne typu long, to typem tablicy również będzie long). Uporządkowanie zmiennych tablicowych oznacza, że ich elementy są przechowywane w określony sposób.
Tablice stanowią typ pochodny, co oznacza, że z istniejących zmiennych konkretnego typu (np. int) buduje się określoną tablicę, która również przybiera taki sam typ jak jej składniki (w tym przypadku int). W sytuacji, gdzie obecnych jest 15 zmiennych posiadających typ int, możliwym jest zbudowanie z nich tablicy, którą definiuje się następująco:
int a[15];
Taka definicja tablicy, rezerwuje w obszarze pamięci komputera przestrzeń dla 15 zmiennych typu int. Wielkość tak zdefiniowanej tablicy musi być liczbą stałą, która znana jest w momencie kompilacji. Kompilator musi posiadać informację, jak dużo miejsca powinien zarezerwować dla danej tablicy. Taki sposób dostępu zwany jest indeksowanie, więc zapis:
int liczby[5];
powoduje zadeklarowanie tablicy typu int, w której liczny [i] nazywane są zmiennymi indeksowanymi. Takie zmiennie numerowane są od zera, dlatego pierwszym elementem tablicy zawsze będzie tablica[0]. W tablicy zadeklarowanej w powyższym przykładzie, pierwszym jej elementem będzie liczba[0], drugim zaś liczba[1]. Ogólnie rzecz biorą, tablica [n] posiada n elementów, ponumerowanych od tablica[0] do tablica[n - 1]:
tablica[0] tablica[1] tablica[2] tablica[3] tablica[4] . . . tablica[n - 1]
Dowolny obiekt, bez względu na to, czy stanowi on standardowy typ języka C++, czy został utworzony przez użytkownika, może zostać umieszczony w zmiennej tablicowej. Deklarując tablicę, podaje się jej rozmiar oraz typ elementów. Kompilator, opierając się na deklaracjach klas, oblicza, jak dużo miejsca musi zarezerwować w pamięci dla danej tablicy. Klasa musi posiadać domyślny konstruktor, który nie posiada parametrów, ponieważ jest on potrzebny w chwili definicji klasy.
W przedstawionym przykładzie, tablica jest zmienną pięcioelementową, gdyż zawiera elementy ponumerowane kolejno: 0, 1, 2, 3, 4. Elementy te mogą być wczytane z klawiatury za pomocą funkcji scanf(), bądź też można przypisać im określone wartości w kodzie źródłowym programu. Wszystkie elementy prezentowanej tablicy posiadają typ int, więc również tablica będzie typu int. Niemożliwa jest sytuacja, aby jakikolwiek element tablicy posiadał inny typ.
Podczas deklaracji prostej tablicy wbudowanego typu jak: char czy int, można nadać wartości jej elementom, czyli zainicjalizować ją. Za nazwa tablicy umieszcza się wtedy znak równości, a następnie zamknięta w klamrowych nawiasach listę wartości kolejnych jej elementów rozdzielonych przecinkami. Przykładowo:
int Tablica[5] = { 100, 200, 300, 400, 500 };
deklaruje Tablica jako tablicę posiadającą pięć wartości całkowitego typu, elementowi Tablica[0] przypisuje wartość 100, elementowy Tablica[1] wartość 200 itd. W przypadku powinięcia rozmiaru podczas deklaracji tablicy, system stworzy tablicę o takim rozmiarze, aby mogły zostać pomieszczone elementy, które ją inicjalizują. Tak więc komenda:
int Tablica[] = { 100, 200, 300, 400, 500 };
stworzy dokładnie identyczną tablicę, jak w przykładzie powyżej.
Jeżeli zechcemy poznać rozmiar tablicy to kompilator może do obliczyć. Przykładowo:
const USHORT TablicaLength = sizeof(Tablica) / sizeof(Tablica[0])
przypisze stałej TablicaLenght typu USHORT wartość, będąca wynikiem dzielenia wielkości tablicy przez wielkość jej pojedynczego elementu. Wynik ten będzie przedstawiał liczbę elementów w zmiennej Tablica. Nie jest możliwe zadeklarowanie większej ilości elementów, niż określa to rozmiar tablicy, tak więc działanie:
int Tablica[5] = { 100, 200, 300, 400, 500, 600 };
zgłosi błąd kompilacji, ponieważ zadeklarowano pięcioelementową tablicę i podjęto próbę zainicjowania ją sześcioma elementami. Można natomiast zastosować zapis:
int Tablica = {100, 200, 300, 400, 500, 600 };
Do danych umieszczonych w tablicy stosuje się dostęp dwustopniowy. Na początku należy podać numer elementu przy pomocy operatora indeksowego, a następnie użyć operatora kropki w celu odwołania się do właściwej zmiennej bądź funkcji umieszczonej wewnątrz obiektu. Tablica może zostać zainicjowana już w chwili deklaracji. Aby to zrobić, po nazwie zmiennej tablicowej należy umieścić znak przypisania, a później podać w nawiasach klamrowych wartości poszczególnych elementów tablicy, na przykład:
int liczby[4]={50, 100, 150, 200};
Taką postać ma przykładowe zadeklarowanie oraz inicjalizacja czteroelementowej tablicy zawierającej liczby typu int. Element liczby[0] posiada wartość 50, element liczby[1] wartość 100, itd. Nazwa tablicy może być dowolna, nie łamiąca zasad nazywania zmiennych, lecz musi być różna od nazwy zmiennej bądź innej tablicy wewnątrz określonego zakresu. Tak więc nie mogą jednocześnie istnieć: tablica nazwana liczby[4] i zmienna nosząca nazwę "liczby".
Przestawione powyżej tablice, nazywane są tablicami jednowymiarowymi. W C++ można się również spotkać z pojęciem tablic wielowymiarowych. Przy deklaracji tablicy wielowymiarowej dopisujemy następną parę kwadratowych nawiasów przy definicji tablicy wpisując w nie następny rozmiar, który musi być stały. Możliwe jest tworzenie tablic dwu- lub więcej wymiarowych. Elementami takich tablic są inne tablice. Przykładowa deklaracja tablicy dwuwymiarowej przedstawia się następująco:
int tablica[10][10];
Taki zapis należy czytać następująco: jest to dziesięcioelementowa tablica, w której każdy element jest dziesięcioelementową tablicą typu int. Oznacza to, że w sumie tablica ta posiada 100 elementów (10 kolumn i 10 wierszy). Odwołanie do elementów takiej tablicy wykonuje się następująco:
tablica[numer_kolumny][numer_wiersza];
Tablice, tak samo jak funkcje i inne zmienne, wymagają deklaracji przed ich użyciem. Upraszczając - komputer potrzebuje wiedzieć, jak dużo miejsca musi zarezerwować w swojej pamięci oraz w jaki sposób ma rozmieścić poszczególne obiekty, czyli elementy tablicy. Obiektem w tym znaczeniu jest liczba, znak czy ciąg znaków. Takimi obiektami, języki programowania operują już od bardzo dawna. Jednak prawdziwe obiektowe programowania ma miejsce tam, gdzie obiekt stanowić może cos "nietypowego" - przykładowo rysunek. Z punktu widzenia komputera, obiektem jest dowolna rzecz, która zajmuje określony obszar w pamięci oraz wiadomym jest jak z ta rzeczą należy postępować. Przykładowo deklaracja:
int tab[50];
Oznacza, że systemu musi zarezerwować 50 kolejnych komórek w pamięci dla 50 liczb typu int (liczby całkowite po dwa bajty każda). Tablica jednowymiarowa (wektor) przyjmie nazwę "tab", a jej poszczególne elementy, zostaną kolejno poindeksowane.
Specjalnym rodzajem tablicy jest tablica służąca do przechowywania zmiennych znakowych (np. liter). Taka tablica może być zadeklarowana w następujący sposób:
Char wyrazy[40];
Definicja ta mówi, że zmienna "wyrazy" stanowi tablicę posiadającą 40 elementów znakowych. W takiej tablicy może zostać umieszczony tekst, dlatego, że w każdym elemencie może zostać przechowana zmienna alfanumeryczna.
Tablice stworzone zostały, aby przechowywać większą ilość zmiennych jednego typu. Deklaracja tablicy przypomina deklarację zwykłej zmiennej, lecz za nią podawana jest w kwadratowych nawiasach liczba elementów, np. tablica zawierająca liczby całkowite i składająca się z dwudziestu elementów.
Przykłady deklaracji i definicji tablic:
- int Cyfry[20] - tablica jednowymiarowa (wektor)
- int InneCyfry[6][12][3] - tablica trójwymiarowa
- int KolejneCyfry[3] = {2, 1, 7} - tablica zainicjowana przez podanie wartości po przecinkach w nawiasach klamrowych
- char Zdanie[] = "Dowolne zdanie" - definicja tablicy znaków, nie jest podany jej rozmiar, lecz kompilator sam go ustali poprzez zliczenie elementów w podanym tekście
- char InneZdanie[11] = {'i','C','O','N','-','r','u','l','e','z',' '} - tablica zainicjowana kolejnymi znakami (należy pamiętać o tzw. terminatorze NULL, którym jest znak na końcu tekstu
W celu zdefiniowania wartości jakiegoś z elementów danej tablicy należy wpisać przykładowo:
Cyfry[10] = 8;
InneCyfry[2][4][1] = 7;
Korzystając z tablic upraszcza się często proces programowania, przykładowo zamiast używać 20 zmiennych, można użyć jednej zmiennej tablicowej, zawierającej te 20 elementów. Takie rozwiązanie jest bardzo praktyczne. Tablice są powszechnie i często używane przez programistów języka C++ ułatwiając im zadania programistyczne.
Poniżej przedstawiony został kod przykładowego programu, gdzie ustalany jest rozmiar zmiennej tablicowej, a później po wprowadzeniu wartości, ustalana jest liczba dodatnich elementów oraz ich pozycja w tablicy:
#include
#include
#include
main()
{
clrscr();
const MAX = 100;
int *w_tab;
int tab[MAX], n, i;
int liczba_el = 0;
cout << "Okresl rozmiary tablicy: ";
cin >> n;
w_tab = tab; //w_tab przechowuje adres elementu tablicy posiadający indeks 0
cout << "Wpisz elementy tablicy ";
for (i=0; i cin >> *(w_tab + i); cout << endl; cout << "Lista elementow tablicy "; for (i=0; i cout << setw(8) << *(w_tab + i); cout << endl; for (i=0; i if (*(w_tab + i) > 0) { cout << "Element dodatni: "<<*(w_tab + i)<< " na pozycji " << i + 1 << endl; liczba_el++; } cout << "Ilosc elementow dodatnich " << liczba_el; getch(); return 0; }