BETA.3 ZX ZX SPECTRUM TASWORD TWO
SORT znakove pole, alebo ciselne pole, alebo string (G + M)
----------------------------------------------------------------
SORT usporaduva stringy, polia znakov alebo cisel v
zostupnom alebo klesajucom poriadku. Najprv pouzijeme SORT
na znakove pole. Vsimnite si program:
100 DIM A$(100,10)
110 FOR S=1 TO 100: FOR L=1 TO 10
120 LET A$ (S,L)= CHR$ (RND*25+65)
130 NEXT L : NEXT S : GO TO 200
140 SORT A$
200 FOR S=1 TO 100 : PRINT A$(S) : NEXT S
Program vytvori pole stringov po 10 znakov a potom ho
ukaze. Potom zadajte GO TO 140 - stringy budu
usporiadanea znovu ukazane. Nezlaknite sa - usporiadanie
trva zlomok sekundy. Pocet stringov podmienuje dlzku
usporaduvania - 200 za 0,7 sekundy, 400 za 3 sekundy.
Sringy su usporiadane podla ASCII kodov. Ked dame
140 SORT INVERSE A$, tak sa usporaduva v klesajucom pora-
di. Mozete obmedzit usporaduvanie na blok stringov
SORT A$ (1 TO 20) - prvych 20
SORT A$ (30 TO ) - od 30 vyssie.
Aj triedenie casti stringov
SORT A$ () (2 TO ) - usporaduva od druheho znaku a prvy
neuvazuje.
Pomocou SORT si velmi lahko zorganizujete Vasu databanku.
SORT pracuje i s neindexovanymi stringami :
INPUT S$ : SORT S$ : PRINT S$
S rovnakou syntaxou spracuje SORT i ciselne polia 1 alebo
dvoch dimenzii. Napr.:
SORT B(1 TO 20)(2) - usporiada prvych 20 riadkov matice
B na zaklade cisel v druhom stlpci. Pritom sa presuvaju
cele riadky. Pouzite aspon jedny zatvorky, aby SORT odli-
sil B od pola B(). Druhy slicer tu moze byt dlhy len jed-
no cislo - na rozdiel od stringov. Usporaduvanie trva asi
4 krat dlhsie ako pri stringoch kvoli formatom a pripadne
negativnym cislam. Vo verzii 1.0 sa zial vyskytnu proble-
my ked by ste chceli triedit 256, 512, 760 atd. elementov
- preto je lepsie sa tom vyhnut. TRACE cislo riadku (G+T)
----------------------------------------------------------------
TRACE pomaha hlavne pri hladani chyb v BASIC programoch.
Napr. ukazuje pri behu programu cislo vykonavaneho riadku
a prikazu v riadku, alebo zvolene premenne, alebo dovolu-
je pomalsie vykonavanie programu, alebo krokovanie pro -
gramu. Ked sa TRACE vyskytuje v programe. pred kazdym
riadkom sa vykonaju prikazy v podprograme na ktory sa ska
ce. Mame k dispozicii premenne LINE a STAT (rezervovane)
- cislo riadku a prikazu v riadku. Pocas TRACE rutiny sa
TRACE mod vypne, po RETURN sa zas zapne. Povel TRACE 0 -
vypne TRACE.
Obsah TRACE rutiny moze byt lubovolny. Napr.:
9000 PRINT INVERSE 1; line; ":"; stat : RETURN
Po zavedeni tohto riadku do programu sa rutina zapne
povelom TRACE 9000 tam, kde chceme zacat hladat chybu.
Pre lepsiu rozlisitelnost je hlasenie inverzne a ukazuje,
v ktorom riadku sa program vykonava a ktory povel riadku
prave prebieha. Po RUN, CLEAR, TRACE 0 sa TRACE vypne.
Na spomalenie programu mozeme dat do rutiny PAUSE.
Taktiez je mozne nechat zobrazit zvolene premene, ale len
tie, ktore uz boli deklarovane. Ak chceme mat tlac pri TR
ACE rutine na jednom mieste, musime uchovat aktualnu
PRINT poziciu:
9000 LET stlpec = PEEK 23688: LET riadok = PEEK 23689
9010 PRINT AT 0,0; line;":";stat;" ","A$ = ";A$;" "
9020 POKE 23688,stlpec : POKE 23689,riadok : RETURN
Tento program bude ukazovat obsah A$ vzdy na mieste 0,0. UNTIL podmienka (G+K)
----------------------------------------------------------------
Pozri : DO a LOOP USING (G+U)
----------------------------------------------------------------
Pouziva sa v: PRINT USING formatovy string, ciselny vyraz
Tu sa tiez vysvetli FN U$
Using a FN U$ dovoluju tlacit cisla v danom formate.
Miesto USING sa da vzdy pouzit FN U$. FN U$ dava vysledok
string, ktory by ukazoval PRINT USING. FN $ sa da pouzit
i v LET prikaze, alebo porovnat.
Vo formatovom stringu stoji # pres desatinnou bodkou
miesto cisla alebo prazdneho znaku a znak 0 pre cislo
alebo 0. Za desatinnou bodkou je to podobne.
100 FOR n=1 TO 20 : LET x = RND * 100
110 PRINT n, USING "###.##";x : NEXT n
Vsimnite si zaokruhlovanie cisel pri USING. Teraz experi-
mentujte s roznymi formatmi. Mozeme volit i ine znaky do
formatu. Tak napr.: cislo 12.3456 tlacime pomocou USING
"Kcs 00.00" ako Kcs 12.35. Znakom % sa ukaze, ze pretie-
kol format. "0.00" da % ..3.
Pozor - cisla v exponente sa nespracuvaju v USING prikaze
Miesto PRINT USING A$ : cislo mozeme tiez pisat
PRINT FN U$ (A$,cislo)XOS, XRG, YOS, YRG
----------------------------------------------------------------
Tieto styri slova su rezervovane premenne, nie prikazy.
Tym mozeme skalu a zaciatok zmenit v prikazoch PLOT,
DRAW a CIRCLE. XOS - posunutie v x-smere, YOS - v y-sme-
re, XRG a YRG su pre oblast pozdlz x-osi a y-osi.
Tieto premenne nie su vymazane pomocou RUN a CLEAR, ale
nastavene na urcite hodnoty. Ak dame CLEAR a PRINT XOS,
dostaneme "0", nie "Variable not found". XOS a YOS sa
nastavia na 0 - pociatok teda nie je posunuty. Potom je
jednoduche posunut pociatok a nie prepisovat mnoho PLOT
prikazov. LET XOS = 128 : LET YOS = 88 - da pociatok do
stredu obrazovky a mozeme pouzit PLOT od -128 do 127
v x-smere a od-88 do 87 v y-smere.
XRG sa nastavi na 256, YRG je normalne 176. Zmena tychto
premennych meni skalu pre PLOT a DRAW:
10 GOSUB 100 : REM Normal
20 LET XRG = 128 : GOSUB 100
30 LET YRG = 88 : GOSUB 100
40 LET XRG = 256 : GOSUB 100 : STOP
100 CLS : PLOT 0,0 : DRAW 50,0 : DRAW 0,50
110 DRAW -50,0 : DRAW 0,-50 : PAUSE 100 : RETURN
Podprogram najprv ukaze stvorec, potom stvoruholnik pre-
dlzeny pozdlz x. Potom tiez predlzene pozdlz y, potom sa
x-os nastavi naspat.
V tomto priklade sa ukaze Sinus. Pritom sa zmeni pocia-
tok a skala.
100 LET XRG = 2 * PI : REM 360 Grad
110 LET YRG = 2.2 : REM sin ide od -1 do 1
120 LET YOS = 1.1 : REM poc v polovicnej vyske
130 FOR n = 0 TO 2 * PI STEP 2 * PI /256
140 PLOT n, SIN n : NEXT n
Ked pouzivate DRAW alebo CIRCLE, tak sa pociatok a ko-
niec spocitaju dobre, ale spodna ciara nebude predlzena. F U N K C I E
------------- V Beta Basicu mate pristup k desiatim novym funkciam, ktore
su definovane v riadku 0 (ktory normalne nebyva ukazany) beznym
sposobom. Skutocna definicia je v strojovom kode vo vrchnej cas-
ti RAM. Daju sa teda pouzit, len ked je nahrany BB. Inak pokus o
ich vykonanie sposobi uplny restart systemu. Ked vam riadok 0
chyba, tak su funkcie pre BB stratene, ale zvysok pracuje bez
problemov.
Ked uschovate BB program pomocou SAVE, uschova sa i riadok 0.
Naspat pri LOAD sa nahra i riadok 0. Ale ked sme program pisali
a uschovali bez BB, tak sa pri LOAD riadok 0 zotrie. Ak pouzije-
te MERGE, zostane riadok 0 na svojom mieste.
Ak chcete usetrit miesto, lebo funkcie nepotrebujete, pouzije-
te DELETE 0 TO 0 (riadok 0 zabera 251 bytov).
FN C$ (ciselny vyraz)
----------------------------------------------------------------
Pozri tiez: FN N (Stringovy vyraz)
Tato funkcia premiena prirodzene cisla (od 0 do 65535)
na stringy o dlzke dvoch znakov. Takto mozete mnoho ta-
kychto cisel uschovat v mensej oblasti pamate. V BASIC-u
tomu odpoveda (pomale)
LET A = INT (cislo / 256) : LET B = cislo - A * 256
LET C$ = CHR$ A + CHR$ B
Ak by ste chceli tento string tlacit, dostanete casto
"Invalid colour", lebo stringove print kontrolne kody su
v nom casto zastupene. Normalne sa prevadzaju tieto nas-
pat pomocou FN N (dvojznakovy string). Uschovane cisla
zaberaju miesto zvycajnych 5 bytov len 2 byty.
Cisla nemusia byt celymi cislami. Napr. mozete 87.643
pretransformovat na 8764.3. FN C$ urobi z cislic pred
desatinou bodkou string dlzky 2; potom pri spatnej
transformacii pomocou FN N a delenim 100 dostaneme cislo
87.64, co je pre mnozstvo uloh dostatocna presnost.
Nasledovny prikaz tvori ciselne pole:
100 DIM A$ (500,2)
110 FOR E = 1 TO 500 : LET A$(E)= FN C$(E*10) : NEXT E
120 PRINT "Pole je hotove - stlac hocico"
130 PAUSE 0
140 FOR E = 1 TO 500 : PRINT E, FN N (A$(E)) : NEXT E
Toto ciselne pole zabera iba 1000 bytov proti 2500 v po-
li s normalnymi cislami. SORT pracuje spravne aj s tymi-
to komprimovanymi poliami.FN D (Stringovy vyraz)
---------------------------------------------------------------
Pozri aj FN H$(ciselny vyraz)
Tato funkcia dava desiatkovy ekvivalent pre hexadecimalny
string dlzky 1 az 4 znaky. Velke a male pismena sa neroz-
lisuju.
FN D ("FF") = 255
FN D ("10") = 16
FN D ("4000") = 16384
FN d ("e") = 14
Pouzitie napr.:
INPUT A$ : POKE adresa, FN D (A$)
pre naplnenie nejakej adresy hexadecimalnym cislom.
Pri nespravnom argumente - chybove hlasenie "Invalid
argument".FN H$ (ciselny vyraz)
----------------------------------------------------------------
Pozri tiez : FN D (stringovy vyraz)
Ciselny vyraz bude premeneny na hexadecimalny string. Tento
ma dlzku 2 znaky pre cisla od -255 do +255 a dlzku 4 znaky
pre cisla v absolutnej hodnote vacsie. Hodnoty nad 65535
sposobia chybu "Integer of range".
FN H$ (32) = "20"
FN H$ (255) = "FF"
FN H$ (-1024) = "FB00"
Premena zapornych cisel na hexa je pomockou pre asembleris-
tov, ktori chcu pocitat rucne relativne skoky.
Na zobrazenie obsahu pamate sluzi program :
100 INPUT "Startovacia adresa ?"; adresa
110 PRINT FN H$ (adresa);" "; FN H$ (PEEK adresa)
120 LET adresa = adresa + 1 : GOTO 110
Ked chcete i start adresu zadat v hexa -
100 INPUT "Start adresa ?"; A$ : LET adresa = FN D (A$) FN I (Start, String A, String B)
----------------------------------------------------------------
V inych BASIC-och sa tato funkcia casto vola INSTRING.
FN I hlada v stringu A string B, zacinajuc od pozicie
start. Ked sa B najde v A, je vysledkom funkcie miesto
prveho znaku stringu B v stringu A. Ked sa B nenajde, je v
vysledkom nula. String A moze byt lubovolne dlhy, string B
nesmie byt dlhsi ako 255 znakov (inak dostaneme "Invalid
argument"). Ked za "Start" dame 0, dostaneme hlasenie
"Subscript out of range". Vysledok je tiez nulovy, ked je B
dlhsie ako A, alebo Start vacsi ako dlzka stringu A, alebo
ked je jeden zo stringov prazdny.
Niektore znaky v B mozete nahradit pomocou "#", co znaci,
ze "tento znak je lubovolny". Napr.:
PRINT FN I(1,A$,"M##ER") hlada v A$ vyskyt stringov
MEIER, MEYER, MAIER atd. Pri vyskyte znaku "#" samotneho
sa da hladat, iba ak je prvym znakom v B. Moznost urcit
start hladania je dobra na hladanie viacnasobneho vyskytu.
Pozrite si priklad:
100 DIM A$ (1000)
110 FOR n = 1 TO RND * 10 + 3
120 LET pos = RND * 995
130 LET A$ (pos TO pos+3) = "TEST"
140 NEXN n
150 PRINT "TESTy su schovane - stlac tlacitko"
160 PAUSE 0
170 LET loc = 1
180 LET loc = FN I (loc,A$,"TEST")
190 IF loc <> 0 THEN PRINT "Najdene na pozicii",loc :
LET loc = loc + 1 : GOTO 180
200 PRINT " To su vsetky"
FN I sa da dobre pouzit v ucebnych programoch pre hladanie
spravnych odpovedi. Ked sa cakala odpoved na otazku
"NAPOLEON" a niekto zadal odpoved "NAPOLEON BONAPARTE"
tak sa to obvykle vyhodnotilo ako nespravna odpoved. Pomo-
cou FN I sa da najst spravna odpoved v dlhej.
Dalsie pouzitie - stringy roznej dlzky umiestnit do spolo-
cneho stringu a tak usporit mnoho miesta. Napr. sa daju
vsetky znaky specialneho pola rezervovat ako oznacenia
urcitej oblasti. Napr. CHR$1 bude znacit zaciatok prveho
podstringu v dlhom stringu, CHR$2 zaciatok druheho atd.
(az po 31). Potom
PRINT A$ (FN I (1,A$,CHR$n) + 1 TO FN I (1,A$,CHR$(n+1))-1)
potom ukaze n-ty podstring dlheho stringu A$. Mozne su i
ine metody, ale maju vyhodu v tom, ze sa uspori vela miesta
pri roznych dlzkach podstringov.