![]() |
![]() ![]()
Autor artykułu: mgr Jerzy Wałaszek, wersja1.0 |
©2010 mgr
Jerzy Wałaszek |
Pomoce:
Instalacja Code Blocks i
tworzenie projektu aplikacji konsoli.
Struktura programu w języku C++
Zmienne i strumienie w języku C++
Instrukcja warunkowa w języku C++
Tworzenie pętli w języku C++
Tablica (ang. array) jest złożoną strukturą danych, która zbudowana jest z ciągu elementów tego samego typu. W pamięci komputera tablica zajmuje ciągły obszar pamięci, a jej elementy, zwane komórkami, są umieszczone w tym obszarze jeden obok drugiego. Komórki tablicy posiadają numery, które nazywamy indeksami. W języku C++ pierwsza komórka tablicy ma numer 0.
Tablica, jak każda zmienna, przed pierwszym użyciem musi zostać zdefiniowana. Definicję tworzymy podobnie jak definicję zmiennej:
typ nazwa[rozmiar];
typ - określa rodzaj informacji przechowywanych
przez komórki tablicy.
nazwa - jest nazwą tablicy i umożliwia dostęp do przechowywanych w
niej informacji. Nazwę tablicy tworzymy wg tych samych reguł co nazwy zmiennych.
rozmiar - określa liczbę komórek, które zawiera tablica.
Przykład:
int a[5];
Powyższe polecenie tworzy tablicę a[] zawierającą 5 komórek typu int - tzn. każda komórka tej tablicy może przechowywać daną całkowitą ze znakiem, 32 - bitową. Tablica zawiera następujące komórki:
a[0] - pierwsza komórka tablicy
a[1] - druga komórka tablicy
a[2] - trzecia komórka
a[3]
a[4] - ostatnia komórka tablicy.
Dane zapisujemy w komórce tablicy przy pomocy instrukcji przypisania:
a[1] =
15;
Dla komórek tablicy dostępne są wszystkie instrukcje modyfikacji:
a[2]++; ++a[3];
// zwiększanie o 1
a[2]--; --a[3]; // zmniejszanie o 1
a[1] += 5;
a[2] -= 3;
a[3] *= a[1] + 12; //
zawartość komórki a[3] zostanie przemnożona przez sumę a[1] + 12
a[4] /= a[1]; //
zawartość komórki a[4] zostanie podzielona przez to, co zawiera komórka a[1]
a[1] %= 4;
UWAGA: Bardzo częstym błędem w języku C++, popełnianym przez początkujących programistów, jest odwoływanie się w programie do komórki n-tej, gdzie n jest liczbą komórek tablicy. Np.:
Komórka taka nie leży w obszarze zajętym w pamięci
komputera przez tablicę, lecz poza nim. Kompilator zwykle nie sprawdza,
czy program odwołuje się do właściwej komórki tablicy. Zatem dane trafią
do obszaru pamięci poza tablicą, a tam program może przechowywać inne
dane. Spowoduje to ich zniszczenie i w konsekwencji program może działać
nieprawidłowo - tego typu błędy mogą być trudne do wykrycia, gdyż należy
przeanalizować operacje wykonywane przez program. |
Zaletą tablic jest to, iż mogą przechowywać w wygodny dla programisty sposób wiele danych. Dostęp do danych może być algorytmiczny, tzn. indeks można wyliczać wg pewnych reguł, co pozwala zautomatyzować przetwarzanie informacji przechowywanej w tablicy.
Tablicę wypełniamy wykorzystując pętlę iteracyjną for. W pętli tworzymy indeksy kolejnych komórek i za pomocą instrukcji przypisania wprowadzamy do tych komórek pożądane wartości.
// Wypełnianie tablicy stałą zawartością // (C)2010 I LO w Tarnowie //------------------------ #include <iostream> using namespace std; const int N = 10; // liczba komórek tablicy int main() { int a[N],i; for(i = 0; i < N; i++) a[i] = 15; for(i = 0; i < N; i++) cout << "a[" << i << "] = " << a[i] << endl; return 0; } |
// Wypełnianie tablicy zmienną zawartością // (C)2010 I LO w Tarnowie //------------------------ #include <iostream> using namespace std; const int N = 10; // liczba komórek tablicy int main() { int a[N],i; for(i = 0; i < N; i++) a[i] = i; for(i = 0; i < N; i++) cout << "a[" << i << "] = " << a[i] << endl; return 0; } |
Wpisanie elementu do tablicy jest bardzo proste. Wystarczy zastosować instrukcję przypisania:
tablica[indeks] = wyrażenie;
Jednakże w operacji wstawiania chodzi o coś troszeczkę innego. Otóż nowy element ma znaleźć się pomiędzy elementami, które w tablicy już są. Na przykład chcemy wstawić do komórki nr 3 liczbę 155. W tym celu musimy najpierw zrobić w tablicy miejsce na nowy element. Zawartości komórek od 3 do przedostatniej należy przesunąć o jedną komórkę w górę (w kierunku rosnących indeksów) tablicy, a następnie na powstałe miejsce wstawić nową wartość:
Przesuwanie elementów musimy rozpocząć od przedostatniego i posuwać się systematycznie w dół aż do pozycji, na której chcemy umieścić nową wartość. Zauważ, iż ostatni element w tablicy jest tracony - na jego miejsce trafia element przedostatni.
n | - liczba elementów w tablicy n є N |
A[] | - tablica, do której wstawiamy element. Indeksy rozpoczynają się od 0. |
p | - pozycja wstawiania; p є N; 0 ≤ p < n |
v | - wstawiana wartość |
A[] | - tablica, z elementem v wstawionym na pozycji p. |
i | - indeksy elementów tablicy A[]. i є N. |
K01: | Dla i = n-2,n-3, ..., p: wykonuj A[i+1] ← A[i] | ; przesuwamy elementy o jedną pozycję w górę |
K02: | A[p] ← v | ; na zwolnionym miejscu umieszczamy v |
K03: | Zakończ. |
// Wstawianie elementu do tablicy // (C)2010 I LO w Tarnowie //------------------------ #include <iostream> using namespace std; const int N = 10; // liczba komórek tablicy const int P = 5; // pozycja wstawiania const int V = 25; // wstawiana wartość int main() { int a[N],i; // wypełniamy tablicę kolejnymi liczbami for(i = 0; i < N; i++) a[i] = i; // przesuwamy komórki od a[P] do a[N-2] o jedną w górę for(i = N - 2; i >= P; i--) a[i + 1] = a[i]; // wstawiamy element a[P] = V; // wyświetlamy zawartość tablicy for(i = 0; i < N; i++) cout << "a[" << i << "] = " << a[i] << endl; return 0; } |
Operację usuwania elementu znajdującego się na pozycji p przeprowadzamy przesuwając zawartości komórek od A[p+1] do A[n-1] o jedną pozycję w dół. Na ostatniej pozycji w tablicy umieszczamy wartość 0, aby pozbyć się zdublowania ostatniego elementu.
n | - liczba elementów w tablicy n є N |
A[] | - tablica, do której wstawiamy element. Indeksy rozpoczynają się od 0. |
p | - pozycja usuwania; p є N; 0 ≤ p < n |
A[] | - tablica, z usuniętym elementem na pozycji p. |
i | - indeksy elementów tablicy A[]. i є N. |
K01: | Dla i = p,p+1, ..., n-2: wykonuj A[i] ← A[i+1] | ; przesuwamy elementy o jedną pozycję w dół |
K02: | A[n-1] ← 0 | ; na ostatniej pozycji umieszczamy 0 |
K03: | Zakończ. |
// Usuwanie elementu z tablicy // (C)2010 I LO w Tarnowie //------------------------ #include <iostream> using namespace std; const int N = 10; // liczba komórek tablicy const int P = 5; // pozycja usuwania int main() { int a[N],i; // wypełniamy tablicę kolejnymi liczbami for(i = 0; i < N; i++) a[i] = i; // przesuwamy komórki od a[P+1] do a[N-1] o jedną w dół for(i = P; i <= N - 2; i++) a[i] = a[i + 1]; // na ostatniej pozycji umieszczamy 0 a[N - 1] = 0; // wyświetlamy zawartość tablicy for(i = 0; i < N; i++) cout << "a[" << i << "] = " << a[i] << endl; return 0; } |
Wymiana zawartości dwóch zmiennych wymaga trzech operacji i zmiennej pomocniczej, w której przechowujemy jedną z wymienianych zawartości.
// Zamiana dwóch komórek w tablicy // (C)2010 I LO w Tarnowie //------------------------ #include <iostream> using namespace std; const int N = 10; // liczba komórek tablicy const int P1 = 5; // indeksy komórek, których zawartości zostaną zamienione const int P2 = 8; int main() { int a[N],i,x; // wypełniamy tablicę kolejnymi liczbami for(i = 0; i < N; i++) a[i] = i; // zamieniamy a[P1] <-> a[P2] x = a[P2]; a[P2] = a[P1]; a[P1] = x; // wyświetlamy zawartość tablicy for(i = 0; i < N; i++) cout << "a[" << i << "] = " << a[i] << endl; return 0; } |
// Odwrócenie tablicy // (C)2010 I LO w Tarnowie //------------------------ #include <iostream> using namespace std; const int N = 10; // liczba komórek tablicy int main() { int a[N],i,x; // wypełniamy tablicę kolejnymi liczbami for(i = 0; i < N; i++) a[i] = i; // odwracamy tablicę for(i = 0; i < N / 2; i++) { x = a[i]; a[i] = a[N - i - 1]; a[N - i - 1] = x; } // wyświetlamy zawartość tablicy for(i = 0; i < N; i++) cout << "a[" << i << "] = " << a[i] << endl; return 0; } |
![]() | I Liceum Ogólnokształcące |
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe