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
DIM meno(najväčší index)
DIM meno(riadky,stĺpce)
meno(index)=hodnota| Zápis | Vý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)=11 | uloží 11 do prvku s indexom 2 |
A(I) | prvok, ktorého index je práve v premennej I |
CLR | vynuluje 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:
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 RPreklad a spustenie
Basic26 arrays.abas --simČo uvidíš
Average: 14.5714285
Warmest day: 4 with 19
1 2 3
2 4 6
3 6 9Ako to funguje
- Riadok 20:
DIM TEMP(6)vyhradí sedem čísel. Tak ako pri reťazcoch, pole treba ohlásiť skôr, než ho použiješ. - Riadky 30 a 40: naplnenie po jednom. Pohodlnejšie to pôjde s
DATAv kapitole 14. - Riadky 60 až 90: jedna slučka prejde celé pole.
TEMP(D)je zakaždým iný prvok, leboDsa mení. - Riadok 80: hľadanie najväčšieho.
HIGHsi nepamätá teplotu, ale index dňa, kedy bola najvyššia; samotnú teplotu potom dáTEMP(HIGH). - Riadok 130: dvojrozmerné pole je tabuľka. Prvé číslo je riadok, druhé stĺpec.
- Riadky 140 až 160: dve slučky v sebe prejdú všetky políčka.
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:
30 FOR I=0 TO 6:TEMP(I)=0:NEXT IKoľ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:
10 DIM D$(21)
20 D$="MonTueWedThuFriSatSun"
30 FOR N=1 TO 7
40 PRINT D$(N*3-2,N*3)
50 NEXT NKaž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 DIM | ERROR- 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 behu | ERROR- 9 AT LINE 20 |
| záporný index | ERROR- 3 |
DIM toho istého poľa dvakrát | error 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
- Nájdi v
arrays.abasaj najchladnejší deň. - Naplň pole desiatimi číslami z klávesnice (
INPUTv slučke) a vypíš ich v opačnom poradí. - Vypíš z tabuľky
Tlen uhlopriečku:T(1,1),T(2,2),T(3,3).
Zhrnutie
- Pole je rad čísel pod jedným menom;
DIM A(n)má prvky 0 ažn. - Index môže byť premenná, preto pole prejde jedna slučka
FOR. DIM A(r,s)je tabuľka.- Index mimo poľa je chyba 9.
- Polia sú len číselné; viac textov sa drží v jednom reťazci.
Späť: 12. Výber z možností · Ďalej: 14. Dáta v programe