Tablica (informatyka)
Tablica – kontener 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
- ↑ a b c Markowski, Rydzewski i Kruszyński 1989 ↓, s. 74.
- ↑ a b c d Grębosz 2000 ↓, s. 127.
- ↑ a b c Marciniak 1991 ↓, s. 111.
- ↑ Grębosz 2000 ↓, s. 143.
- ↑ Tablice jako obiekty (Przewodnik programowania w języku C#) [online], msdn.microsoft.com [dostęp 2016-07-12] .
- ↑ a b Tablice (Przewodnik programowania w języku C#) [online] [dostęp 2016-07-12] .
- ↑ Array.Empty<T> Method () [online], msdn.microsoft.com [dostęp 2016-07-12] (ang.).
- ↑ NSArray and NSMutableArray in Objective-C [online], GeeksforGeeks, 10 listopada 2022 [dostęp 2024-12-23] (ang.).
- ↑ Arrays in Objective-C [online], GeeksforGeeks, 13 marca 2023 [dostęp 2024-12-23] (ang.).
- ↑ a b c d Arrays (The Java™ Tutorials > Learning the Java Language > Language Basics) [online], docs.oracle.com [dostęp 2016-07-13] (ang.).
- ↑ a b Python Arrays [online], GeeksforGeeks, 26 grudnia 2018 [dostęp 2024-12-23] (ang.).
- ↑ array — Efficient arrays of numeric values [online], Python documentation [dostęp 2024-12-23] (ang.).
- ↑ Lists, [w:] Built-in Types, Python documentation [dostęp 2024-12-23] (ang.).
- ↑ a b PHP Array Functions [online], GeeksforGeeks, 18 czerwca 2019 [dostęp 2024-12-23] (ang.).
- ↑ What is the difference between lists and arrays? [online], GeeksforGeeks, 28 grudnia 2023 [dostęp 2024-12-23] (ang.).
- ↑ R - Matrices [online], GeeksforGeeks, 29 kwietnia 2020 [dostęp 2024-12-23] (ang.).
- ↑ R - Array [online], GeeksforGeeks, 28 kwietnia 2020 [dostęp 2024-12-23] (ang.).
- ↑ Rust - Array [online], GeeksforGeeks, 27 marca 2021 [dostęp 2024-12-23] (ang.).
Bibliografia
- Jerzy Grębosz , Symfonia C++. Programowanie w języku C++ orientowane obiektowo, t. I,II,III, Oficyna Kallimach, 2000 .
- Andrzej Marciniak , Tutbo Pascal 5.5, wyd. drugie, Poznań: Wydawnictwo NAKOM, 1991, ISBN 83-85060-20-0, ISSN 0867-6011 .
- Andrzej Markowski , Andrzej Rydzewski , Henryk Kruszyński , Leksykon techniki mikrokomputerowej, seria: Mikrokomputery, Warszawa: Wydawnictwo Czasopism i Książek Technicznych NOT-SIGMA, 1989, ISBN 83-85001-28-X .