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:
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í!!!