Tablica (informatyka)

Tablicakontener uporządkowanych danych[1] zazwyczaj takiego samego typu[2][3], w którym poszczególne elementy dostępne są za pomocą indeksów[1][3]. Tablice jednowymiarowe mogą przechowywać inne tablice, dzięki czemu uzyskuje się tablice wielowymiarowe[1][4]. W tablicach wielowymiarowych poszczególne elementy są adresowane przez ciąg indeksów[3].

W matematyce odpowiednikiem tablicy jednowymiarowej jest ciąg, a tablicy dwuwymiarowej – macierz.

Indeks może być numeryczny i w różnych językach może mieć numerację od 0 (np. w C), albo od 1 (np. w R). Indeksy mogą być również nazwane i wówczas mówimy o tablicy asocjacyjnej. Rozmiar tablicy jest albo ustalony z góry (tablice statyczne), albo może się zmieniać w trakcie wykonywania programu (tablice dynamiczne). Wiele języków programowania obsługuje tablice, choć w wypadku część z nich granica między statyczną tablicą a dynamiczną listą jest rozmyta.

Tablice w popularnych językach programowania

C/C++

Tablice w C/C++ są typem pochodnym[2] obiektów, które zajmują ciągły obszar pamięci[2]. Indeksowanie elementów zawsze zaczyna się od zera[2].

/* jednowymiarowa tablica 6 liczb całkowitych */
int tablica[6];

int tablica2[6][6]; //tablica dwuwymiarowa
int tablica3[7][7][7]; //tablica trójwymiarowa

Przy deklaracji wielkości tablicy użyte mogą zostać tylko liczby naturalne (bez zera).

C#

Tablice w C# są obiektami[5]. Wyróżnia się tablice jednowymiarowe, wielowymiarowe i nieregularne (poszarpane) czyli tablice tablic[6]. Indeksowanie tablic zawsze zaczyna się od zera[6]. Dopuszczalne są tablice bezelementowe[7].

int[] tablica = new int[6]; // jednowymiarowa tablica 6 liczb całkowitych

int[,] tablica2 = new int[6,6]; //tablica dwuwymiarowa
int[,,] tablica3 = new int[7,7,7]; //tablica trójwymiarowa

// tablica nieregularna
int[][] tablicaX = new int[3][]; // jednowymiarowa tablica na trzy różne jednowymiarowe tablice

Objective-C

Tablice w Objective-C są reprezentowane przez klasy NSArray i NSMutableArray, obsługujące dynamiczne rozmiary, ale można również użyć prostszych tablic znanych z języka C. Indeksowanie rozpoczyna się od zera[8].

// Tablica niezmienna
NSArray *tablica = @[@1, @2, @3, @4, @5, @6];

// Tablica zmienna
NSMutableArray *tablicaZmienna = [NSMutableArray arrayWithObjects:@1, @2, nil];
[tablicaZmienna addObject:@3];

// Tablica obiektów
NSArray *array = [[NSArray alloc] initWithObjects:@"wikipedia", @"wikicytaty", @"commons", nil];
// Dostęp do elementów i liczba elementów
NSLog(@"Pod 1: %@ \n", [array objectAtIndex:1]); # "Pod 1: wikicytaty"
NSLog(@"Licznik: %d \n", [array count]); # "Licznik: 3"

Tablice znane z języka C[9]:

int arr[5] = {10, 20, 30, 40, 50};
NSLog(@"Pod 0: %d \n", arr[i]); # "Pod 0: 10"

Java

Tablice w Javie są obiektami[10]. Można zdefiniować tylko tablice jednowymiarowe[10]. Tablice wielowymiarowe można symulować przez definiowanie tablicy tablic[10]. Indeksowanie tablic zawsze zaczyna się od zera[10].

int[] tablica = new int[6]; // deklaracja tablicy liczb całkowitych z jednoczesną alokacją na 6 elementów

JavaScript

Zarówno w standardzie JS jak i w TypeScript tablice tworzy się następująco:

var tablica = [1, 2, 3];
var tablicaPusta = [];

lub

var tablica = new Array(1,2,3);
var tablicaPusta = new Array();

Tablice w JavaScripcie są dynamiczne, co oznacza, że nie trzeba deklarować ich wielkości. Tablica powiększa się automatycznie.

var tablica = [1,2,3];
tablica[4] = 5;

jest równoważne

var tablica = [1,2,3,undefined,5];

Tablice nie są osobnym typem danych w języku JavaScript. Mają osobną składnie deklaracji, ale są to obiekty, których kluczami są indeksy (zamieniane na ciągi znaków). Obiekty te posiadają specjalną właściwość length. W nowej odsłonie języka (ES6/ES2015) tablice są także iteratorami.

Python

Wbudowane tablice w Pythonie mogą być tworzone za pomocą moduły array i mogą przechować elementy jednego rodzaju na raz. Indeksowanie rozpoczyna się od zera[11][12].

# Dołączenie wbudowanego modułu do obsługi tablic
import array as array

# Lista jednowymiarowa jako źródło danych tablicy
lista = [1, 2, 3, 4, 5, 6]
# Tablica
# ("l" jak long, możliwe także "L" unsigned long; przynajmniej 4 bajty)
# (również oraz "i"/"I" dla intiger; przynajmniej 2 bajty)
tablica_long = array.array('l', lista)
# Indeksowanie
print(tablica_long[0]) # -> 1

# Tablica znaków unicode
# ("f" jak float, albo "d" jak double)
tablica_double = array.array('d', [1.0, 2.1, 3.2, 4.3])
print(tablica_double[0]) # -> 1.0

# Wielkość elementów tablicy
print(tablica_txt.itemsize) # -> 2
print(tablica_double.itemsize) # -> 8

Same listy w Pythonie są bardziej elastyczne jako że mogą przechowywać mieszane typy danych, wspierają więcej typów danych i mogą być wielowymiarowe[11][13]. Choć listy nie są sensu stricte tablicami, to mają cechy tablic i są podobne do tablic z innych języków (np. PHP czy JavaScript)[14].

PHP

Tablice w PHP są elastycznymi strukturami danych mogącymi przechowywać wartości różnych typów, czyli bardziej przypominają listy z Pythona niż tablice z C. Indeksowanie domyślnie rozpoczyna się od zera[14][15].

// Tablica jednowymiarowa
$tablica = array(1, 2, 3, 4, 5, 6);
// ...albo
$tablica = [1, 2, 3, 4, 5, 6];

// Tablica asocjacyjna
$tablica_asocjacyjna = array("klucz1" => "wartość1", "klucz2" => "wartość2");
// ...albo
$tablica_asocjacyjna = ["klucz1" => "wartość1", "klucz2" => "wartość2"];

// Tablica wielowymiarowa
$tablica2d = [
    [1, 2],
    [3, 4],
];
$tablica3d = [
    [[1, 2],[3, 4],],
    [[5, 6],[7, 8],],
];
var_export($tablica3d[0][0]);
/*
wynik: array (
  0 => 1,
  1 => 2,
)
*/

Tablice w PHP mogą działać zarówno jako listy, jak i słowniki.

R

Tablice w R są tworzone jako macierze lub struktury tablicowe o dowolnej liczbie wymiarów. Indeksowanie rozpoczyna się od jednego[16][17].

# Tablica jednowymiarowa (wektor)
tablica <- c(1, 2, 3, 4, 5, 6)

# Tablica dwuwymiarowa (macierz)
macierz_kolumny <- matrix(tablica, nrow = 2, ncol = 3)
print(macierz_kolumny[1,1]) # 1
print(macierz_kolumny[2,1]) # 2
print(macierz_kolumny[1,2]) # 3

# Ułożenie danych w wierszach (zamiast domyślnego ułożenia w kolumnach)
macierz_wiersze <- matrix(tablica, nrow = 2, ncol = 3, byrow = TRUE)
print(macierz_wiersze[1,1]) # 1
print(macierz_wiersze[1,2]) # 2
print(macierz_wiersze[1,3]) # 3
print(macierz_wiersze[2,1]) # 4

# Tablica trójwymiarowa
dane1d <- c(1, 2, 3, 4, 5, 6, 7, 8)
rows = 2
cols = 3
matrix_count = 2
row_names <- c("w1", "w2") 
col_names <- c("k1", "k2", "k3") 
mat_names <- c("Macierz1", "Macierz2") 

# the naming of the various elements 
# is specified in a list and 
# fed to the function 
tablica3d = array(dane1d, dim = c(rows, cols, matrix_count), 
            dimnames = list(row_names, col_names, mat_names)
) 
print (tablica3d)

Efektem tego ostatniego będzie coś w rodzaju:

,,Macierz1
   k1 k2 k3
w1  1  3  5
w2  2  4  6

,,Macierz2
   k1 k2 k3
w1  7  1  3
w2  8  2  4

Rust

Tablice w Rust mają statyczny rozmiar określony w czasie kompilacji. Indeksowanie zaczyna się od zera[18].

// Tablica jednowymiarowa
let tablica: [i32; 6] = [1, 2, 3, 4, 5, 6];

// Tablica dwuwymiarowa
let tablica2d: [[i32; 2]; 3] = [[1, 2], [3, 4], [5, 6]];

Zobacz też

Przypisy

  1. a b c Markowski, Rydzewski i Kruszyński 1989 ↓, s. 74.
  2. a b c d Grębosz 2000 ↓, s. 127.
  3. a b c Marciniak 1991 ↓, s. 111.
  4. Grębosz 2000 ↓, s. 143.
  5. Tablice jako obiekty (Przewodnik programowania w języku C#) [online], msdn.microsoft.com [dostęp 2016-07-12].
  6. a b Tablice (Przewodnik programowania w języku C#) [online] [dostęp 2016-07-12].
  7. Array.Empty<T> Method () [online], msdn.microsoft.com [dostęp 2016-07-12] (ang.).
  8. NSArray and NSMutableArray in Objective-C [online], GeeksforGeeks, 10 listopada 2022 [dostęp 2024-12-23] (ang.).
  9. Arrays in Objective-C [online], GeeksforGeeks, 13 marca 2023 [dostęp 2024-12-23] (ang.).
  10. a b c d Arrays (The Java™ Tutorials > Learning the Java Language > Language Basics) [online], docs.oracle.com [dostęp 2016-07-13] (ang.).
  11. a b Python Arrays [online], GeeksforGeeks, 26 grudnia 2018 [dostęp 2024-12-23] (ang.).
  12. array — Efficient arrays of numeric values [online], Python documentation [dostęp 2024-12-23] (ang.).
  13. Lists, [w:] Built-in Types, Python documentation [dostęp 2024-12-23] (ang.).
  14. a b PHP Array Functions [online], GeeksforGeeks, 18 czerwca 2019 [dostęp 2024-12-23] (ang.).
  15. What is the difference between lists and arrays? [online], GeeksforGeeks, 28 grudnia 2023 [dostęp 2024-12-23] (ang.).
  16. R - Matrices [online], GeeksforGeeks, 29 kwietnia 2020 [dostęp 2024-12-23] (ang.).
  17. R - Array [online], GeeksforGeeks, 28 kwietnia 2020 [dostęp 2024-12-23] (ang.).
  18. Rust - Array [online], GeeksforGeeks, 27 marca 2021 [dostęp 2024-12-23] (ang.).

Bibliografia