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.