13. Polia: DIM A(n), DIM A(n,m), CLR

Na čo to je

Sedem teplôt za týždeň by potrebovalo sedem premenných a sedem skoro rovnakých riadkov na každú vec, ktorú s nimi chceš urobiť. Pole je rad čísel pod jedným menom: TEMP(0), TEMP(1) … TEMP(6). Číslo v zátvorke – index – môže byť premenná, a tak pole prejde jedna slučka.

Ako sa to píše

Atari BASIC
DIM meno(najväčší index)
DIM meno(riadky,stĺpce)
meno(index)=hodnota
ZápisVýznam
DIM A(6)pole so siedmimi prvkami: A(0) až A(6)
DIM T(3,3)tabuľka: prvky T(0,0) až T(3,3), teda 4 × 4
A(2)=11uloží 11 do prvku s indexom 2
A(I)prvok, ktorého index je práve v premennej I
CLRvynuluje všetky premenné a zruší všetky DIM

Indexy sa počítajú od nuly. Veľa programov nulu nepoužíva a počíta od jednotky – nevadí, jeden prvok ostane nevyužitý.

Pole môže držať len čísla. Pole reťazcov Atari BASIC nemá; ako ho obísť, je na konci kapitoly.

Celý program

Súbor examples/arrays.abas:

Atari BASIC
10 REM Arrays: many numbers under one name
20 DIM TEMP(6)
30 TEMP(0)=12:TEMP(1)=14:TEMP(2)=11:TEMP(3)=17
40 TEMP(4)=19:TEMP(5)=16:TEMP(6)=13
50 SUM=0:HIGH=0
60 FOR D=0 TO 6
70   SUM=SUM+TEMP(D)
80   IF TEMP(D)>TEMP(HIGH) THEN HIGH=D
90 NEXT D
100 PRINT "Average: ";SUM/7
110 PRINT "Warmest day: ";HIGH;" with ";TEMP(HIGH)
120 REM A table with rows and columns
130 DIM T(3,3)
140 FOR R=1 TO 3:FOR C=1 TO 3
150     T(R,C)=R*C
160 NEXT C:NEXT R
170 FOR R=1 TO 3
180   PRINT T(R,1),T(R,2),T(R,3)
190 NEXT R

Preklad a spustenie

Basic26 arrays.abas --sim

Čo uvidíš

Average: 14.5714285
Warmest day: 4 with 19
1         2         3
2         4         6
3         6         9

Ako to funguje

Po DIM v poli nemusia byť nuly

Atari BASIC pole pri DIM nevynuluje – ostane v ňom, čo bolo v pamäti predtým. Kým do prvku niečo neuložíš, nespoliehaj sa, že je nulový. Ak nuly potrebuješ, daj ich tam slučkou:

Atari BASIC
30 FOR I=0 TO 6:TEMP(I)=0:NEXT I

Koľko pamäte pole zaberie

Každé číslo má šesť bajtov. DIM A(1000) je šesť kilobajtov, a sedem takých polí sa už do Atari nezmestí – program skončí chybou 2. Jedno pole smie mať najviac 32 767 bajtov: DIM T(100,100) by ich chcelo vyše šesťdesiattisíc a skončí chybou 9.

CLR

CLR vráti program do stavu ako na začiatku: číselné premenné sú nula, reťazce a polia neexistujú a treba ich ohlásiť znova. Zabudne aj otvorené slučky FOR a podprogramy GOSUB – NEXT za CLR je chyba 13, RETURN chyba 16; TRAP ostane. Použije sa zriedka – napríklad v hre, ktorá po skončení začína odznova a chce si polia pripraviť nanovo.

Zoznam slov bez poľa reťazcov

Viac textov sa v Atari BASICu drží v jednom dlhom reťazci a vyberajú sa z neho časti rovnakej dĺžky:

Atari BASIC
10 DIM D$(21)
20 D$="MonTueWedThuFriSatSun"
30 FOR N=1 TO 7
40   PRINT D$(N*3-2,N*3)
50 NEXT N

Každý deň má tri písmená; N-tý sa začína na mieste N*3-2.

Časté chyby

Čo sa staloČo sa stane
pole bez DIMERROR- 9 AT LINE 10
index za koncom, napísaný číslom (A(6) pri DIM A(5))error B26009: A(6) is past DIM A(5)
index za koncom, vypočítaný za behuERROR- 9 AT LINE 20
záporný indexERROR- 3
DIM toho istého poľa dvakráterror B26009: A( is DIMensioned twice (po CLR je to len upozornenie)
pole je príliš veľkéERROR- 2 (nie je pamäť) alebo ERROR- 9 (viac než 32 767 bajtov v jednom poli)
slučka FOR I=1 TO 7 pri DIM A(6)chyba 9 pri poslednom prechode: prvkov je sedem, ale posledný má index 6

Vyskúšaj si

  1. Nájdi v arrays.abas aj najchladnejší deň.
  2. Naplň pole desiatimi číslami z klávesnice (INPUT v slučke) a vypíš ich v opačnom poradí.
  3. Vypíš z tabuľky T len uhlopriečku: T(1,1), T(2,2), T(3,3).

Zhrnutie

Späť: 12. Výber z možností · Ďalej: 14. Dáta v programe