Koncepcje programowania/Tablice

Z Wikibooks, biblioteki wolnych podręczników.

Znasz już koncepcje zmiennej, czyli pojedynczymi szufladkami na dane, wiesz już że zmienna może przechowywać jakąś wartość. Podstawowym jej ograniczeniem jest oczywiście to, że w jednej zmiennej możesz przechować tylko jedną wartość, co może być problematyczne. Na przykład, pisząc program inżynierski, dokonujący obliczeń na podstawie 300 pomiarów, będziemy ni z tego ni z owego zmuszeni do stworzenia 300 zmiennych. Sama taka deklaracja zajmowałaby kilkadziesiąt linii w kodzie nie wspominając o tym jak dużo zajęłoby to nam czasu. Na pewno byłoby to bardzo nieefektywne. Potrzebny jest więc mechanizm, który pozwoliłby nam w jednej zmiennej, przechować wiele różnych wartości. I większość języków programowania taki mechanizm posiada, nazywamy je tablicami. W zależności od języka nazywa się je różne, w Pythonie są to listy w JavaScript kolekcje ale ostatecznie cała ich koncepcja zasadniczo się nie zmienia więc będziemy tutaj używać najpopularniejszego terminu czyli tablicy by uniknąć chaosu syntaktycznego.

Tablica to nic innego jak specjalna odmiana zmiennej, która może przechowywać wiele różnych wartości, ustawione w szereg. W pamięci takie zmienne będą zawsze utworzone jedna za drugą, pod kolejnymi adresami w pamięci, zależnie od tego ile zajmuje taka pojedyncza zmienna. O adresach pamięci opowiemy bardziej szczegółowo w kolejnym rozdziale o wskaźnikach, na tym etapie wystarczy żebyś zapamiętał że tablice można sobie wyobrazić i porównać do sytuacji gdy ktoś ma dostęp do szafki dla klientów i każda z nich zawiera własną zawartość.

Na przykład wyobraź sobie, że piszesz program, który ma przechowywać listę nazwisk. Możesz użyć tablicy do przechowywania nazw, a każda nazwa miałaby określoną pozycję w tablicy. Umożliwiłoby to łatwy dostęp do dowolnej nazwy na liście według jej pozycji, a także ułatwiłoby dodawanie lub usuwanie nazw z listy.

Przykład zwykłej zmiennej

x = 1 # Tylko jedna wartość

Przykład tablicy:

x = [1, 2.5, "abc", true] #Cztery wartości

To również jest zmienna o nazwie x ale mamy tutaj nawiasy prostokątne i w tym nawiasie, mamy różne wartości, oddzielone przy pomocy przecinka. W większości języków programowania, nawiasy prostokątne są charakterystycznym elementem tablic w praktycznie dowolnym języku programowania i języków których używamy, czyli Python i JavaScript, nie są tu wyjątkiem.

Sercem tablic jest tak zwany indeks tablicy. Każda wartość w tablicy ma swój indeks, unikalny numer, m.in. Po to by móc się do tych wartości odwołać. Jeśli masz tablicę o nazwie x i ona zawiera np. 100 pozycji, potrzebny jest nam mechanizm, który pozwoli się do nich dostać.

70640A "test" 91.871 true 22652 "xyz" 56045
0 1 2 3 4 5

Tak mogłaby wyglądać przykładowa tablica, która posiada 6 różnych wartości. Pod wartościami znajdują się cyfry, to właśnie ten indeks. Zauważ że w zdecydowanej większości wypadków, numeracja tego indeksu zaczyna się od zera, nie od jedynki.

Jak tworzymy tablicę?

myArray = []; #Tworzymy pustą tablicę
myArray[0] = 32885 #dodajey wartość "35885" na pierwszej pozycji (indeks 0)
myArray[1] = "test" #dodajemy wartość "test" na drugiej pozycji (indeks 1)

można też stworzyć tzw. tablice wielowymiarowe. Wyobraź sobie, że masz duże pudełko pełne mniejszych pudełek, a każde mniejsze pudełko ma swoje własne przegródki. Tablica wielowymiarowa w Pythonie przypomina duże pudełko z mnóstwem mniejszych ramek w środku, a każde mniejsze pudełko ma własne sekcje, które pozwalają zachować porządek.

Załóżmy, że chcesz śledzić owoce w sklepie. Możesz utworzyć tabelę (tablicę wielowymiarową), w której każdy wiersz reprezentuje inny rodzaj owocu, a każda kolumna reprezentuje inne informacje o tym owocu.

Oto przykład:

Nazwa Kolor Cena
Owoce 1 Jabłko Czerwony 1 $
Owoce 2 Banan Żółty 0,5 dolara
Owoce 3 Pomarańczowy Pomarańczowy 0,8 dolara

W Pythonie można to przedstawić jako tablicę wielowymiarową:

owoce = [
     [Jabłko, Czerwone, 1],
     [Banan, Żółty, 0,5],
     [Pomarańczowy, Pomarańczowy, 0,8]
]

W tym przykładzie:

  • Każdy rząd reprezentuje inny owoc.
  • W pierwszej kolumnie znajduje się nazwa owocu.
  • Druga kolumna zawiera kolor owocu.
  • Trzecia kolumna zawiera cenę owocu.

Tak więc, jeśli chcesz poznać kolor drugiego owocu (banana), spójrz w drugim rzędzie (indeks 1) i drugiej kolumnie (indeks 1), co da ci „Żółty”. W tablicy wielowymiarowej odwołujesz się do zmiennej, określając jej indeks wiersza i kolumny w tablicy. Użyjmy wielowymiarowej tablicy "owoce" z poprzedniego przykładu:

Aby odwołać się do zmiennej (elementu) w tablicy, użyj nawiasów kwadratowych „[]”, aby uzyskać dostęp do wartości w określonym wierszu i kolumnie. Pamiętaj, że w Pythonie indeksowanie zaczyna się od 0.

- Aby odnieść się do nazwy drugiego owocu (Banana), użyłbyś `owoców[1][0]`. To przechodzi do drugiego wiersza (`[1]`) i pierwszej kolumny (`[0]`), co daje `"Banan"`. - Aby uzyskać dostęp do ceny trzeciego owocu (Pomarańczy), użyj `owoców[2][2]`. To przechodzi do trzeciego wiersza („[2]”) i trzeciej kolumny („[2]”), co daje „0,8”.

Zatem „owoce[indeks_wiersza][indeks_kolumny]” pomaga odwoływać się do konkretnej zmiennej w wielowymiarowej tablicy poprzez określenie wiersza i kolumny, w których znajduje się ta zmienna.

Właściwości oraz metody[edytuj]

Tablice mogą posiadać właściwości i metody. Np. Jedną z takich właściwości może być długość tablicy, czyli to, z ilu elementów składa się tablica:

Array = [1,2,3,4,'Python']
len(Array)

Stworzyliśmy tablicę składającą się z 5 elementów. Potem mamy słowo kluczowe len, nawias, nazwa tablicy. Właściwości są o tyle charakterystyczne że każdą z nich musimy wywołać w ten sposób, w tym wypadku sprawdzamy, jaka jest wartość właściwości, długości dla naszej tablicy Array.

Gdybyśmy ten skrypt uruchomili w Pythonie, oczywiście wyrzuci wartość 5, bo mamy 5 elementów w tablicy, pomimo faktu iż elementy w tablicy zaczynają się od zera, to python licząc elementy, będzie liczył je od 1.

Metody przypominają funkcje, ale używamy ich w nieco innych sposób, obiektowy o czym będzie w kolejnych rozdziałach podręcznika.

Przykładowe metody:

Array = [0,3,2,1,5]
print(Array)
Array.sort()
print(Array)
Array.reverse()
print(Array)

Pierwszą metodą jest Array.sort() zauważ że wpisuję nazwę tablicy, kropkę i sort. Ponieważ metoda jest funkcją, to w przeciwieństwie do właściwości, musimy użyć nawiasu na końcu, bo jak zapewne pamiętasz z poprzednich rozdziałów, charakterystyczną cechą funkcji są jej nawiasy. Sort jak sama nazwa sugeruje, posortuje nam wartości, w tym wypadku wartości liczbowe najmniejszego do największego, ale można też sortować inne typy danych na przykład tekst, czyli alfabetycznie i tak dalej. Taka metoda to specjalna funkcja którą po kropce wywołujemy na rzecz naszej tablicy bo nasza tablica jest obiektem (tak jak wszystko w języku Python).

Inny przykład metody to reverse, czyli odwróć. Odwróci nam kolejność wszystkich elementów w naszej tablicy, czyli ten który jest na pozycji pierwszej (0) stałby się elementem ostatnim oraz analogicznie pozostałe.

Jednakże, uruchamiając powyższy kod, elementy nie zostaną odwrócone w ten sposób: [5, 1, 2, 3, 0] tylko w ten: [5, 3, 2, 1, 0]. Dlaczego? Ponieważ wcześniej wykonali metodę sortowania a ponieważ każdy program jest odczytywany przez interpreter od lewej do prawej, od góry do dołu, kolejność elementów w tablicy zostanie zmieniona, nadpisana przez poprzednią metodę.

Przetwarzanie tablic[edytuj]

Często może zdarzyć się sytuacja, że będziesz musiał dokonać identycznych operacji na każdym elemencie w tablicy - najczęściej się używa do tego pętli.

i = 0 #Index rozpoczynamy od zera
while (i < Array.length() # Kończymy kiedy index = ilość elementów -1)
	print(Array[i]) #Indeks pozwala uzyskać dostęp do kolejnych elementów
	i++ #Inkrementacja indeksu

Typ danych w tablicy[edytuj]

Przypominam, że istnieje wiele różnych języków programowania, tablice w różnych językach mogą się różnie zachowywać, mogą mieć różne właściwości. My pracujemy głównie w Python ale jak być może zauważyłeś, używam przykładów z wielu różnych języków by móc jak najszerzej poruszyć każdy aspekt programowania, żeby podręcznik był jak najbardziej uniwersalny, żebyś posiadał wiedzę z szerokich perspektyw.

Odpowiedni typ danych w tablicy. W zależności od języka programowania, można mieszać wartości różnego typu w tablicy. Takie coś jest możliwe w JavaScript, PHP i tym podobne, ale istnieją także języki, w których musisz ściśle z góry określić jaki będzie typ wartości w tablicy - wtedy do jednej tablicy będzie można stosować tylko wartości jednego typu np. Zawiera tylko liczby i nie można wstawić żadnej innej.

Zmienna długość tablicy. Na przykład mamy tablicę która posiada początkowo 3 elementy, potem do tej samej tablicy dodajemy 3 kolejne elementy po prawej stronie. Zakładam że najpierw utworzono tablicę a później w jakiś sposób dynamicznie została ona rozszerzona o kolejne elementy w trakcie działania programu. Takie rozwiązanie jest możliwe zarówno w Python jak i JavaScript, ale istnieją też języki w których tablica ma z góry określoną długość, tzw. Tablica o stałej długości. Jeśli ma tylko 6 elementów to będzie miała tylko te 6 elementów, nigdy więcej. Jeśli będziesz potrzebować więcej wartości w tablicy, będziesz musiał stworzyć nową tablicę bądź w inny sposób ją przetworzyć.

Własny klucz tablicy. Co to jest klucz? To jest indeks, którym się już posługiwali, domyślnie jest to automatyczna numeracja rosnąca od zera. To często spotykane w wielu językach ale istnieją także takie języki, które mogą oferować tablice w których możliwa jest zmiana domyślnego indeksu na swój własny. Wyobraź sobie że w tablicy przechowujesz nazwy krajów. Zamiast stosować automatyczny, numerowany indeks, można samemu określić wartość klucza dla każdej wartości w naszej tablicy, na przykład na dwuliterowe kody krajów. I taką tablice, nazwalibyśmy tablicą asocjacyjną. Takie coś jest możliwe w języku Python, który nazywa tą funkcję słownikiem. W pewnych sytuacjach bywa przydatne, jak ww. Kody krajów, są w tym wypadku lepsze bo numery w tym kontekście nic nie mówią, natomiast kod kraju jednoznacznie określa wartość która do danego klucza została przypisana.

Zadania[edytuj]

  1. Utwórz listę swoich ulubionych filmów, a następnie napisz program , który wyświetla pierwsze i ostatnie filmy na liście.
  2. Napisz program , który skłania użytkownika do wprowadzenia 5 liczb całkowitych, a następnie przechowuje je na liście. Program powinien następnie obliczyć i wyświetlić sumę i średnią liczb na liście.
  3. Napisz program , który generuje listę pierwszych 10 liczb równych, a następnie wydrukuje listę w odwrotnej kolejności.
  4. Napisz program , który skłania użytkownika do wprowadzenia zdania, a następnie przekształca zdanie w listę słów. Program powinien następnie wyświetlić liczbę słów w zdaniu i listę słów w kolejności alfabetycznej.
  5. Napisz program , który tworzy listę liczb od 1 do 20, a następnie używa krojenia do wyświetlania tylko liczb na liście.
  6. Napisz program , który skłania użytkownika do wprowadzenia listy liczb oddzielonych przecinkami, a następnie przekształca wejście ciągów na listę liczb całkowitych. Program powinien następnie wyświetlić sumę liczb na liście.
  7. Napisz program , który generuje listę 10 losowych liczb między 1 a 100, a następnie wyświetla największe i najmniejsze liczby na liście.
  8. Napisz program , który zachęca użytkownika do wprowadzenia dwóch list liczb, a następnie łączy listy razem, aby utworzyć jedną listę. Program powinien następnie wyświetlić nową listę.
  9. Napisz program , który tworzy listę 10 losowych liczb między 1 a 100, a następnie używa pętli do obliczenia i wyświetlania sumy liczb na liście.
  10. Napisz program , który zachęca użytkownika do wprowadzenia listy słów, a następnie usuwa dowolne duplikaty z listy. Program powinien następnie wyświetlić nową listę bez duplikatów.