![]() |
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