Tablice - podstawowe operacje

Tablica (ang. array) jest zmienną złożoną, która składa się z ciągu elementów tego samego typu. W pamięci komputera tablica zajmuje jeden, spójny obszar a jej elementy są ułożone kolejno obok siebie. Element tablicy nazywamy komórką (ang. cell). Komórki w tablicy są ponumerowane. Numer komórki nazywamy indeksem (ang. index). W języku C++ wszystkie indeksy komórek tablic rozpoczynają się zawsze od zera.

Tablicę tworzymy następująco:

typ_elementów nazwa_tablicy[liczba_komórek];

Przykłady:

int a[10];

Utworzyliśmy tablicę przechowującą 10 liczb całkowitych typu int. Tablica nazywa się a. W tablicy a mamy następujące komórki:

a[0]  - pierwsza komórka ma indeks równy 0
a[1] - druga komórka
a[2]
a[3]
...
a[8] - przedostatnia komórka
a[9] - ostatnia komórka

 

double x[1000];

Utworzyliśmy tablicę przechowującą 1000 liczb zmiennoprzecinkowych. Tablica nosi nazwę x. Mamy w niej następujące komórki:

x[0] - pierwsza komórka
x[1] - druga komórka
...
x[998] - przedostatnia komórka
x[999] - ostatnia komórka

 

Zauważ, iż tworząc tablicę n elementową, indeks ostatniej komórki wynosi n-1, a nie n. Należy na ten fakt zwrócić szczególną uwagę, ponieważ początkujący programiści w C++ często popełniają ten błąd i odwołują się w swoich programach do nieistniejącej komórki. W jej miejscu komputer mógł umieścić inną zmienną, co w efekcie prowadzi do trudnych do wykrycia błędów.

 

Po utworzeniu tablicy do jej komórek odwołujemy się jak do zwykłych zmiennych:

a[5] = 137;  // w komórce o indeksie 5 umieszczamy liczbę 137
a[8] = a[0] + a[2] * 3;
cout << x[12] << endl;

W porównaniu do zwykłych zmiennych tablice posiadają większą pojemność informacyjną. Mogą jednocześnie przechowywać wiele liczb (lub innych danych). Drugą zaletą jest to, iż indeksy komórek mogą być dowolnym wyrażeniem całkowitym, co pozwala automatyzować przetwarzanie danych w tablicy. Poniżej przedstawiamy przykładowe algorytmy tablicowe.

 

Wypełnianie tablicy stałą wartością

Zadanie polega na wpisaniu do wszystkich komórek tablicy tej samej wartości. Realizujemy je w pętli, która przebiega przez indeksy kolejnych komórek:

#include <iostream>
using namespace std;
main()
{
  int a[10];                  // tworzymy tablicę
  for(int i = 0; i < 10; i++) // przebiegamy przez kolejne indeksy od 0 do 9
    a[i] = 127;               // wypełniamy kolejne komórki stałą wartością

                              // sprawdzamy zawartość tablicy


  for(int i = 0; i < 10; i++)  cout << "a[" << i << "] = " << a[i] << endl;
  cout << endl;
  system("pause");
}

a[0] = 127
a[1] = 127
a[2] = 127
a[3] = 127
a[4] = 127
a[5] = 127
a[6] = 127
a[7] = 127
a[8] = 127
a[9] = 127

 

Algorytmiczne wypełnianie komórek tablicy

W tym przypadku do komórek tablicy zapisujemy wartość uzależnioną od wartości indeksu komórki. Poniższy przykład umieszcza w komórkach tablicy kolejne wielokrotności liczby 5.

#include <iostream>
using namespace std;
main()
{
  int a[10];                  // tworzymy tablicę
  for(int i = 0; i < 10; i++) // przebiegamy przez kolejne indeksy od 0 do 9
    a[i] = 5 * (i + 1);       // wypełniamy kolejne komórki wielokrotnościami 5

                              // sprawdzamy zawartość tablicy

  for(int i = 0; i < 10; i++)  cout << "a[" << i << "] = " << a[i] << endl;
  cout << endl;
  system("pause");
}
a[0] = 5
a[1] = 10
a[2] = 15
a[3] = 20
a[4] = 25
a[5] = 30
a[6] = 35
a[7] = 40
a[8] = 45
a[9] = 50

 

Wstawianie elementu do tablicy - operacja insert

Element e  chcemy wstawić do tablicy a[] na pozycję p. Jednocześnie nie chcemy tracić elementu, który już jest na tej pozycji. Jeśli to możliwe, elementy tablicy poczynając od pozycji p  w górę powinny być rozsunięte, a nowy element wstawiony na zwolnioną w ten sposób pozycję. Ostatni element tablicy jest zawsze tracony - nie ma go gdzie przesunąć.

Dane wejściowe:

n  - liczba elementów tablicy
a[] - tablica
e  - wstawiany element
p  - pozycja wstawiania

Dane wyjściowe:

a[] - tablica z elementem e wstawionym na pozycji p

Lista kroków:

K01: Dla i  = n-2, n-3,...,p: wykonuj a[i  + 1] ← a[i]
K02: a[p] ← e
K04: Zakończ

Program:

#include <iostream>
using namespace std;
main()
{
  int a[10];                  // tworzymy tablicę
  for(int i = 0; i < 10; i++) // przebiegamy przez kolejne indeksy od 0 do 9
    a[i] = 3 * (i + 1);       // wypełniamy kolejne komórki wielokrotnościami 3

// do a[] wstawiamy 127 na pozycję 5

  for(int i = 8; i >= 5; i--) // rozsuwamy elementy na pozycjach od 5 w górę
    a[i + 1] = a[i];
  a[5] = 127;                 // wstawiamy 127 na zwolnioną pozycję
                              // sprawdzamy zawartość tablicy

  for(int i = 0; i < 10; i++)  cout << "a[" << i << "] = " << a[i] << endl;
  cout << endl;
  system("pause");
}
a[0] = 3
a[1] = 6
a[2] = 9
a[3] = 12
a[4] = 15
a[5] = 127
a[6] = 18
a[7] = 21
a[8] = 24
a[9] = 27

Zwróć uwagę, iż 18 oraz następne wielokrotności 3 wciąż pozostały w tablicy po wstawieniu 127 na pozycji 5. Zniknął natomiast element 30.

 

Usuwanie elementu z tablicy - operacja remove

Z pozycji p w tablicy a[] chcemy usunąć element. Elementy o indeksach większych od p przesuwamy o jedną pozycję w dół. W ostatniej komórce tablicy umieszczamy 0.

Dane wejściowe:

n  - liczba elementów tablicy
a[] - tablica
p  - pozycja usuwania

Dane wyjściowe:

a[] - tablica z usuniętym elementem na pozycji p

Lista kroków:

K01: Dla i  = p, p+1,...,n-2: wykonuj a[i] ← a[i  + 1]
K02: a[n - 1] ← 0
K04: Zakończ

Program:

#include <iostream>
using namespace std;
main()
{
  int a[10];                  // tworzymy tablicę
  for(int i = 0; i < 10; i++) // przebiegamy przez kolejne indeksy od 0 do 9
    a[i] = 3 * (i + 1);       // wypełniamy kolejne komórki wielokrotnościami 3

// w a[] usuwamy element na pozycji 5

  for(int i = 5; i < 9; i++)  // przesuwamy w dół elementy na pozycjach od 6 w górę
    a[i] = a[i + 1];
  a[9] = 0;                    // zerujemy ostatni element
                               // sprawdzamy zawartość tablicy

  for(int i = 0; i < 10; i++)  cout << "a[" << i << "] = " << a[i] << endl;
  cout << endl;
  system("pause");
}
a[0] = 3
a[1] = 6
a[2] = 9
a[3] = 12
a[4] = 15
a[5] = 21
a[6] = 24
a[7] = 27
a[8] = 30
a[9] = 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