| |
Odmienności GW-Basic-a
Dlaczego jeszcze GW-Basic? Pomoc do GW-Basica
Interfejs GW-Basica
Komendy edycyjne: AUTO RENUM LIST LLIST LOAD
SAVE RUN CONT EDIT DELETE NEW
Klawisze skrótów poleceń
Polecenia CALL DEF FN DIM
Zamiast SELECT CASE Pętle IF...THEN...ELSE
Zamiana liter dużych na małe i odwrotnie
Usuwanie wiodących i końcowych spacji Zamiast SLEEP
| |
Dlaczego jeszcze GW-Basic?GW-Basic, aczkolwiek nieco uboższy (i starszy) od QBasica, ma cechy, które w pewnych sytuacjach mogą go czynić bardziej przydatnym, niż QB: - rozmiar: - obowiązkowe numerowanie linii: - wspólny ekran dla edycji kodu i efektów działania programu: Doświadczenie uzyskane przy próbach programowania w GW-Basicu można w całości przenieść na QBasic. |
Pomoc do GW-BasicaOgromne podobieństwo GW-Basica i QBasica (QBasic jest jakby rozszerzeniem poprzednika) uzasadnia umieszczenie pomocy do GW jako dodatku do Pomocy QB. QBasic bywa jeszcze tu i ówdzie nauczany, GW-Basic pozostaje już tylko językiem amatorskim. Aczkolwiek w Sieci istnieje na jego temat (w jęz. angielskim) całkiem sporo i jest on nadal używany. (Zob. np. stronę http://us.geocities.com/ kindlyrat/GWBASIC.html.)
W przekładzie Pomocy do QB elementy nie występujące lub odmienne
w GW-Basicu zostały oznaczone ikonkami W trakcie opracowywania okazało się, że GW-BASIC User's Guide zawiera szereg informacji przydatnych także w QB. Dlatego jego przekład zamieszczam również, jako GW-Basic - Przewodnik użytkownika. Anglojęzyczny oryginał jest dostępny 'on line' pod adresem http://www.antonis.de/qbebooks/gwbasman/index.html, a wersja ZIP - http://www.geocities.com/KindlyRat/gw-man.zip. |

Po załadowaniu GW-Basica na ekranie ukazuje się informacja o wersji, napis OK, a wiersz niżej miga kursor. Każde polecenie, wpisane z klawiatury, po naciśnięciu ENTER zostanie od razu wykonane (tryb bezpośredni). Można napisać ? 10*10 i od razu zobaczymy wynik - 100.
Chcąc wprowadzić linię programu do pamięci, należy poprzedzić ją numerem. Maksymalna długość linii to 255 znaków. Numer może być co najwyżej pięciocyfrowy.
Niewygodnie jest wprowadzać za każdym razem kolejne numery linii. Automatyzacji tej czynności służy polecenie AUTO [n][,krok]. Powoduje ono każdorazowe wyprowadzenie (po naciśnięciu ENTER oczywiście) kolejnych numerów linii n, n+krok,n+krok+krok,... Po wyświetleniu numeru linii
można wpisać linię i naciśnięciem ENTER wprowadzić ją do pamięci. Po naciśnieciu ENTER ukazuje się kolejna linia itd. Proces ten przerywamy, naciskając CTRL-C lub CTRL-Break. (Uwaga! Linia, podczas edycji której został naciśnięty któryś z tych klawiszy, nie zostanie zapamiętana!)A oto inne polecenia edycji programu:
(Odsyłacze prowadzą do przekładu monografii z GW-BASIC User's Reference)
RENUM [n][,start][,krok]
Przenumerowuje linie programu (ze zmianami w GOTO, GOSUB itp.). start
to numer linii, od której renumeracja się rozpocznie. Po przenumerowaniu linia ta będzie
miała numer n, kolejna n+krok itd.
LIST [nr.początkowy wyświetlanych linii][-nr.końcowy][,plik]
Listuje (wyświetla) kod programu. {W GW-Basicu nie ma
(jak np. w Atari Basic) kombinacji klawiszy wstrzymującej i podejmującej znowu listing,
nie można też (jak w QBasic) użyć PgDn i PgUp. Stąd przeglądanie kodu jest dość mozolne.
Trzeba orientować się, co się mieści w danym zakresie linii.}
LIST bez parametrów wyświetla cały kod, który przy dłuższych programach "przelatuje" przez
ekran i w efekcie widać tylko ostatnie 24 linie.
LIST -100 listuje od początku do linii 100 włącznie;
LIST 50-100 listuje zakres 50-100;
LIST 100- listuje od linii 100 do końca.
LIST, nazwa_pliku wyśle listing do pliku tekstowego.
(Inny sposób na zachowanie kodu w formacie tekstowym:
SAVE"nazwa_pliku",A. Plik będzie miał domyślne
rozszerzenie .BAS.)
LLIST listuje program na drukarkę (parametry jak w LIST).
LOAD plik[,r] Wprowadza do pamięci (i ew. uruchamia) program z dysku. Zob. szczegółowy opis.
SAVE plik[,a]
SAVE plik[,p]
Zapisuje kod programu. Opcja a zapisuje w formacie ASCII (czytelnym dla człowieka i QBasica); opcja p zapisuje w formacie binarnym zakodowanym.Zob. szczegółowy opis.
RUN [m][,r]
RUN plik[,r]
Uruchamia program [od linii m] lub ładuje z dysku plik i uruchamia go. Opcja r pozostawia otwarte wcześniej pliki danych. Zob. szczegółowy opis.
CONT Wznawia wykonywanie przerwanego programu. Zob. szczegółowy opis.
EDIT ./m Edycja bieżącej/m-tej linii programu.
(Podobny efekt daje użycie polecenia LIST dla wskazania, która linia
ma być bieżącą.)
DELETE [od][-do] Kasuje wskazany fragment programu. Zob. szczegółowy opis.
NEW Kasuje cały program w pamięci i czyści zmienne. Zob. szczegółowy opis.
Klawiszom funkcyjnym F1 - F10 przypisane są najczęściej (zdaniem
Microsoft'u) używane polecenia:
F1 LIST F2 RUN F3 LOAD" F4 SAVE"
F5 CONT F6 ,"LPT1:" F7 TRON F8 TROFF
F9 KEY F10 SCREEN 0,0,0
Lista tych klawiszy jest wyświetlana w 25. linii ekranu; można ją "wygasić" poleceniem KEY OFF.
Oprócz tego polecenie PRINT ma skrót ? oraz (podobnie jak w ZX Spectrum), 22 inne polecenia można przywołać na ekran, używając kombinacji z Alt:
| Alt+ | polecenie: | Alt+ | polecenie: |
| A | AUTO | M | MOTOR |
| B | BSAVE | N | NEXT |
| C | COLOR | O | OPEN |
| D | DELETE | P | |
| E | ELSE | R | RUN |
| F | FOR | S | SCREEN |
| G | GOTO | T | THEN |
| H | HEX$ | U | USING |
| I | INPUT | V | VAL |
| K | KEY | W | WIDTH |
| L | LOCATE | X | XOR |
| |
W GW-Basicu nie istnieją procedury SUB. Komenda CALL służy tam
do wywoływania procedur w języku maszynowym (jak CALL ABSOLUTE w QB):
CALL numvar[(variables)]
gdzie: numvar - punkt startowy procedury maszynowej w pamięci;
variables - zmienne lub stałe, oddzielone przecinkami i umieszczone
w nawiasach, które mają być przekazane do procedury.
Zobacz też: Różnice w porównaniu z BASICA
Ta pożyteczna przy wielokrotnych wyborach struktura nie istnieje
w GW-Basicu. Zastąpić ją można tylko "baterią" wielu poleceń IF...THEN. Np.
100 IF A = 10 OR A = 12 THEN GOSUB 500
110 IF A > 12 AND A < 20 THEN GOSUB 550
. . . . .
Jeżeli poleceń do wykonania nie jest dużo i zmieszczą się w reszcie z 255
znaków, można je upakować w jednej linii po THEN, oddzielając dwukropkami.
Nie istnieją w GW-Basicu.
Jedyną "gotową" pętlą strukturalną GW-Basica jest WHILE...WEND. Natomiast pozostałe kombinacje z badaniem warunku na początku czy na końcu pętli, a także wyjście ze środka pętli (odpowiednik EXIT DO w QB) osiąga się przez konstruowanie pętli bez końca przy pomocy IF...THEN i GOTO. Np. 100 IF A > 50 THEN GOTO 200 . . . . 130 IF A <= 50 AND A > 25 THEN 220 . . . . 190 IF A <= 25 THEN 100 200 . . .
W GW-Basicu nie istnieje blokowa forma IF...THEN...ELSE, a jedynie jej
wersja liniowa. Natomiat na tyle, na ile zmieści się w linii logicznej
(255 znaków), można, podobnie jak w QB, umieszczać więcej niż jedno
polecenie (oddzielone dwukropkiem) zarówno po THEN, jak i po ELSE:
IF ... THEN polecenie1 : polecenie n ELSE polecenie 1: polecenie n
Zamiana taka bodaj najczęściej jest potrzebna przy różnych menu
"klawiszowych", aby uniezależnić się od stanu Caps Lock. Tu zamiast UCASE$
możemy użyć konstrukcji
IF KLAW$ = "A" OR KLAW$ = "a" THEN ...
Jeśli natomiast potrzebna jest prawdziwa symulacja UCASE$ i LCASE$, można
wykorzystać fakt, że kody ASCII małych liter są przesunięte o 32 względem
liter dużych. Wtedy sprawdzając kod każdej po kolei litery z łańcucha,
jeśli będzie się on zawierał w przedziale 65-90 (duże litery), i dodając
do niego 32, otrzymamy kod odpowiedniej litery małej i wstawimy go do
łańcucha w to samo miejsce. Dla zamiany odwrotnej (małe na duże) bierzemy
przedział 97-122 i odejmujemy 32.
A oto przykładowy program:
100 A$=" Ala ma kota Mamrota"
110 PRINT A$
120 FOR I=1 TO LEN(A$)
130 AS=ASC(MID$(A$,I,1))
140 IF AS>64 AND AS <91 THEN MID$(A$,I,1)=CHR$(AS+32)
150 NEXT I
160 PRINT A$
RUN
Ala ma kota Mamrota
ala ma kota mamrota
Ok
Metoda z przesunięciem o 32 nie zadziała przy polskich znakach, ale
sprawdziłem doświadczalnie, że UCASE$ i LCASE$ też tu nie działa - kody
powyżej 128 pozostawia niezmienione. Natomiast można stablicować kody
polskich znaków i użyć je do zamiany w oparciu o taką tablicę.
Usuwanie wiodących spacji realizuje następująca procedura:
100 A$=" abcde"
110 PRINT A$
120 FOR I=1 TO LEN(A$)
130 IF ASC(A$)<>32 THEN GOTO 160
140 A$=MID$(A$,2)
150 NEXT I
160 PRINT A$
RUN
abcde
abcde
Ok
zaś spacje kończące:
100 A$="abcde "
110 PRINT A$;"-"
120 FOR I=1 TO LEN(A$)
130 IF ASC(MID$(A$,LEN(A$)))<>32 THEN 160
140 A$=LEFT$(A$,LEN(A$)-1)
150 NEXT I
160 PRINT A$;"-"
RUN
abcde -
abcde-
Ok
Polecenie SLEEP zastąpić można procedurą wykorzystującą właściwości
funkcji TIMER. Jest to sposób uniwersalny - można zaprogramować ją na
ułamkowe części sekundy (a nie tylko na pełne sekundy, jak SLEEP)
i nie zależy od szybkości procesora (co było wadą rozwiązania opartego
na pętli opóźniającej z użyciem FOR...NEXT).
Z amatorskich pomiarów wynika, że dokładność funkcji TIMER (różnica
między dwoma kolejnymi odczytami) wynosi około 0,06 sekundy. (1/18 sekundy;
w sekundzie jest 18,2 cykli zegarowych.)
A oto procedura ustawiona na opóźnienie 1 sekundy (składnik po T1 w linii
110):
100 T1=TIMER
110 T2=TIMER: IF T2< T1+1 THEN 110