Rady programátorům v BASICu

Radek Štěrba, RASTER

Pod Zdeňkovým nátlakem jsem se rozhodl napsat několik rad programátorům v BASICu, které mohou zrychlit jejich program. Měl jsem totiž možnost shlédnout mnoho BASICovských prográmků a ve většině z nich se objevovaly některé programové konstrukce, které by se daly značně vylepšit.

Snad v každém programu se vyskytuje část s nějakým podmíněným nastavováním proměnné. V některých případech je to však vyřešeno značně neefektivně.

Př.
Je potřeba podle stlačené klávesy nastavit proměnnou B na 0,1,2,..,9.
Ve většině programů najdete toto:
(pozn. Čísla řádků nejsou podstatná)

GET TL
IF TL=48 THEN B=0
IF TL=49 THEN B=1
IF TL=50 THEN B=2
...
IF TL=57 THEN B=9

Pokud se na tuto posloupnost podmínek podíváte, zjistíte, že:

  1. Proměnná TL se bude vždy 10-krát porovnávat (takže to bude trvat dost dlouhou dobu).
  2. Těchto 10 podmínek zabere v paměti dost místa.

Přitom pozornějším pohledem zjistíte, že výslednou hodnotu proměnné B je možné získat odečtením konstanty od TL.

Takže nyní už vždy jen takto:

GET TL
IF TL>=48 AND TL<=57 THEN B=TL-48

Pokud mezi porovnávanou proměnnou a výslednou hodnotou neexistuje takovýto přímý vztah, zkuste použít metodu s tabulkou (polem) hodnot. Zabere sice někdy více paměti, ale je bezkonkurenčně nejrychlejší.

Př.
Chcete udělat ze svého počítače jednoduchý hudební nástroj. Dá se to udělat třeba takto:

10 T=PEEK(753) : K=PEEK(764)
15 F=0
20 IF K=47 THEN F=121
30 IF K=46 THEN F=108
40 IF K=42 THEN F=96
50 IF K=40 THEN F=91
60 IF K=45 THEN F=81
70 IF K=43 THEN F=72
80 IF K=11 THEN F=64
90 IF K=13 THEN F=60
100 IF K=30 THEN F=114
110 IF K=26 THEN F=102
120 IF K=29 THEN F=85
130 IF K=27 THEN F=76
140 IF K=51 THEN F=68
150 SOUND 0,F,10,T*3
160 GOTO 10

Teď už jen RUN a na klávesy Q,W,E,R,T,Y,U,I můžete hrát bílé klávesy a na 2,3,5,6,7 černé klávesy.

Ano, bude to fungovat, ale doba odezvy na stlačení asi nebude nic moc. A teď si ještě představte, že byste chtěli další oktávu na klávesách Z,X,..,M. Pak by už množství podmínek bylo jistě neúnosné.

Nové řešení spočívá v tom, že si zjistíte maximální rozsah porovnávané proměnné a podle ní vyrobíte tabulku. Výsledek pak získáte tak, že vezmete prvek z tabulky s indexem porovnávané proměnné. Nejlépe to pochopíte z následující ukázky.

To stejné jiným způsobem:

10 DIM P(51)
20 RESTORE 500
25 FOR X=0 TO 51: P(X)=0: NEXT X
30 FOR X=1 TO 13: READ A,B: P(A)=B: NEXT X
100 T=PEEK(753) : K=PEEK(764)
110 F=0: IF K<=51 THEN F=P(K)
120 SOUND 0,F,10,T*3
130 GOTO 100
500 DATA 47,121,46,108,42,96,40,91,45,81,43,72,11,64,13,60
510 DATA 30,114,26,102,29,85,27,76,51,68 

Vysvětlivky:
10: Deklarace pole P o 51 prvcích
20: Inicializace pro čtení data-řádků
25: Vynulování celého pole
30: Naplnění pole hodnotami podle data-řádků. Vždy P(kód klávesy)=frekvence odpovídající této klávese.
100: T = je nějaká klávesa stisknutá, K = kód stisknuté klávesy
110: Přiřazení frekvence podle pole P(K)
120: Spustit zvuk
130: A pořád dokola...
500: V data-řádcích jsou za sebou dvojice čísel: kód klávesy, odpovídající frekvence

Spustíte to příkazem RUN a funguje to stejně. Jenomže mnohem rychleji a kdybyste chtěli přidat rozpoznávání další řady kláves, stačilo by přidat do data-řádků další dvojice, zvětšit horní mez smyčky na řádku 30, v případě nutnosti zvětšit rozsah pole P a s tím je spojena nutná změna horní meze smyčky na řádku 25.

Ať však přidáte dalších kláves kolik budete chtít, program se nezpomalí!!!