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++

 

Tablice

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.:


double x[15];
...
x[15] = 126.87// BŁĄD!!! - komórki x[15] nie ma w tablicy!!!
...

 

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.

 

Wypełnianie 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;
}

 

Wstawianie elementu do tablicy

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ść:

 

obrazek

 

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.

 

Algorytm wstawiania do tablicy

Dane wejściowe:

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ść

Dane wyjściowe:

A[]  - tablica, z elementem v wstawionym na pozycji p.

Dane pomocnicze:

i  - indeksy elementów tablicy A[]. i є N.

Lista kroków:

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;
}

 

Usuwanie elementu z tablicy

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.

 

obrazek
 

Algorytm usuwania z tablicy

Dane wejściowe:

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

Dane wyjściowe:

A[]  - tablica, z usuniętym elementem na pozycji p.

Dane pomocnicze:

i  - indeksy elementów tablicy A[]. i є N.

Lista kroków:

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 elementów

Wymiana zawartości dwóch zmiennych wymaga trzech operacji i zmiennej pomocniczej, w której przechowujemy jedną z wymienianych zawartości.

 

obrazek

 

// 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   
im. Kazimierza Brodzińskiego
w Tarnowie

©2023 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

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