Rozdział 12


TABLICE

 

Podsumowanie

Tablice (sposób obsługi łańcuchów w ZX Spectrum jest trochę niestandardowy).
DIM
...

 

Załóżmy, że posiadasz listę liczb, np. oceny dla dziesięciu osób w klasie. Aby umieścić je w komputerze, mógłbyś przeznaczyć po jednej zmiennej dla każdej osoby, lecz byłoby to bardzo niezgrabne. Mógłbyś nazwać te zmienne Kolega 1. Kolega 2, itd. aż do Kolega 10, lecz program ustawiający te dziesięć liczb byłby raczej długi i nudny do wpisania.

O ile milej byłoby, gdybyś mógł wpisać coś takiego:

 

  5 REM ten program nie bedzie dzialal
10 FOR n=1 TO 10
20 READ Kolega n
30 NEXT n
40 DATA 1,2,4,3,5,6,4,5,3,1
 

No więc tak nie możesz.

Jednakże istnieje pewne rozwiązanie, dzięki któremu możesz zastosować ten pomysł, a wykorzystuje ono tablice. Tablica jest zbiorem zmiennych, które nazywamy jej elementami, a wszystkie posiadają taką samą nazwę i są rozróżniane jedynie wg numeru (indeksu) zapisywanego w nawiasach po nazwie. W naszym przykładzie nazwa może brzmieć b (podobnie jak przy zmiennych sterujących pętlami FOR - NEXT, nazwa tablicy musi składać się z jednej litery), a te dziesięć zmiennych będzie wtedy miało nazwy b(1), b(2) ... b(10).

Elementy tablicy nazywane są zmiennymi indeksowanymi, w przeciwieństwie do prostych zmiennych, z którymi już się zapoznałeś.

Zanim będziesz mógł wykorzystać jakąś tablicę, najpierw musisz zarezerwować dla niej nieco miejsca w komputerze, a zrobisz to używając polecenia DIM (ang. dimension - rozmiar, wymiar).

 

DIM b(10)

 

tworzy tablicę nazywającą się b o rozmiarze 10 (tj. znajduje się w niej 10 indeksowanych zmiennych b(1), b(2) ... b(10)) i inicjuje te 10 wartości na 0. Kasuje również jakąkolwiek inną tablicę o nazwie b, która istniała poprzednio. (Ale nie prostą zmienną. Mogą współistnieć ze sobą dwie zmienne o tej samej nazwie, z których jedna jest tablicą, a druga zwykłą zmienną, a pomiędzy nimi nie powinno dojść do żadnego zamieszania, ponieważ zmienna tablicy zawsze posiada indeks.)

Indeks może być dowolnym wyrażeniem liczbowym, zatem możesz zapisać

 

10 FOR n=1 TO 10
20 READ b(n)
30 NEXT n
40 DATA 10,2,5,19,16,3,11,1,0,6

 

Możesz również tworzyć tablice posiadające więcej niż jeden wymiar. W dwuwymiarowej tablicy potrzebne będą dwie liczby do określenia jednego z elementów — raczej jak numery wiersza i kolumny określające pozycję znaku na ekranie telewizyjnym. Zastępczo możesz sobie wyobrazić te numery wiersza i kolumny (dwa wymiary) jako wskazujące położenie na drukowanej stronie, gdzie mógłbyś posiadać dodatkowy wymiar na numery stron. Oczywiście, mówimy o tablicach liczbowych, zatem ich elementami nie byłyby znaki drukowane, jak w książce, lecz liczby. Wyobrażaj sobie elementy trójwymiarowej tablicy v jako określone przez:

 

v(numer strony, numer wiersza, numer kolumny).

 

Na przykład, aby utworzyć dwuwymiarową tablicę c o wymiarach 3 i 6, używasz polecenia

 

DIM c(3,6)

 

Daje ci ono 3*6=18 zmiennych indeksowanych:

 

c(1,1),c(1,2),...,c(1,6)
c(2,1),c(2,2),...,c(2,6)
c(3,1),c(3,2),...,c(3,6)

 

Ta sama zasada obowiązuje dla dowolnej liczby wymiarów.

Chociaż mogą istnieć obok siebie zmienna prosta i tablica o tej samej nazwie, to nie można mieć w programie dwóch tablic o takiej samej nazwie, nawet jeśli różnią się one liczbą wymiarów.

Istnieją również tablice łańcuchowe. Łańcuchy w tablicy różnią się od prostych łańcuchów tym, że posiadają ustaloną długość, a przypisywanie im wartości zawsze odbywa się wg zasady Prokrusta - obcinanie lub dopełnianie spacjami. Również można je traktować jak dwuwymiarowe tablice pojedynczych znaków. Nazwa tablicy składa się z pojedynczej litery i znaku $, a tablica łańcuchowa i zwykła zmienna łańcuchowa nie mogą posiadać wspólnej nazwy (w przeciwieństwie do zmiennych liczbowych).

Załóżmy zatem, że chcesz mieć tablicę a$ z pięcioma łańcuchami. Musisz się zdecydować, jak długie mają być te łańcuchy — załóżmy, że wystarczy dla każdego 10 znaków. Wpisujesz więc

 

DIM a$(5,10)

 

Utworzy to tablicę 5*10 znaków, lecz możesz również traktować każdy jej wiersz jako łańcuch:

 

a$(1)=a$(1,1) a$(1,2) ... a$(1,10)
a$(2)=a$(2,1) a$(2,2) ... a$(2,10)
   .     .     .     .     .     .     .     .     .
   .     .     .     .     .     .     .     .     .

a$(5)=a$(5,1) a$(5,2) ... a$(5,10)

 

Jeśli podasz tę samą liczbę indeksów (w tym przypadku dwa) co liczba wymiarów w poleceniu DIM, to otrzymasz pojedynczy znak; lecz jeśli opuścisz ostatni indeks, to otrzymasz łańcuch o ustalonej długości. Zatem, na przykład, A$(2,7) jest 7-mym znakiem łańcucha A$(2); używając notacji slicing, można to również zapisać jako A$(2)(7). Teraz wpisz

 

LET a$(2)="1234567890"

i

PRINT a$(2),a$(2,7)

 

Otrzymasz

 

1234567890      7

 

Przy ostatnim indeksie (tym, który możesz pominąć) możesz również stosować slicing, zatem przykładowo

 

a$(2,4 TO 8)=a$(2)(4 TO 8)="45678"

 

Zapamiętaj:

W tablicy łańcuchowej wszystkie łańcuchy mają tę samą, ustaloną długość.

Polecenie DIM posiada dodatkową liczbę (ostatnią) w celu określenia tej długości.

Gdy używasz zmiennej indeksowanej jako elementu tablicy łańcuchowej, możesz umieścić dodatkowy numer lub slicing, aby odpowiadał tej dodatkowej liczbie w poleceniu DIM. Możesz stworzyć tablicę łańcuchową bez wymiarów. Wpisz

 

DIM a$(10)

 

a przekonasz się, że a$ zachowuje się tak samo jak zmienna łańcuchowa za wyjątkiem tego, iż zawsze ma długość 10, a przypisania do niej zawsze wykonywane są wg zasady Prokrusta.

 

Ćwiczenia

1. Użyj poleceń READ i DATA, aby stworzyć tablicę m$ dwunastu łańcuchów, w których m$(n) jest nazwą n-tego miesiąca. (Wskazówka: polecenie DIM przybierze postać DIM m$(12,11). Przetestuj to wypisując wszystkie łańcuchy m$(n) (użyj pętli)).

Wpisz (nie przejmuj się brakiem polskich liter)

 

PRINT "Miesiac ";m$(5);"owy jest fajowy"

 

Jak pozbyć się tych wszystkich spacji?

 

 


   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2018 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