32. Hľadanie v texte a klávesy: INSTR, UINSTR, INKEY$, GET
Na čo to je
Dve veci, ktoré v Atari BASICu chýbali: zistiť, či a kde sa v texte nachádza iný text, a prečítať kláves bez čakania a bez otvárania kanála.
Ako sa to píše
| Zápis | Čo vráti |
|---|---|
INSTR(A$,B$) | miesto, kde sa v A$ prvýkrát začína B$; 0, keď tam nie je |
INSTR(A$,B$,N) | to isté, ale hľadá až od N-tého znaku |
UINSTR(A$,B$) | ako INSTR, ale nerozlišuje veľké a malé písmená |
INKEY$ | znak práve stlačeného klávesu; prázdny text, keď nie je stlačené nič |
GET K | počká na kláves a jeho kód ATASCII uloží do K |
Celý program
Súbor examples/instr.tbas:
10 REM INSTR and UINSTR: looking for a text in a text
20 DIM A$(40)
30 A$="The quick brown fox"
40 PRINT "quick is at ";INSTR(A$,"quick")
50 PRINT "QUICK is at ";INSTR(A$,"QUICK")
60 PRINT "QUICK without case is at ";UINSTR(A$,"QUICK")
70 PRINT "The first o is at ";INSTR(A$,"o")
80 PRINT "The next o is at ";INSTR(A$,"o",14)
90 PRINT "cat is at ";INSTR(A$,"cat")
100 REM Cut the text into words
110 P=1
120 REPEAT
130 S=INSTR(A$," ",P)
140 IF S=0 THEN S=LEN(A$)+1
150 PRINT A$(P,S-1)
160 P=S+1
170 UNTIL P>LEN(A$)Preklad a spustenie
Basic26 instr.tbas --simČo uvidíš
quick is at 5
QUICK is at 0
QUICK without case is at 5
The first o is at 13
The next o is at 18
cat is at 0
The
quick
brown
foxAko to funguje
- Riadok 40: slovo
quicksa začína na piatom znaku. - Riadok 50: veľkými písmenami tam nie je –
INSTRporovnáva presne. Výsledok 0 znamená „nenašlo sa“, a keďže nula je v podmienke „neplatí“, dá sa písať rovnoIF INSTR(A$,"fox") THEN …. - Riadok 60:
UINSTRna veľkosti písmen nehľadí. - Riadok 80: tretie číslo hovorí, odkiaľ hľadať. Prvé
oje na mieste 13; hľadanie od 14 nájde ďalšie. - Riadky 110 až 170: rozdelenie vety na slová – základ každej textovej hry.
Pje začiatok slova,Smiesto najbližšej medzery za ním. Keď už medzera nie je, slovo siaha po koniec textu.
Klávesy
Súbor examples/keys.tbas je pre emulátor:
10 REM INKEY$ and GET: keys without RETURN
20 DIM K$(1)
30 PRINT "Press keys, Q ends"
40 DO
50 K$=INKEY$
60 IF K$<>""
70 PRINT K$;" has the code ";ASC(K$)
80 IF K$="Q" THEN EXIT
90 ENDIF
100 LOOP
110 PRINT "One more key to finish"
120 GET K
130 PRINT "It was ";CHR$(K)Basic26 keys.tbas --run- Riadok 50:
INKEY$nečaká. Keď nie je stlačené nič, vráti prázdny text a program beží ďalej – slučka sa točí a môže medzitým robiť iné veci (hýbať príšerami, počítať čas). To je rozdiel oprotiINPUT. - Riadok 120:
GET Kbez kanála naopak čaká, kým kláves príde. Hodí sa na „stlač kláves a pokračujeme“. Vráti kód ATASCII, nie číslo klávesu akoPEEK(764).
V Atari BASICu bolo na to isté treba otvoriť kanál na zariadenie K: (kapitola 24).
Opačným smerom funguje PUT bez kanála: PUT 65,66 vypíše na obrazovku znaky s kódmi 65 a 66, teda AB.
Časté chyby
| Čo sa stalo | Čo sa stane |
|---|---|
| hľadané slovo má iné veľké a malé písmená | INSTR vráti 0; použi UINSTR |
IF INSTR(…)=1 namiesto <>0 | platí, len keď je text na samom začiatku |
INKEY$ do reťazca bez DIM | ERROR- 9 |
slučka s INKEY$ nič iné nerobí | funguje, ale GET je na čakanie jednoduchší |
GET K v simulátore | ERROR- 136 – klávesnica tam nie je |
Vyskúšaj si
- Spýtaj sa na vetu a slovo a vypíš, či veta slovo obsahuje.
- Spočítaj, koľkokrát sa vo vete nachádza písmeno
e(INSTRs tretím číslom v slučke). - Uprav
joystick.abasz kapitoly 22 na ovládanie klávesmiW,A,S,DcezINKEY$.
Zhrnutie
INSTR(A$,B$)vráti miestoB$vA$, alebo 0;UINSTRnerozlišuje veľkosť písmen.- Tretie číslo určuje, odkiaľ hľadať.
INKEY$vráti kláves bez čakania,GET Knaň počká.
Späť: 31. Celé čísla a bity · Ďalej: 33. Čas