« Ogólny spis treści »    « Indeks »    « GW-BASIC   Przewodnik użytkownika »

 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:

      80592 B zamiast 194309 B, w zwiazku z czym krócej się ładuje. Ma to znaczenie, jeżeli interpreter wraz z programem *.bas umieściliśmy na dyskietce i z niej go uruchamiamy. Czasami posłużenie się dyskietką może być wygodniejsze od wędrówek po drzewie folderów na twardym dysku.

- obowiązkowe numerowanie linii:

      uważane za uciążliwe, może być jednak pomocne w początkach nauki programowania. Uciążliwość można zmniejszyć, posługując się komendą autonumeracji AUTO.
      Numerowanie linii uwydatnia "liniowość" pisanego programu, jego bieg od-poczatku-do-końca. Przy dłuższych programach ułatwia orientację w napisanym kodzie. Przy bardzo długich, i przy gruntownych przeróbkach programu, może przeszkadzać i wtedy korzystniejszy będzie QBasic.

- wspólny ekran dla edycji kodu i efektów działania programu:

      Najbardziej przydatny, jeśli wykorzystujemy tryb kalkulatorowy do testów lub podręcznych obliczeń (w QB ten tryb jest znacznie mniej wygodny). Także w początkach programowania korzystne jest widzieć równocześnie kod i wyniki jego działania. Zwłaszcza przy eksperymentach typu "co mi wyjdzie, gdy...", które są sporą frajdą i niezłą szkołą.

      Doświadczenie uzyskane przy próbach programowania w GW-Basicu można w całości przenieść na QBasic.

Pomoc do GW-Basica

      Ogromne 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 , ; ta druga stanowi odsyłacz do informacji umieszczonych w tym pliku. Warto też zwrócić uwagę na rozdział o różnicach między wersjami Basica. Cechy języka BASICA odnoszą się również do GW-Basica. Tu natomiast znajdą się rzeczy specyficzne tylko dla GW-Basica, a w szczególności opis interfejsu i komendy edycyjne.

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.



Interfejs GW-Basica

(Fragmenty w kolorze navy pochodzą z książki Tomasza Kopacza
"Basic na IBM PC", ZNI "MIKOM", W-wa 1992, str.56-58.)


Ekran GW-BASIC-a


      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 PRINT
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





  CALL


 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 

↑ Skorowidz

  Zamiast SELECT CASE


   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.

↑ Skorowidz

  Długie liczby całkowite (long integer)


 Nie istnieją w GW-Basicu.

↑ Skorowidz

  Pętle


  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 .   .   .


↑ Skorowidz

  IF...THEN...ELSE


   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


↑ Skorowidz

  Zamiana liter dużych na małe i odwrotnie


   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ę.

↑ Skorowidz

  Usuwanie wiodących i końcowych spacji


 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


↑ Skorowidz

  Zamiast SLEEP


    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

↑ Skorowidz
D.A.M. Deger (Damian Gawrych), sierpień - październik 2006
http://deger.republika.pl