Jason. Cała informatyka w jednym miejscu!

Nowy artykuł o programowaniu "tak ogólnie". Opiszę do czego służy i jak funkcjonuje tablica jako taka, z tym że położę grubszy nacisk na teorię, bo od części praktycznej macie kategorie wiedzy o językach programowania (np. Kotlin tu, a C# tu), także darujemy sobie stosy kodów źródłowych ;). Będzie ich tyle, ile potrzeba.

TABLICA NAJBARDZIEJ PODSTAWOWĄ STRUKTURĄ DANYCH W PROGRAMOWANIU

Statyczna struktura danych jest nazywana tablicą (ang. "array"). Jej zadaniem jest składowanie jednego lub wielu wartości TEGO SAMEGO TYPU. Ktoś może się wykłócać, że są takie języki jak JavaScript, które posiadają tablice do których można wrzucać wszystko jak leci. Istotnie, tylko to tak naprawdę nie jest tablica i już udowodniłem dlaczego w osobnym artykule. Najczęstszym znakiem rozpoznawczym w kodzie źródłowym jest para nawiasów kwadratowych ([]), wstawionych zaraz po typie danych zmiennej (tak jest w zdecydowanej większości) albo po nazwie zmiennej (C/C++). Można ją sobie wyobrazić jako poziomą półkę, na której umieszczamy różne przedmioty i oznaczamy je numerkami zaczynając od zera i idąc do N. Naukowo taki zapis określa się "notacją indeksową", a samą liczbą jest "indeks". "Przedmiot" z kolei to element bądź argument. Każdy element "leży" na własnym indeksie.

JAK TO DZIAŁA?

Rozpatrzmy następujący przypadek. Potrzebujecie przechować pięć liczb zmiennoprzecinkowych (a co tam, raz zróbmy na przekór i pójdźmy drogą nieco oryginalną ;)). Dajmy na to, że słuchacie radia i zależy Wam na zapisaniu pięciu różnych częstotliwości fal, które grają ulubione piosenki. Oczywiście, że można zapisać pięć osobnych zmiennych, jednak to powoduje dwa problemy. Pierwszy, brzydko to wygląda i po amatorsku, a drugi, nie ma żadnego strukturalnego powiązania między tymi wartościami. Co z tego, że opatrzymy je tymi samymi etykietami z cyferką na końcu, jak to są nadal osobne wartości? Na pomoc przychodzi tablica!

Zamiana pojedynczych zmiennych na tablicę rodzi wiele zalet. Po pierwsze, mniej kodu źródłowego. Po drugie, jest jedna etykietka dla wszystkich pięciu wartości. A po trzecie, jest możliwość operowania na tych liczbach w dowolnej pętli. Tablica jest wbrew pozorom bardzo użyteczna w wielu sytuacjach i występuje chyba w każdym większym programie obsługującym dowolne zbiory jakichkolwiek danych.

KOD ŹRÓDŁOWY

Zamiast pięciu osobnych liczb, wstawmy sobie jedną tablicę pięcioelementową (składnia języka C wg standardu C99):

float[] frequencies = new float[5];

i wtedy przypisujmy sobie po kolei częstotliwości fal, ale już jako elementy tablicy! Robi różnicę? A jak!

float[] frequencies = {333.35f, 165.01f, 78.24f, 90.3f, 16.16f};

Podczas przypisywania bądź odwoływania się, musicie koniecznie zwrócić uwagę na indeks. W zdecydowanej większości języków wysokiego poziomu jakie są w dzisiejszych czasach wykorzystywane, indeksy liczymy od ZERA! Chwila nieuwagi i możecie sobie narobić kłopocików podczas odwoływania się do niewłaściwego elementu, bądź też wypadnięcia poza ramy tablicy. Dlatego też, jeśli macie powyższą tablicę pięcioelementową, to indeksy jej wartości będą wyglądać następująco:

{0, 1, 2, 3, 4}

a przykładowe odwołanie się do piątego elementu wykonacie tak:

float lastFrequency = frequencies[4];

SZYBKOŚĆ BŁYSKAWICY!

Jeśli mielibyście wskazać korzyść z korzystania tablic, to jest nią ekspresowy dostęp do argumentów. Każda struktura danych o dynamicznym dostępie może pozazdrościć szybkości przedostawania się do danego elementu dzięki notacji indeksowej. Wystarczy wskazać indeks o jaki element nam chodzi:

float firstFrequency = frequencies[0];

i program natychmiast wyszukuje wartość. Najważniejsze, żeby nie wylecieć poza rozmiar tej tablicy. W zależności od tego, jak bardzo język jest abstrakcyjny, próba zakończy się zgłoszeniem wyjątku albo wyłożeniem się programu nawet bez komunikatu o błędzie.

JA TEŻ MAM SWOJE WADY

Przedstawię teraz ogromną wadę tej struktury danych, bo uważam tę informację za cenną. Tablica, z racji tego że jest strukturą statyczną, nie posiada możliwości rozszerzania się. Innymi słowy, trzeba określić jej rozmiar już na etapie kompilacji programu. ZAWSZE. W praktyce sprowadza się to do tego, że jeśli hipotetycznie będziecie chcieli dodać do tablicy nowy element, a rozmiar jest niewystarczający, to musicie stworzyć sobie nową tablicę o rozmiarze większym o jedną jednostkę. Wiecie ile taka mała potrzeba może kosztować procesor? Tego się nie da przeskoczyć tak "hop-siup", więc tablica wtedy odpada i jest konieczna zamianka na listę wiązaną, która jako dynamiczna struktura danych już pozwala na elastyczne dopasowywanie rozmiaru do potrzeb programu w trakcie jego działania.

Druga rzecz która może zniechęcać do użycia tablicy, jest brak możliwości nadawania nazw poszczególnym elementom. Jesteśmy postawieni w sytuacji, w której przykładowo mamy znaleźć naszą ulubioną grę o pewnym tytule, a pudełka nie mają etykiet tylko same liczby porządkowe (przez co każdą trzeba otworzyć i sprawdzić czy to ta). Powinniście już kumać. Sorry, takie rzeczy tylko w tablicy asocjacyjnej nazywanej "słownikiem", bo tam możemy przypisać sobie klucz jako etykietę, a do niego wartość w postaci tego "pudełka" z przykładowej historyjki.


Dotarliśmy do mety. Raz kolejny pisząc artykuł, mam nadzieję że język nie był zbyt enigmatyczny, a zestaw informacji tak obszerny, że aż się ulewa ;).

PODOBNE ARTYKUŁY