Original in English  
Author's home page

QBASIC Programowanie dla dzieciaków

by Ted Felix

Przekład: D.A.M.Deger (Damian Gawrych), listopad 2006 - styczeń 2007
aktualizacja: kwiecień 2007



Wprowadzenie
Wprowadzenie dla rodziców i nauczycieli
1 - Zaczynamy
      Wejście do DOS-a • Start QBASIC'a • Wyjście z powrotem
2 - PRINT
      Ekran QBASIC'a • Edytor QBASICa • Twój pierwszy program • Uruchomienie twojego programu. • PRINT
3 - CLS
4 - DO...LOOP
5 - INPUT
      Co jest w "Nazwa$"? • INPUT • Zmienne • PRINT i zmienne
6 - IF...THEN
7 - Liczby
      Zmienne i matematyka • Wyrażenia
8 - Zapisywanie na dysk
      Zapisywanie na dyskietkę • Ładowanie z dyskietki • Zapisywanie na twardy dysk • Tworzenie własnego podkatalogu • Tworzenie folderu w Windows 95 • Zapisywanie do katalogu • Ładowanie z twardego dysku
9 - SELECT CASE
10 - Równania
11 - Liczby losowe
        RANDOMIZE TIMER • Rzucamy kostką • PRINT jako taki
12 - Wyrocznia
13 - DO...WHILE
14 - OR i LEFT$
15 - COLOR
16 - FOR ... NEXT
17 - Dźwięk
18 - LOCATE
19 - WIDTH
20 - CHR$
21 - Grafika
        SCREEN • DRAW • LINE • Prostokąt • CIRCLE • PAINT
22 - INKEY$
22.5 - Funkcje łańcuchowe
        Konkatenacja • LEFT$() i RIGHT$() • MID$() • LCASE$() i UCASE$() • STRING$() i SPACE$() • LEN() • CHR$() i ASC() • INSTR()
23 - Komentarze i stałe
24 - Sub-Procedury (SUBs)
        Argumenty • Zakres • Dane globalne • Programowanie zorientowane obiektowo • STATIC • Funkcje • DECLARE
25 - Struktury danych
        Typy wbudowane • Zmienne pojedynczej precyzji • Zmienne łańcuchowe • Zmienne całkowitoliczbowe • Długie liczby całkowite • Zmienne podwójnej precyzji • Tablice • TYPE • Baza danych
25.5 - Konwersja typu
        STR$() i VAL()
25.75 - PRINT USING
25.9 - DATA i READ
        RESTORE • Ładowanie bazy danych
26 - Odczytywanie i zapisywanie plików
        Zapisywanie do pliku • OPEN, WRITE i CLOSE • Odczytywanie z pliku • Prowadzenie logu • Obsługa błędów plikowych • Swobodny I/O
27 - Przykładowe programy
Dodatek A - Znajdowanie i instalowanie QBASIC-a
        W Internecie • Windows 95 • DOS czy Windows? • Tryb MS-DOS • Eksplorator Windows • Odmienności Windows 98 SE i Windows XP
Książki o QBASICu
Słowniczek angielsko-polski




Wprowadzenie

Prawdopodobnie używacie komputerów do gier i do pisania wypracowań szkolnych. Znacznie bardziej zabawne jest tworzyć własne gry dla komputera. Ten podręcznik pomoże wam zacząć, używając QBASIC. QBASIC jest językiem programowania. Przy pomocy takiego języka można powiedzieć komputerowi, co chcesz, aby on zrobił. To całkiem tak, jak dawać komuś wskazówki, jak trafić do domu. Komputer wykonuje krok po kroku i robi dokładnie to, co mu powiedziałeś. Programując komputer, możesz rozwiązać problemy matematyczne, tworzyć obrazy i muzykę, i nawet tworzyć nowe gry. Wszystko to przed tobą.

Najlepszym sposobem startu z tym podręcznikiem jest wpisać do komputera kilka małych programów, które znajdziesz w każdym z rozdziałów. Możesz zechcieć zacząć najpierw bezpośrednio od Rozdziału 1. Dorośli mogą ci pomóc przebrnąć przez to szybko. Potem zmieniaj w programach to, co chcesz, aby one robiły. Wkrótce będziesz pisać swoje własne programy.


Wprowadzenie dla rodziców i nauczycieli

Dzieci kochają komputery. Lubią także tworzyć oraz mieć kontrolę nad otaczającym ich światem. Komputer będzie robił, cokolwiek mu się powie. Może to zrazu nie wyglądać w ten sposób, ale to prawda.

Gdy byłem dzieckiem, wszyscy mieliśmy "stary BASIC". Miał on numerowane linie i nie uczył nawyku dobrego strukturalnego programowania. QBASIC jest narzędziem znacznie lepszym. Z informacją zdobytą z tego podrecznika można sięgnąć po bardziej zaawansowaną książkę o QBASIC (jeśli taką znajdziesz). Po nabraniu wprawy w QBASICu można sięgnąć po potężniejsze języki, jak Visual Basic, Java, C i ewentualnie C++. Sugerowałbym następujacy przebieg nauki:

Oczywiście, możesz określić, kiedy dziecko jest gotowe na przejście z jednego języka do drugiego. Moją regułą jest, że QBASIC powinien być wprowadzony w punkcie gdy dzieci mogą się same uczyć z tego podręcznika (wiek 10 lub 11 lat). Wówczas pozwól im i opanuj to sam. Daje to im poczucie ogromnego osiągniecia. Gdy zobaczysz, że osiągają granice możliwości języka, wprowadź ich w inne języki. Przeskok z QBASICa do Visual BASICa mógłby być zrobiony, gdy stanie się oczywiste, że programy twojego dziecka odniosą korzyść z graficznego interfejsu użytkownika (GUI). Od ciebie zależy określenie, czy są już na to gotowe.

Jeżeli jesteś nauczycielem szkoły podstawowej zainteresowanym nauczaniem programowania lub tworzenia oprogramowania dla dzieci, sugerowałbym rozpoczęcie od Logo na poziomie trzeciej lub czwartej klasy. Następnie przejście do QBasic'a dla czwartej, piątej, szóstej itd.... Nauczanie dużej liczby uczniów zawsze stanowi wyzwanie, ponieważ każdy ma inne zdolności. Programowanie komputera doskonale pasuje do programu nauczania matematyki, bo pomaga uczniom uświadamiać sobie liczby i to, jak one "działają". Z powodu uczenia się programowania w Basic'u zrozumiałem w siódmej klasie trygonometrię. Zrobiłem to, ponieważ rodzaj programów, które pisałem, wymagał zrozumienia trygonometrii i stosowania jej. Co może być lepszą motywacją do nauki? Powyżej szóstej klasy, przypuszczam, można wprowadzić Visual BASIC i kontynuować poprzez Java/C# aż do C/C++ na poziomie szkoły średniej.

W wieku lat 11 uczyłem się z książki bardzo podobnej w stylu do tego podręcznika. Był to Podręcznik Użytkownika TRS-80 i pojawił się z moim pierwszym komputerem osobistym - Radio Shack TRS-80. Od tamtej pory nie przestaję programować. Mam nadzieję, że ten podręcznik będzie miał taki sam skutek dla twoich dzieci (lub być może nawet dla ciebie).

Please email me with any comments or suggestions to improve this book. My email address:

You can find more information on my Computer Science for Kids page:

http://tedfelix.com/cs4kids - Computer Science for Kids

And in case you are looking at a mirror site, the latest version of this book is always kept here:

http://tedfelix.com/qbasic - QBASIC Programming for Kids

Życzę tobie i twoim dzieciom mnóstwa uciechy.


Od tłumacza:   Zawsze za wielką zaletę Basica uważałem jego podobieństwo do języka naturalnego, graniczące prawie z rozmową z maszyną. Teraz, zestawiając na użytek tego przekładu mini-słowniczek objaśniający źródosłów poleceń Basica, dostrzegłem po raz pierwszy, że jest tego DUŻO i dla nieotrzaskanych w angielskim może być to podobne do uczenia się jakiegokolwiek obcego języka, dla nich więc ginie podstawowy atut wszystkich Basic'ów. Pozostaje nadzieja, że przynajmniej wśrod dziatwy znajomość angielskiego staje się coraz bardziej powszechna...


Rozdział 1 - Zaczynamy

Wejście do DOS-a

Aby uruchomić QBASIC, trzeba dostać się do DOS-a.

Jeśli używasz Windows 3.1, trzeba znaleźć "Grupę główną" i odszukać ikonę nazwaną "MS-DOS". Podwójne kliknięcie na niej daje znak zachęty "C:\WINDOWS>_" w czarnym oknie z jasnym tekstem.

W Windows 95 kliknij "Start", następnie "Programy", następnie "Tryb MS-DOS".

W Windows 98 i Windows ME postępowanie jest to samo, co i w Windows 95.

W Windows NT 4, jestem przekonany, że to się nazywało "wiersz polecenia". Wypróbuj kroki opisane poniżej dla Windows 2000.

W Windows 2000 nazywa się to "Wiersz polecenia" i można go znaleźć klikając Start, następnie Programy, następnie Akcesoria i wreszcie Wiersz polecenia.

W Windows XP też nazywa się to "Wiersz polecenia" i też można się tam dostać, klikając Start, następnie Programy, następnie Akcesoria i Wiersz polecenia.

Otrzymasz czarne okno z migającym "C:\WINDOWS>_" kursorem.

Jesteś teraz gotowy do następnego kroku.

Start QBASIC'a

QBASICa może nie być w twoim komputerze. Nie martw się, Dodatek A pokaże ci, jak go dostać. Za kursorem "C:\WINDOWS>_" spróbuj wpisać:

     qbasic
i naciśnij klawisz <Enter>.

Jeśli dostaniesz niebieski ekran z czymś na kształt "Survival Guide", to uruchomiłeś QBASIC!

Jeżeli zamiast tego dostaniesz komunikat w rodzaju "Złe polecenie lub nazwa pliku",

to trzeba sprawdzic w Dodatku A, jak zainstalować QBASIC na twojej maszynie. Nie martw się, będziemy tam na ciebie czekać.

Survival Guide?

"Podręcznik Przetrwania"? Nie będziemy go w tej chwili używać (zresztą jest po angielsku - przyp. tłum.) więc naciśnij klawisz <Esc> (escape), aby uzyskać duży pusty niebieski ekran.

Jesteśmy teraz gotowi do programowania.

Wyjście z powrotem

Jeśli potrzebujesz opuścić QBASIC, możesz kliknąć na "File" w menu QBASICa i następnie na "Exit", aby dostać się z powrotem do DOS-a.

Za kursorem "C:\WINDOWS>_" wpisz:

     exit
i naciśnij klawisz <Enter>, aby pozbyć się okna DOS.




Rozdział 2 - PRINT

Idziemy dalej

Zakładam, że bedziesz zapoznawać się z QBasic'iem od jego początku. Nie byłoby dobrze, gdyby było inaczej. A więc włącz komputer i miej przed sobą niebieski ekran QBASICa. Idź dalej i naciśnij klawisz <Esc>, aby zamknąć okno powitalne ("clear this dialog box").

Ekran QBASIC'a

Zanim zaczniemy, rzuć okiem na ekran QBASIC'a. U góry znajduje się menu, które ma następujące zakładki: File, Edit, View, Search, Run, Debug, Options i Help.

Klikniecie na którąkolwiek z nich rozwija listę z dodatkowym wyborem.

Tuż pod menu jest słowo "Untitled". To znaczy, że nie nadaliśmy nazwy bieżącemu programowi. To się zmieni, gdy nauczymy się zapisywac programy na dysk. Duży niebieski obszar z migającym kursorem _ ) to miejsce, gdzie możemy wprowadzać nasze programy.

To są najważniejsze obszary, które dziś trzeba poznać. Nauczymy się więcej o reszcie z ekranu QBASIC'a, gdy dojdziemy dalej.

Edytor QBASICa

Jeśli używasz komputer w szkole lub do pisania wypracowań, zauważysz, że większość klawiszy edycyjnych (<Backspace>, <Delete>, <Insert>...) działa tak, jak zawsze. Na wypadek, gdybyś nie używał ich wcześniej, oto ich lista:

Twój pierwszy program

Z migającym kursorem( _ ) w lewym górnym rogu ekranu, wpisz to:

     PRINT "Witaj w QBASIC.  Twoje zyczenie jest dla mnie rozkazem."
Sprawdź, czy wpisałeś dokładnie tak. Cudzysłowy (") są bardzo ważne. Jeśli zrobiłeś jakieś błędy, użyj klawisz <Backspace> do poprawienia ich.

Uruchomienie twojego programu.

Pięknie, ale co to ma robić? Trzeba to uruchomić, aby się przekonać. Znajdź słowo "Run" w menu QBASICa u góry ekranu. Kliknij na nim. Zobaczysz teraz menu z listą do wyboru (Start, Restart i Continue). Kliknij na Start, aby uruchomić twój program. Możesz się nieco rozejrzeć po ekranie, ale powinieneś odnaleźć twój komunikat:

     C:\WINDOWS> qbasic
     Witaj w QBASIC.  Twoje zyczenie jest dla mnie rozkazem.

PRINT

PRINT drukuje różne rzeczy na ekranie. Nie zapomnij umieszczać to, co chcesz wypisać, w podwójnych cudzysłowach (").

Press any key to continue?

U spodu ekranu zobaczysz komunikat "Press any key to continue" ("Naciśnij jakiś klawisz, aby kontynuować"). Naciśnij <Enter> aby dostać się z powrotem do QBASICa. To jest sposób QBASIC'a, aby dać ci dość czasu, żeby obejrzeć, co twój program zrobił.

Jako wygodny skrót, użyj ? zamiast PRINT. Wypróbuj to. Naciśnij <Enter>, aby zacząć pisać w nowej linii. Tym razem wpisz:

     ? "Programowanie jest zabawne." 
i znowu naciśnij <Enter>.

Czyż to nie przyjemne? ? stał się słowem PRINT. To powinno zaoszczędzić nam mnóstwo pisania.

Możesz spróbować uruchomić program po raz drugi (pamiętasz? Kliknij na Run, potem na Start w menu.) Powinieneś zobaczyć coś takiego:

C:\WINDOWS> qbasic
Witaj w QBASIC.  Twoje zyczenie jest dla mnie rozkazem.
Witaj w QBASIC.  Twoje zyczenie jest dla mnie rozkazem.
Programowanie jest zabawne. 

Opanowane:


Rozdział 3 - CLS

Prawdopodobnie trochę ciężko było znaleźć na ekranie twoje komunikaty z ostatniego programu. Czy nie byłoby przyjemnie móc wyczyścić wszystkie te rzeczy z ekranu? Rozwiązaniem jest tu "CLS", które pochodzi od CLear Screen ("Wyczyść ekran"). Będziesz potrzebował wstawiać CLS na samej górze twojego programu, aby wyczyścić ekran przed wydrukowaniem czegokolwiek.

Wstawianie nowej linii u góry.

Aby uczynić CLS pierwszą linią twojego programu, wykonaj następujące kroki:

Teraz twój program powinien wyglądać jak to:

     CLS
     PRINT "Witaj w QBASIC.  Twoje zyczenie jest dla mnie rozkazem."
     PRINT "Programowanie jest zabawne." 

Uruchom to. Pamiętasz - klik na Run i potem na Start z menu QBASICa. Możesz także uruchomić program przez naciśnięcie klawisza <Shift> i przytrzymanie go wciśniętym podczas naciskania <F5> (to oznacza Shift+F5 w menu). Inny wygodny skrót.

Teraz jest znacznie lepiej. Na ekranie są tylko te komunikaty, które powinny tam być.

Opanowane:


Rozdział 4 - DO...LOOP

Zacznijmy nowy program. Aby pozbyć się starego programu, kliknij na "File" w menu QBASICa - zobaczysz menu File z New, Open..., Save i innymi. Kliknij na "New". QBASIC powie ci teraz, że twój bieżący program nie jest jeszcze zapisany i zapyta czy chcesz "Save it now?" (Zapisać go teraz?). Nie zapisuj go. Zawsze możesz wpisać go znowu. Kliknij na < No >. Jak zapisywać programy na dysk, nauczymy się w rozdziale 8.

Teraz powinieneś miec czysty niebieski ekran. Wpisz ten program:

     DO
       PRINT "Tu jest Ted ";
     LOOP

Sprawdź, czy wstawiłeś średnik (;) na końcu linii z PRINT i spację między słowem "Ted" a ostatnim cudzysłowem. Nie musisz używac mojego imienia, wstaw zamiast niego swoje ("Tu jest Jacek", lub cokolwiek). Teraz uruchom to.

DO...LOOP

DO i LOOP będą wykonywać wszystko, cokolwiek jest między DO i LOOP jeszcze raz i jeszcze...

Gdzie jest hamulec?!

Ok, ładnie. ALE JAK TO ZATRZYMAĆ!? Naciśnij klawisz <Ctrl> (Control) i trzymaj go wciśniety naciskając klawisz <Pause>. Klawisz <Pause> jest zwykle u góry klawiatury i zawsze z prawej strony. Nazywa się to "naciskaniem klawisza <Break>". Nie martw się, to naprawdę nie połamie twojego programu, a tylko zatrzyma go i zawróci cię do QBASICa. Być może ten klawisz powinien się nazywać "brake". (Brake - "hamulec", wymawia się tak samo jak break - "łamać" - [brejk]. Przyp. tłum.)

Na klawiaturach laptopów klawisz Break może być trochę trudniejszy do znalezienia. Czasami trzeba nacisnąć klawisz "Fn" i następnie klawisz, który robi przerwę. Czasem jest on oznaczony kolorem, aby pomóc go znaleźć. Dowiesz się, gdzie on jest (doświadczalnie), gdy zatrzymasz program i powróci edytor.

Staranność się liczy

Zauważ, że PRINT ma przed sobą dwie spacje. Nazywa się to "wcięciem" i czyni program łatwiejszym do czytania. Możesz bardziej wyraźnie zobaczyć początek i koniec DO...LOOP. QBASIC nie troszczy się o wcięcia, robią to tylko ludzie. Jest ważne, aby twój program wyglądał elegancko, ponieważ mogą go czytać inne osoby.

Opanowane:


Rozdział 5 - INPUT

Dotąd nasze programy tylko mówiły do nas. Napiszmy taki, który będzie słuchał. Pozbądź się poprzedniego programu, klikająć File i potem New w menu QBASIC'a. Kliknij na < No >, gdy zapyta, czy chcesz teraz zapisać program na dysk. Wypróbuj to:

     CLS
     INPUT "Wpisz swoje imie: ", Nazwa$
     PRINT "Czesc, "; Nazwa$; ".  Jak sie masz dzisiaj?"

Nie zapomnij o przecinku (,) pomiędzy "Wpisz swoje imie: " i Nazwa$. Uruchom to. Gdy zapyta, wpisz swoje imię i następnie neciśnij klawisz <Enter>

Co jest w "Nazwa$"?

"Nazwa$" nazywamy "zmienną". Bycie zmienną oznacza, że rzec może się zmieniać. Spróbuj uruchomić program znowu, ale tym razem wpisz imię kolegi (nie zapomnij o klawiszu <Enter>). Rzeczywiście, komunikat się zmienia.

INPUT

INPUT Nazwa$ pobiera to, co wpisujesz na klawiaturze i wstawia do zmiennej Nazwa$. PRINT Name$ wypisuje to, co jest w zmiennej Nazwa$.

Zmienne

Zmienne przechowują litery i liczby. Znak dolara ($) oznacza, że taka zmienne może przechowywać litery. Nazywa się ją "zmienną łańcuchową". Zmienne bez znaku dolara mogą przechowywać tylko liczby. Zobaczymy je później.

Możesz nazywać swoje zmienne, jak tylko zechcesz. Spróbuj wrócić do tego programu i zmienić każde "Nazwa$" na "Janek$". Co się zdarzy, gdy go uruchomisz?

Inny sposób myślenia o zmiennej to wyobrazić sobie małe wiadro z nazwą na nim. Namaluj na nim "Nazwa$". To jest nazwa wiadra (zmiennej). Teraz weź kawałek papieru, wypisz na nim swoje imię i wrzuć go do wyobrażonego wiadra. Teraz zmienna Nazwa$ ma w środku twoje imię. Zmienne komputerowe mogą zmieścić tylko jeden kawałek papieru (jedną wartość) na raz.

PRINT i zmienne

Gdy chcesz wydrukować (PRINT) to, co jest w zmiennej, opuść podwójne cudzysłowy (""). Ten program pokaże ci, jak to działa:

    CLS
    INPUT "Wpisz swoje imie: ", Nazwa$
    PRINT "Nazwa$"
    PRINT Nazwa$

Pierwsze polecenie PRINT drukuje na ekranie Nazwa$. Drugie polecenie PRINT drukuje imię, które wpisałeś.

Opanowane:


Rozdział 6 - IF...THEN

Zróbmy ten ostatni program nieco sprytniejszym. Chciałbym rozpoznawać intruzów grających w moje programy. Czy nie byłoby fajnie, gdyby komputer mógł rozpoznawać czyjeś imię i drukować dla niego specjalny komunikat? A może tak:

     CLS
     INPUT "Wpisz swoje imie: ", Imie$
     IF Imie$="Janek" THEN 
       PRINT "Idz sobie!"
     ELSE
       PRINT "Czesc, "; Name$; ".  Jak sie masz?"
     END IF

Możesz zmienić Imie$="Janek" na Imie$="Edek" lub kogokolwiek, kogo chcesz wygonić (jak brat lub siostra). Uruchom program i wpisz swoje imię (mam nadzieję, że to nie jest Janek). Powinieneś zobaczyć ten sam komunikat, co poprzednio. Teraz uruchom go jeszcze raz i spróbuj wpisywać "Janek" (lub "Edek", lub cokolwiek, na co wymieniłeś).

"Janek" to nie to samo, co "janek"

Jeśli program nie mówi właściwej osobie, aby sobie poszła, sprawdź, czy wpisałeś imię prawidłowo. W QBASIC-u "Janek" to nie to samo, co "janek", więc jeżeli nie wpisałeś imienia dużą literą, program nie będzie działał. Sprawdź, czy wprowadziłeś imię dokładnie tak, jak je wpisałeś w programie.

IF...THEN

Polecenie "IF..THEN..ELSE..END IF" w tym programie sprawdza, czy Imie$ zawiera w sobie "Janek". Jeśli tak, wtedy wykonuje polecenie PRINT po THEN. Gdy Imie$ nie jest "Janek", wykonuje się polecenie PRINT po ELSE. "END IF" (koniec IF) mówi QBASIC-owi, że to już koniec IF.

Warunki

Część IF...THEN - Imie$="Janek" nazywamy "warunkiem". Przy liczbach możesz także sprawdzać "większą niż" i "mniejszą niż":

     CLS
     INPUT "Wpisz liczbe: ", Liczba
     IF Liczba < 100 THEN 
       PRINT "Twoja liczba jest mniejsza 100"
     ELSE
       PRINT "Twoja liczba jest wieksza lub rowna 100"
     END IF

Jeżeli chcesz sprawdzić "większe niż", użyj "Liczba > 100". Równości działają, jak poprzednio, "Liczba = 100". Inną opcją jest "nie równa się", która może być zrobiona tak: "Liczba <> 100".

IF...THEN jest jedną z najpotężniejszych właściwości QBASIC-a. Używanie IF...THEN może uczynić twoje programy bardzo interesującymi. Pozwala ono programom podejmować decyzje i odpowiednio reagować.

Opanowane:




Rozdział 7 - Liczby

Komputery są bardzo dobre z matematyki. Pozwólmy komputerowi trochę jej dla nas odrobić. Oto prosty kalkulator mnożenia:

     CLS
     INPUT "Pierwsza liczba: ", A
     INPUT "Druga liczba: ", B
     PRINT "Wynikiem jest: "; A * B

Jeśli masz kłopot ze znalezieniem gwiazdki (*) na klawiaturze, jest ona zwykle nad liczbą 8. Uruchom to i wprowadź dwie liczby. Zrobi to dobrą robotę, mnożąc dla ciebie.

Zmienne i matematyka

A i B są zmiennymi, podobnie jak Nazwa$. W odróżnieniu od Nazwa$, A i B nie mają znaku dolara na końcu swoich nazw. Jest tak, ponieważ one przechowują tylko liczby, a nie litery.

Gwiazdka

"A * B" znaczy "A razy B". QBASIC nie używa "X" do mnożenia, ponieważ mógłbyś chcieć mieć zmienną nazywającą się "X".

Co jeszcze?

Spróbuj zmienić "A * B" na "A - B" dla odejmowania. "A + B" wykona dodawanie, a "A / B" wykona dzielenie. Dlaczego "/" przy dzieleniu? Bo nie ma znaku dzielenia na klawiaturze. Przynajmniej ja nie znalazłem.

Wyrażenia

"A * B", "A + B", "A - B", i "A / B" zwane są wyrażeniami matematycznymi, lub po prostu wyrażeniami.

Opanowane:


Rozdział 8 - Zapisywanie na dysk

Zanim przejdziemy do dłuższych programów, zobaczmy, jak zapisać nasze arcydzieła.

Lokalizacja jest wszystkim

Pierwszą rzeczą, o której trzeba pomyśleć, to gdzie zamierzamy zapisywać nasze programy. Dwa główne miejsca, gdzie możemy je przechować, to twardy dysk i dyskietka. Przypatrzmy się obydwu.

Zapisywanie na dyskietkę

Użycie dyskietki jest dobrym pomysłem, gdy nie chcesz, aby inni ludzie zaglądali do twoich programów. Dyskietka może zostać wyjęta z komputera i trzymana w bezpiecznym miejscu. Dyskietki są także dobre, gdy chcesz przenosić programy z jednego komputera na drugi.

Wypróbujmy to. Znajdź wolną dyskietkę i włóż ją do stacji dyskietek. Dyskietka może już coś zawierać, pod warunkiem, że zostało na niej trochę wolnego miejsca. Potrzebujesz mieć program widoczny na ekranie, aby to zadziałało prawidłowo. Wróć do poprzedniego rozdziału i wpisz przykład, jeżeli chcesz mieć coś na ekranie.

Kliknij na "File" w menu QBASIC-a, a następnie "Save".

Na ekranie pojawi się dialog "Save". Zauważ, że kursor jest w okienku (polu) nazwanym "File Name:" ("Nazwa pliku:") Wpisz to:

     a:\testsave

Uważaj na odwrócony ukośnik (backslash, "\"). To nie jest to samo, co zwykły ukośnik "/", który jest na tym samym klawiszu co znak zapytania "?". QBASIC jest na to bardzo czuły.

Naciśnij klawisz <Enter>. Co się zdarzyło? Czy coś słyszysz? Gdzie się podział dialog "Save"? Hmmmm, miejmy nadzieję, że to zadziałało. Jak to można sprawdzić? Spróbój załadować program z powrotem do QBASIC-a. Zaczekaj, on już tu jest. OK, więc usuń go i spróbuj wydostać z powrotem z dyskietki. Pamietasz, jak pozbyć się programu? Wskazówka: "File" i "New" z menu.

Ładowanie z dyskietki

Wykonaj to: Kliknij na "File", a nastepnie "Open..." w menu QBASIC-a. Teraz powinieneś zobaczyć dialog "Open". Wpisz to:

     a:

i naciśnij klawisz <Enter> Teraz powinieneś zobaczyć "TESTSAVE.BAS" w okienku o nazwie "Files" ("Pliki"). Dwa kliknięcia powinny to załatwić. Kliknij dwukrotnie na "TESTSAVE.BAS" i program powróci z dyskietki.

Zapisywanie na twardy dysk

Twardy dysk jest najwygodniejszym miejscem do przechowywania programów. Poniewaz jest on zawsze w komputerze, twoje programy też są tam zawsze pod ręką do załadowania, kiedy tego potrzebujesz.

Staranność się liczy, ponownie.

Twarde dyski zwykle zawierają znacznie więcej informacji niż dyskietka. Z tego powodu trzeba troszczyć się o utrzymanie tego w porządku. W przeciwnym razie nigdy nie będziesz mógł znaleźć tego, czego potrzebujesz. Najlepszą droga do zorganizowania swojej kolekcji programów jest umieszczanie ich w "podkatalogu" czy "folderze" na twardym dysku.

Tworzenie własnego podkatalogu

Zróbmy na twardym dysku folder dla naszych programów. W Windows 95 (i wyższych) będzie trzeba użyć Eksploratora Windows. W Windows 3.1 użyjemy Menadżera plików.

Tworzenie folderu w Windows 95

Kliknij przycisk "Start", następnie "Programy", następnie "Eksplorator Windows". Teraz kliknij na "Plik", potem "Nowy", potem "Folder" w menu Eksploratora Windows.

Zauważ słowa "Nowy folder" z prawej strony Eksploratora Windows.

Idź dalej i wpisz nazwę dla nowego folderu, ale niech ona będzie krótka! QBASIC jest starym programem, który nie radzi sobie z nazwami większymi niż 8 liter lub cyfr. Ja swój nazwałem "TedPrgs", co ma znaczyć Programy Teda. Nazwij swój folder, jak zechcesz, ale nie wiecej niż 8 znaków, inaczej będzie wyglądał bardzo dziwnie w QBASIC-u.

Naciśnij kkawisz <Enter> aby utworzyć folder. OK, zrobione. Nie będzie trzeba robić tego drugi raz, chyba że będziesz chciał utworzyć inny katalog w późniejszym czasie. Idź dalej i zamknij Eksploratora Windows, wróć do QBASIC-a.

Zapisywanie do katalogu

Zapisywanie na twardy dysk tylko trochę różni się od zapisywania na dyskietkę. Program do zapisania trzeba mieć widoczny na ekranie. Wróć do poprzedniego rozdziału i wpisz przykład, jeżeli chcesz mieć coś na ekranie.

Kliknij na "File" w menu QBASIC-a, a następnie "Save".

Na ekranie pojawi się dialog "Save". Kursor jest w okienku (polu) nazwanym "File Name:" ("Nazwa pliku:") Wpisz to:

     c:\TedsPrgs

Jeszcze raz, uważaj na backslash "\". Zmień TedsPrgs na to jak nazwałeś swój katalog.

Naciśnij klawisz <Enter>. Teraz powinieneś zobaczyć listę programów w tym katalogu. Ponieważ jeszcze niczego nie zapisywałeś, nie powinno tam być żadnych programów. Idź dalej i wpisz to:

     testsave

i naciśnij klawisz <Enter>. Hmmm, tym razem nie słychać żadnego dźwięku. Twarde dyski są znacznie cichsze niż dyskietki. No to sprawdźmy, czy wszystko poszło prawidłowo. Najpierw pozbądź się tego, co jest na ekranie, przez "File" i potem "New".

Ładowanie z twardego dysku

Jest ono także bardzo podobne do sposobu, jakim ładowaliśmy program z dyskietki. Kliknij na "File", potem "Open..." w menu QBASIC-a. To wywoła dialog "Open". Wpisz to:

     c:\TedsPrgs

Jak przedtem, uważaj na backslash "\" i zmień "TedsPrgs" na to, jak nazwałes swój folder.

Teraz powinienes zobaczyć "TESTSAVE.BAS" w okienku "Files". Kliknij podwójnie na "TESTSAVE.BAS", aby go załadować.

Nie było tak źle, prawda? Kiedy już raz rozpracujesz, czy chcesz zapisywać na dyskietkę, czy na twardy dysk, potrzebujesz pamiętać tylko jeden sposób dla zapisu i ładowania.

Opanowane:


Rozdział 9 - SELECT CASE

IF...THEN...ELSE jest dobre, jeśli masz tylko dwie rzeczy do sprawdzenia. A co, jeśli masz 5 czy 6 kolegów, którzy mogą używać twój komputer i chcesz, aby on każdemu powiedział co innego? Spróbuj tego:

     CLS
     INPUT "Wpisz swoje imie: ", Imie$
     SELECT CASE Imie$
       CASE "Ted"
         PRINT "Witaj, Wielki Mistrzu"
       CASE "Janek"
         PRINT "Idz sobie!"
       CASE ELSE
         PRINT "Czesc, "; Imie$; ".  Jak sie masz?"
     END SELECT

No, to już było duże. Szczęśliwie nauczyliśmy się w rozdziale 8, jak zapisywać na dysk. Zmieniaj spokojnie "Ted" i "Janek" na "Irka" i "Karol" lub ktokolwiek.

SELECT CASE

SELECT CASE najpierw sprawdza Imie$ dla wartości "Ted". Jeżeli ją znajdzie, wykonuje PRINT po CASE "Ted". Gdy PRINT się wykona, reszta przypadków CASE zostaje opuszczona. W przeciwnym razie trwa sprawdzanie każdego CASE aż do CASE ELSE. Jeżeli nie znajdzie niczego, wykona to, co jest po CASE ELSE.

Na wszelki wypadek

SELECT CASE może też być użyte z liczbami równie dobrze, jak z łańcuchami liter. Oto szybki przykład:

     CLS
     INPUT "Wpisz liczbe: ", Liczba
     SELECT CASE Liczba
       CASE 1234
         PRINT "Dziekuje za wpisanie tajnej liczby 1234"
       CASE 22
         PRINT "Owszem, 22 to ciekawa liczba"
       CASE ELSE
         PRINT "Nie znasz tajnej liczby"
     END SELECT

Opanowane:


Rozdział 10 - Równania

Do tej pory tylko użytkownikowi pozwalaliśmy wypełniać nasze zmienne. Możemy także wypełniać zmienne wewnątrz naszego programu. Jak to:

     CLS
     A = 1
     B = 2
     A$ = "Witaj"
     PRINT A
     PRINT B
     PRINT A$

"A = 1" umieszcza wartość 1 w zmiennej A. "B = 2" umieszcza wartość 2 w zmiennej B. A$ = "Witaj" umieszcza łańcuch "Witaj" w zmiennej A$. Następnie program wypisuje je na ekranie, aby pokazać ci, że one tam są.

Zobacz, czy potrafisz wykombinować, co ten dosyć sprytny program będzie robił. Potem wpisz go i uruchom, żeby zobaczyć, czy miałeś rację.

     CLS
     Licz = 1
     DO
       PRINT Licz
       Licz = Licz + 1
     LOOP

Czy miałeś rację? Może wypisywanie biegnie zbyt szybko? Będzie trzeba nacisnąć Break, aby je zatrzymać. Teraz obejrzyj to dokładniej i zobacz, jeśli potrafisz, co się tu dzieje.

Taki program jest tym, co nazywamy "licznikiem". Odlicza on 1, 2, 3, 4... dopóki go nie zatrzymamy.


Rozdział 11 - Liczby losowe

Liczby losowe to liczby, których nie możesz przewidywać. Rzut monetą albo kostką daje ci liczbę losową. Liczby te są bardzo ważne w grach i w niektórych działach matematyki. Komputery mogą generować liczby losowe całkiem nieźle. Funkcja QBASIC-a RND dostarcza liczb losowych, które możemy używać.

RND

RND jest specjalną funkcją, która daje nam liczbę losową spomiędzy 0 i 1. Możemy to użyć w grach, aby rzeczy były ciekawsze. RND jest doskonała do rzutu kostką lub monetą. Zobaczmy najpierw RND w działaniu:

    CLS
    PRINT RND
    PRINT RND

Ten program wypisuje dwa razy RND. Zauważ, że dostaniesz dwie liczby, które wydają się nieprzewidywalne i przypadkowe. Ale spróbuj uruchomić program jeszcze raz. Dostaniesz te same "przypadkowe" liczby. To znaczy, że twoje gry byłyby takie same za każdym razem, gdy je uruchomić. Na szczęście jest sposób, aby to naprawić.

RANDOMIZE TIMER

Użycie RANDOMIZE TIMER da pewność, że liczby losowe, które otrzymasz, będą różne przy kolejnych uruchomieniach. Wypróbuj to:

    CLS
    RANDOMIZE TIMER
    PRINT RND
    PRINT RND

Przydatne liczby losowe

Liczby losowe spomiędzy 0 i 1 nie są w rzeczywistości zbytnio przydatne. Co, jeżeli do gry potrzebujesz liczbę losową między 1 i 6, jak przy rzucie kostką? Aby dostać coś bardziej użytecznego, użyjemy matematyki. Na szczęście komputery są w matematyce bardzo dobre.

Są dwa problemy, które musimy rozwiązać, aby otrzymać wyniki, jakich chcemy. Pierwszy to rozciągniecie zakresu liczb losowych z 0 do 1 na 1 do 6. To zrobimy łatwo:

    CLS
    RANDOMIZE TIMER
    PRINT RND * 6 + 1
    PRINT RND * 6 + 1

Pomnożeniem przez 6 zwiększamy zakres na 0 do 5. Przez dodanie 1 przesuwamy zakres na 1 do 6. Jednak jest jeszcze problem. Cały ten "ogon" ułamkowy. Funkcja INT QBasic-a może być użyta do przekształcenia liczby dziesiętnej w całkowitą (liczbę bez części dziesiętnej).

    CLS
    RANDOMIZE TIMER
    PRINT INT(RND * 6 + 1)
    PRINT INT(RND * 6 + 1)

Rzucamy kostką

Oto program, który rzuca dwoma kostkami i wypisuje wartość każdej z nich. Zmienne Kosc1 i Kosc2 są używane do przechowania wartości każdej kostki przed ich wypisaniem. W rzeczywistej grze Kosc1 i Kosc2 mogłyby być użyte w jakiś sprytny sposób do zmiany wyniku gry.

     CLS
     RANDOMIZE TIMER
     INPUT "Nacisnij ENTER dla rzutu kostkami...", A$
     PRINT
     Kosc1 = INT(RND * 6 + 1)
     Kosc2 = INT(RND * 6 + 1)
     PRINT "Kostka 1: "; Kosc1
     PRINT "Kostka 2: "; Kosc2

PRINT jako taki

Zauważ, że w ostatnim programie była linia z samym PRINT. Czy widzisz, co ona robi? Ona po prostu drukuje na ekranie pustą linię. To może się przydać dla zrobienia ładniej wyglądajacych wyników twojego programu.


Rozdział 12 - Wyrocznia

Oto fajny program, który używa wiekszość tego, czego się dotąd nauczyliśmy.

     CLS
     RANDOMIZE TIMER
     PRINT "Jestem magiczna Wyrocznia."
     INPUT "Pomyśl pytanie i nacisnij ENTER dla otrzymania odpowiedzi...", A$
     PRINT
     Odp = INT(RND * 5 + 1)
     SELECT CASE Odp
       CASE 1
         PRINT "Tak, zdecydowanie."
       CASE 2
         PRINT "Zapytaj jeszcze raz, jutro."
       CASE 3
         PRINT "Nie powiem!"
       CASE 4
         PRINT "To pewne."
       CASE 5
         PRINT "Tak."
     END SELECT

Jak zawsze, pójdź dalej i przerób to po swojemu. Zmień "Nie powiem!" na "To zależy...", a otrzymasz wyrocznię, która nigdy nie mówi "Nie".

Dodawanie przypadków

Idź dalej i spróbuj dodać nową przepowiednię. Trzeba będzie zmienić

Odp = INT(RND * 5 + 1)

na

Odp = INT(RND * 6 + 1)

ponieważ teraz będzie ich 6. Następnie będzie trzeba dodać "CASE 6" i PRINT dla wypisania nowej przepowiedni.


Rozdział 13 - DO...WHILE

Wcześniej w rozdziale 4 widzieliśmy pętlę DO...LOOP biegnącą bez końca. Jest szereg sposobów, aby pętla się zatrzymała. Jednym z nich jest użycie WHILE. Ten następny program używa WHILE do sprawdzania, aby program biegł tak długo, jak długo Odp$ zawiera literę "t".

     CLS
     DO
       INPUT "Pierwsza liczba: ", A
       INPUT "Druga liczba: ", B
       PRINT "Wynikiem jest: "; A * B

       INPUT "Czy chcesz to zrobic jeszcze raz (t/n)? ", Odp$
     LOOP WHILE Odp$="t"

Warunek w linii LOOP WHILE jest taki sam, jak warunek, który moglibyśmy użyć w IF...THEN. W tym przypadku sprawdzamy, czy Odp$="t" i jeśli tak jest, kontynuujemy pętlę. Jeśli zaś nie, wychodzimy z pętli i nasz program kończy się.

Możesz dodać tą właściwość do dowolnego programu. Spróbuj dodać ją do Wyroczni.


Rozdział 14 - OR i LEFT$

Nasz ostatni program działa świetnie tak długo, dopóki użytkownik zawsze wpisuje małe "t". Co się stanie, jeżeli użytkownik wpisze "tak"? Ponieważ "tak" dla komputera nie jest tym samym co "t", test na Odp$="t" zawiedzie i program zakończy się. Przypuszczalnie to niezbyt dobry pomysł. Ten sam problem mamy, gdy użytkownik wpisze duże "T". Wypróbuj to, aby zobaczyć, co mam na myśli.

Jest parę sposobów, aby uczynić ten program inteligentniejszym i łatwiejszym w obsłudze dla naszych użytkowników. Moglibyśmy sprawdzać kilka sposobów powiedzenia "tak" przy użyciu OR ("albo"), jak ten:

     CLS
     DO
       INPUT "Pierwsza liczba: ", A
       INPUT "Druga liczba: ", B
       PRINT "Wynikiem jest: "; A * B

       INPUT "Czy chcesz to zrobic jeszcze raz (t/n)? ", Odp$
     LOOP WHILE Odp$="t" OR Odp$="T"

Ta wersja pozwoli użytkownikowi wpisać "t" lub "T" i program ruszy znowu. Możemy go zrobić jeszcze mądrzejszym przez użycie LEFT$, jak tu:

     CLS
     DO
       INPUT "Pierwsza liczba: ", A
       INPUT "Druga liczba: ", B
       PRINT "Wynikiem jest: "; A * B

       INPUT "Czy chcesz to zrobic jeszcze raz (t/n)? ", Odp$
       PierwszaLit$ = LEFT$(Odp$, 1)
     LOOP WHILE PierwszaLit$="t" OR PierwszaLit$="T"

Ta wersja pozwoli użytkownikowi wpisać "Tak", "tak" albo cokolwiek, co zaczyna się na "t", bo LEFT$ patrzy tylko na pierwszą literę w twojej odpowiedzi. Możesz nawet wpisać "tu" i program rozpocznie się znowu.

Może to wyglądać na robienie komputera mądrzejszym, ale my wiemy, co się dzieje naprawdę. Aby udowodnić, że komputer rzeczywiście nie jest bardzo inteligentny, spróbuj wpisać "Pewnie!" lub "teczka". On myśli, że "Pewnie!" znaczy "nie", a "teczka" - "tak".

LEFT$

LEFT$ może być użyte, aby wziąć pewną ilość liter od lewej strony ze zmiennej łańcuchowej. Jako przykład, jeżeli mamy:

    A$="TEST"

wtedy LEFT$(A$,2) da nam "TE". LEFT$(A$,3) da nam "TES". Pierwszym "parametrem", który przekazujemy do LEFT$, jest łańcuch znaków, z którym chcemy pracować. Drugim parametrem przekazywanym do LEFT$ jest ilość znaków (liter), którą chcemy dostać. Wypróbuj program, który używa LEFT$ w inny sposób:

    INPUT "Wpisz cokolwiek:", A$
    PRINT A$
    PRINT LEFT$(A$,1)
    PRINT LEFT$(A$,2)
    PRINT LEFT$(A$,3)

Ten program wypisze pierwszy znak tego czegokolwiek, następnie dwa pierwsze znaki, a następnie trzy pierwsze znaki:

    Wpisz cokolwiek: Jacek
    Jacek
    J
    Ja
    Jac

Gdybyś był ciekawy, to QBASIC ma także RIGHT$ (right = prawy) i działa on dokadnie tak, jak LEFT$(). Wypróbuj to:

    INPUT "Wpisz cokolwiek:", A$
    PRINT A$
    PRINT RIGHT$(A$,1)
    PRINT RIGHT$(A$,2)
    PRINT RIGHT$(A$,3)

Oto przykład tego, co ten program będzie robił:

    Wpisz cokolwiek: Jacek
    Jacek
    k
    ek
    cek

Rozdział 15 - COLOR

Masz dosyć tego całego czarno-białego? Wówczas jest dla ciebie polecenie COLOR.

    CLS
    COLOR 2, 0
    PRINT "That's ";
    COLOR 3, 0
    PRINT "more ";
    COLOR 5, 0
    PRINT "like it!"

Kolor wymaga dwóch liczb. Pierwsza liczba to numer koloru pierwszego planu. Druga liczba jest kolorem tła. Na przykład jeśli chcesz pisać czarno na białym, zastosuj "COLOR 0,7". Wszystkie kolory mają swoje własne numery:

Jest także dużo innych kolorów. Wypróbuj liczby od 8 do 15 aby zobaczyć, jakie kolory uzyskasz. Zasadniczo, jeżeli dodasz 8 do każdego z powyższych kolorów, uzyskasz jaśniejszą wersję tego samego koloru. Weź niebieski, który ma numer 1 i dodaj 8 - dostaniesz 9, który jest jasnoniebieski.

Migotanie

Dodanie 16 do numeru koloru da ci wersję migajacą. To jednak nie pracuje w oknie DOS-a. Naciśnij <ALT> i <ENTER> aby się przełączyć w tryb pełnoekranowy, który pokaże migotanie. Wypróbuj ten program:

    CLS
    COLOR 28, 0
    PRINT "*** UWAGA ***"
    COLOR 15, 0
    PRINT "Programowanie moze byc nazbyt zabawne!"

Kolor może być stosowany na wiele sposobów, aby robić bardziej interesujace programy.


Rozdział 16 - FOR ... NEXT

Nowy licznik

FOR...NEXT jest pętlą jak DO...LOOP, ale FOR...NEXT ma wbudowany własny licznik. Wypróbuj to:

    CLS
    FOR I = 1 TO 10
      PRINT I
    NEXT I

Znacznie lepiej, niż nasz ostatni licznik. Ten zatrzymuje się sam po odliczeniu do 10.

Karta kolorów

Oto program z paletą kolorów, używający pętlę FOR...NEXT.

    CLS
    FOR I = 1 TO 15
      COLOR I, 0
      PRINT I; "*** KOLOR ***"
    NEXT I

STEP

FOR...NEXT potrafi także "odliczać z krokiem". Wypróbuj to:

    CLS
    FOR I = 2 TO 20 STEP 2
      PRINT I
    NEXT I

Będzie on odliczał dwójkami od 2 do 20. STEP mówi QBASIC-owi, po ile odliczać. Wypróbuj zmianę tego na odliczanie dziesiątkami od 10 do 100.

FOR...NEXT może także odliczać do tyłu, jeżeli użyjesz ujemną wartość STEP:

    CLS
    FOR I = 10 TO 1 STEP -1
      PRINT I
      SLEEP 1
    NEXT I
    PRINT "ODPALAMY!"

"SLEEP 1" każe QBASIC-owi czekać przez jedną sekundę i następnie kontynuować.


Rozdział 17 - Dźwięk

Jeżeli właśnie potrzebujesz w swoim programie brzęczyka, możesz użyć BEEP:

    CLS
    INPUT "Nacisnij Enter aby uslyszec BEEP", A$
    BEEP

SOUND pozwala odegrać "beep" i powiedzieć, jak wysoki lub niski on będzie i jak długo będzie trwał. Ten program wytwarza pisk 1000 Hz przez około 1 sekundę:

    SOUND 1000, 18

SOUND jest dobre do robienia efektów dźwiękowych. Oto zrzucanie bomby:

    FOR I = 4000 TO 1000 STEP -5
      SOUND I, .1
    NEXT I

Jeżeli chcesz zagrać melodię, to PLAY jest dokładnie tym, czego trzeba. Wypróbuj to:

    PLAY "e8 d8 c8 d8 e8 e8 e4"

PLAY jest jak mały język programowania wewnątrz QBASIC-a. "e8" oznaczacza "graj ćwierćnutę E". Jeśli jesteś obeznany z zapisem nut, rozumiesz, co to znaczy. Oto gama:

    PLAY "c8 d8 e8 f8 g8 a8 b8 > c4"
Znak ">" ("większy, niż") oznacza "weź oktawę wyżej". W PLAY jest wiele specjalnych poleceń. Zobacz w Pomocy do QBasica listę ich wszystkich.

PLAY i tryplety

Oto znajoma melodia, używajaca trik do robienia trypletów.

    PLAY "T180 <d8d8d8 T120 g2>d2"
    PLAY "T180 c8<b8a8 T120 >g2d4"
    PLAY "T180 c8<b8a8 T120 >g2d4"
    PLAY "T180 c8<b8>c8 T120 <a2>"

Ponieważ PLAY nie robi trypletów, musisz modyfikować tempo aby otrzymać właściwy rytm. PLAY rozpoczyna w domyślnym tempie "T120", co oznacza 120 ćwiartek (ćwierćnut) na minutę. W powyższej melodii przełączamy je na T180, które jest tempem trypletu dla T120. Mnożąc nasze tempo przez 1.5 otrzymujemy tempo trypletu. Kiedy tryplet jest gotowy, przełączamy się z powrotem na normalne tempo. W powyższym przykładzie możesz zobaczyć, że przełączamy się tam i z powrotem między głównym tempem (T120) i tempem trypletu (T180) kilka razy, gdy trzeba.

Jak zwykle, jest więcej niż jeden sposób na robienie trypletów. Trypletowe ósemki mogą być zastapione dwunastkami, jak tutaj:

    PLAY "<d12d12d12g2>d2"
    PLAY "c12<b12a12>g2d4"
    PLAY "c12<b12a12>g2d4"
    PLAY "c12<b12>c12<a2>"

Przy stosowaniu tej techniki szesnastki stają się 24. itd... Po prostu mnożymy długość nuty przez 1.5, zamiast zmieniać tempo.

Każda z tych technik ma zalety i wady. Technika zmiany tempa zajmuje więcej miejsca, ale nuty zachowują swoje wartości. Technika z dwunastkami jest bardziej zwarta, ale nie tak łatwa do zrozumienia. Którą z nich zastosujesz, zależy od ciebie. Upewnij się tylko, że inna osoba czytająca twój kod będzie wiedziała, co robisz. Komentarze są tu dobrym pomysłem.




Rozdział 18 - LOCATE

LOCATE pozwala drukować w określonym miejscu na ekranie.

    CLS
    LOCATE 5, 10
    PRINT "Tutaj"
    LOCATE 20, 70
    PRINT "Tam"

Dwie liczby po LOCATE są współrzędnymi miejsca, gdzie będzie się drukować. Zupełnie tak, jak w matematyce, te liczby dają nam wiersz i kolumnę. Pierwsza liczba w LOCATE jest wierszem, czyli jak daleko w dół ekranu drukowanie ma się rozpocząć. Druga liczba jest kolumną, czyli jak to ma być daleko w prawo.

Zastosujmy kilka liczb losowych oraz COLOR i LOCATE do zrobienia bardziej interesujacej wersji naszego pierwszego programu z pętlą:

    CLS
    DO
      Wiersz = INT(RND * 23 + 1)
      Kolumna = INT(RND * 79 + 1)
      LOCATE Wiersz, Kolumna
      Color1 = INT(RND * 15 + 1)
      COLOR Color1, 0
      PRINT "Tu jest Ted!";
    LOOP

Strasznie wymieszane, ale interesujące.

A może zegar?

    CLS
    DO
      LOCATE 1, 1
      PRINT TIME$
      SLEEP 1
    LOOP

TIME$ jest specjalną zmienną, która zawiera bieżący czas. Aby to zatrzymać, naciśnij Break.


Rozdział 19 - WIDTH

Stosuj WIDTH 40 aby uzyskać duży tekst. Przestawia on cały ekran w tryb szerokiego tekstu. Zastosuj WIDTH 80, aby powrócić do normalnego rozmiaru tekstu.

    SCREEN 0
    WIDTH 40
    CLS
    PRINT "Och!  To jest ogromne!"
    INPUT "Nacisnij <Enter> aby powrocic", A$
    WIDTH 80
    PRINT "I to jest to!"

Niestety, nie zobaczysz wielkiego tekstu w okienku. Będziesz musiał nacisnąć <Alt>-<Enter>, żeby przełączyć się na tryb pełnoekranowy. Sprawdź naciśnięcie <Alt>-<Enter> jeszcze raz, aby powrócić do trybu w oknie.


Rozdział 20 - CHR$

Jest dużo specjalnych symboli i innych znaków, które można wyświetlić, a nie ma ich na klawiaturze. Wypróbuj to:

    CLS
    PRINT CHR$(1); CHR$(2)

Drukuje to parę uśmiechniętych buziek. Jest także mnóstwo innych znaków. Ten program pokaże ci wiele z nich, chociaż nie wszystkie:

    CLS
    FOR I = 32 to 255
      PRINT I; CHR$(I); "  ";
    NEXT I

Rozdział 21 - Grafika

Jak dotąd, mieliśmy do czynienia tylko z tekstem (słowami i liczbami). Jak można robić obrazki w QBASIC-u? Najpierw trzeba zastosować SCREEN, aby przejśc z trybu tekstowego do graficznego.

SCREEN

SCREEN (ekran, scena) pozwala wybrać ekran "graficzny" zamiast "tekstowego", który używaliśmy dotychczas. To pozwoli ci rysować obrazki. W następnym programie będziemy używać DRAW (draw = rysuj) do rysowania na ekranie kwadratu w trybie graficznym SCREEN 12.

    SCREEN 12
    CLS
    DRAW "D100 R100 U100 L100"

Jest wiele innych numerów SCREEN, które można użyć, ale 12 jest przypuszczalnie najłatwiejszy do pracy. Daje ci dużo miejsca i numery kolorów są znajome. Pomoc do QBASIC-a objaśnia wszystkie możliwe wartości SCREEN. Możesz zawsze wypróbować je i obejrzeć, co się będzie działo.

DRAW

DRAW to coś jak "żółw" w języku programowania Logo. Przy pomocy DRAW możesz poruszać się po ekranie i rysować linie po drodze. W przykładzie wyżej użyliśmy następujące komendy DRAW:

DRAW potrafi znacznie wiecej, niż to. Jest jak PLAY; jest małym językiem programowania wewnątrz QBASIC-a. Zajrzyj do Pomocy QBASIC'a po kompletny opis wszystkiego, co DRAW potrafi. A oto wypełniony kwadrat:

    SCREEN 12
    CLS
    DRAW "C15 D100 R100 U100 L100 BF1 P15,15"

"C15" ustawia kolor na jaskrawobiały. "BF1" kieruje do wnętrza kwadratu, nastepnie "P15,15" wypełnia go jasnobiałym. I na koniec coś bardzo podobnego do Logo:

    SCREEN 12
    CLS
    FOR I = 0 TO 360 STEP 10
      DRAW "D100 R100 U100 L100 TA" + STR$(I)
    NEXT I

"TA" oznacza obrót o określony kąt. STR$ przekształca wartość zmiennej I na łańcuch. To pozwala poleceniu DRAW obracać o kąt ze zmiennej I. Nie jest to tak łatwe, jak Logo, ale nadal imponujące.

LINE

QBASIC może także rysować przy użyciu systemu współrzędnych. To jak rysowanie wykresów na kratkowanym papierze. Wypróbuj to:

    SCREEN 12
    CLS
    LINE (0, 0)-(320, 240), 15

LINE pozwala rysować linię między dwoma punktami. Punkty są określone przez współrzędne (x, y). Mogłeś to zobaczyć, ucząc się o wykresach na matematyce. W QBASIC-u współrzędne są prawie takie same. Jedyną odmienną rzeczą jest współrzędna Y. W QBASIC-u współrzedna Y jest do góry nogami. "0" jest u góry i rosnące liczby biegną ku dołowi ekranu.

"LINE (0, 0)-(320, 240), 15" rysuje linię startującą od współrzędnej (0, 0), która jest lewym górnym rogiem ekranu. Ostatnia liczba jest numerem koloru (15 - jaskrawobiały).

Prostokąt

Przez dodanie "B" na końcu polecenia LINE możesz narysować prostokąt. Wypróbuj to:

    SCREEN 12
    CLS
    LINE (0, 0)-(320, 240), 15, B

Pierwsza para współrzędnych to lewy górny narożnik, a druga para - prawy dolny.

Spróbuj "BF" zamiast "B". Ciekawe?

CIRCLE

QBASIC może również rysować okręgi (circles) przy użyciu polecenia CIRCLE:

    SCREEN 12
    CLS
    CIRCLE (320, 240), 100, 15

Współrzędne (320, 240) mówią komputerowi, gdzie umieścić środek okregu. "100" to promień, określa jak duży będzie okrąg. "15" jest numerem koloru (znowu jaskrawobiały).

PAINT

Zauważ, że ten okrąg nie był wypełniony. LINE miało opcję "BF", która pozwalała wypełniać kolorem rysowane prostokąty. CIRCLE nie ma takiej opcji, więc użyjemy PAINT:

    SCREEN 12
    CLS
    CIRCLE (320, 240), 100, 15
    PAINT (320, 240), 15, 15

PAINT wypełnia obszar kolorem. Przestaje malować, kiedy dotrze do określonego koloru na ekranie. Współrzędne (320, 240) mówią poleceniu PAINT, gdzie rozpocząć malowanie, a pierwsze "15" mówi, że jako kolor wypełnienia ma być użyty jaskrawobiały. Drugie "15" mówi, że należy przestać malować po dotarciu do czegokolwiek, co jest jaskrawobiałe.

Kompozycje z kółek

Koncentryczne okregi są bardzo łatwe do narysowania:

    SCREEN 12
    CLS
    FOR I = 5 TO 200 STEP 5
      CIRCLE (320, 240), I, 15
    NEXT I

Stosując CIRCLE, PAINT i kilka liczb losowych, możemy zrobić parę interesujących obrazków:

    SCREEN 12
    CLS
    FOR I = 1 TO 50
      X = INT(RND * 640)
      Y = INT(RND * 480)
      R = INT(RND * 100)
      Color1 = INT(RND * 16)
      CIRCLE (X, Y), R, Color1
      PAINT (X, Y), Color1, Color1
    NEXT I

Rozdział 22 - INKEY$

Do tej pory używaliśmy INPUT do pobierania z klawiatury. Z INPUT jest ten kłopot, że program zatrzymuje się, dopóki użytkownik nie naciśnie klawisza Enter. Czy nie byłoby fajnie utrzymać program działający i mimo to móc pobierać coś z klawiatury? Pozwala to zrobić INKEY$. Stosowanie INKEY$ jest bardzo ważne, jeśli chcesz robić gry "w czasie rzeczywistym".

Poprawmy program zegara, pozwalając użytkownikowi nacisnąć jakikolwiek klawisz aby zatrzymać program. W ten sposób nie potrzebuje on nic wiedzieć o klawiszu Break.

    CLS
    LOCATE 3, 1
    PRINT "Nacisnij cokolwiek - STOP"
    DO
      LOCATE 1, 1
      PRINT TIME$
      SLEEP 1
    LOOP WHILE INKEY$ = ""

Nieźle. Teraz nie potrzebujemy uczyć użytkownika o klawiszu Break. Możemy zrobić to samo w każdym innym naszym programie, który wymaga klawisza Break. Jeśli użytkownik nie naciska klawisza, INKEY$ nie zwraca nic, czyli łańcuch pusty "".

Następny program będzie siedział w pętli, pobierając klawisze z klawiatury przez INKEY$ i drukując je na ekranie:

    CLS
    DO
      Key$ = INKEY$
      IF Key$ <> "" THEN
        PRINT Key$;
      END IF
    LOOP

Ten mały programik może być zastoswany do znajdowania różnych sekretnych kodów używanych przez INKEY$ i pozwoli ci poznać, kiedy naciskane są klawisze strzałek. Jest to bardzo przydatne w programowaniu gier, gdzie klawisze strzałek mogłyby sterować przebiegiem gry. Jeśli naciśniesz klawisz ze strzałką, zobaczysz, że drukowana jest spacja i litera.


Rozdział 22.5 - Funkcje łańcuchowe

Konkatenacja

Konka-te-co? To po prostu wymyślne słowo na składanie rzeczy razem, jedną po drugiej. Jest to znacznie łatwiej zrobić, niż powiedzieć. Kiedy używasz znak plus "+" z łańcuchami znaków, to nie wykonujesz dodawania. Zamiast tego zestawiasz je razem.

    A$ = "Witaj "
    B$ = "tutaj!"
    C$ = A$ + B$
    PRINT C$

To wypisze na ekranie "Witaj tutaj!".

LEFT$() i RIGHT$()

LEFT$() and RIGHT$() pozwala pracować z częściami łańcuchów. Wypróbuj ten przykład:

    A$ = "Ted Felix"
    B$ = LEFT$(A$, 3)
    PRINT B$

LEFT$(A$, 3) oznacza "weź z A$ 3 znaki od lewej". Ponieważ 3 znaki od lewej to jest "Ted", ten program drukuje "Ted", jak oczekiwaliśmy. Spróbuj zmieniać liczbę od 2 do 5 i zobacz, co się będzie działo.

Kiedy już rozumiesz LEFT$(), RIGHT$() jest łatwe. Wypróbuj to:

    A$ = "QBASIC jest fajny"
    B$ = RIGHT$(A$, 5)
    PRINT B$

RIGHT$(A$, 5) oznacza "weź z A$ 5 znaków od prawej. To daje nam "fajny".

MID$()

LEFT$() daje nam coś z lewej strony łańcucha. RIGHT$() daje coś z prawej strony łańcucha. MID$() daje nam coś ze środka (middle). Wypróbuj to:

    A$ = "raz dwa trzy"
    B$ = MID$(A$, 5, 3)
    PRINT B$

MID$(A$, 5, 3) oznacza "weź 3 znaki ze środka A$, zaczynając od piątego znaku. To daje nam środkowe słowo: "dwa".

Możesz także użyć MID$() do zmiany części tego, co jest w zmiennej tekstowej. Wypróbuj to:

    A$ = "spawacz"
    PRINT A$
    MID$(A$, 3, 2) = "in"
    PRINT A$

Tutaj zastępujemy "aw" w spawaczu przez "in". To daje nam zupełnie inne słowo.

Mógłby to być piękny podstępny sposób na ukrywanie w programie czegoś takiego jak hasło. Ktoś, kto nie wie, jak programować w QBASIC-u, nie mógłby go wykombinować.

LCASE$() i UCASE$()

Kiedy trzeba przekształcić łańcuch na napisany w całości dużymi albo w całości małymi literami, zastosujemy UCASE$() i LCASE$().

    A$ = "Ala ma kota Mamrota"
    PRINT A$
    PRINT UCASE$(A$)
    PRINT LCASE$(A$)

Możesz używać UCASE$() i LCASE$() do uodpornienia testów na poczet liter. Inaczej mówiąc, wielkość liter nie będzie brana pod uwagę. Oto ulepszenie do poprzedniego programu:

    CLS
    INPUT "Wpisz swoje imie: ", Imie$
    IF LCASE$(Imie$) = "janek" THEN 
      PRINT "Idz sobie!"
    ELSE
      PRINT "Witaj, "; Imie$; ".  Jak sie masz?"
    END IF

W tej nowej wersji użytkownik może wpisać "janek", "Janek" lub nawet "JANEK", i imię będzie rozpoznane.

STRING$() i SPACE$()

Powiedzmy, że trzeba wypisać na ekranie 20 gwiazdek w jednej linii. Mógłbyś to zrobić tak:

    PRINT "********************"

Ale był lepszy sposób. Co powiesz na pętlę FOR?

    FOR I = 1 to 20
      PRINT "*";
    NEXT I
    PRINT

To działa dobrze, ale QBASIC ma jeszcze łatwiejszy sposób zrobienia tego przy pomocy STRING$().

    PRINT STRING$(20, "*")

Pierwszym argumentem w STRING$() jest, ile razy chcesz powtórzyć znak. Drugim argumentem jest znak, który ma być powtarzany. A więc STRING$(20, "*") znaczy "wypisz mi 20 gwiazdek".

Jeżeli chcesz wstawić dużo spacji, mógłbyś to zrobić przy pomocy

    PRINT "A"; STRING$(20, " "); "B"

Albo możesz użyć SPACE$().

    PRINT "A"; SPACE$(20); "B"

Pętle FOR zawsze robią ciekawe rzeczy:

    FOR I = 0 to 20
      PRINT SPACE$(I); "QBASIC!"
    NEXT I

LEN()

LEN() podaje nam długość ciągu znaków. Wypróbuj to:

    A$ = "Witaj"
    PRINT LEN(A$)

Jak oczekiwaliśmy, to powinno wydrukować liczbę 5, bo słowo "Witaj" ma 5 znaków.

LEN() jest przydatna w pętlach FOR, kiedy nie jesteś pewny, jak długi jest łańcuch, a nie chce ci się tego liczyć:

    A$ = "Witaj w QBASIC!"
    FOR I = 1 to LEN(A$)
      PRINT LEFT$(A$, I)
    NEXT I

LEN() jest bardzo użyteczna, gdy chcesz, aby to użytkownik wpisał łańcuch. Wypróbuj to:

    INPUT "Wpisz lancuch: ", A$
    PRINT "Wpisany lancuch ma"; LEN(A$); " znakow."

CHR$() i ASC()

Komputery w rzeczywistości znają się tylko na liczbach. Aby wytworzyć ciąg liter, komputery zamieniają litery na liczby, bo na nich potrafią pracować. CHR$() i ASC() pozwalają nam robić takie samo przekształcenie.

CHR$() zamienia liczbę na znak. Widzieliśmy to już w poprzednim rozdziale. Wypróbuj to:

    FOR I = 14 to 255
      PRINT I; CHR$(I); "  ";
    NEXT I

Ten program wyświetla wszystkie numery znaków od 14 do 255 i znaki, które one reprezentują. CHR$() jest bardzo przydatne do otrzymywania znaków, których nie ma na klawiaturze. Jak ten:

    PRINT STRING$(40, CHR$(1))

Jest parę ciekawych znaków między CHR$(1) i CHR$(31). Na przykład CHR$(7) robi "beep". Wypróbuj:

    PRINT CHR$(7)

Są również inne interesujące rzeczy. Pobaw się trochę z CHR$(), a znajdziesz kilka.

ASC() jest przeciwieństwem CHR$(). ASC() pobiera znak i podaje jego numer. Wypróbuj:

    PRINT ASC("A")

Ten program drukuje 65, ponieważ kod znaku dużego "A" to 65. Kod, którego QBASIC używa do przekształcania liter na liczby, jest nazywany "ASCII" (wymawia się "aski").

INSTR()

INSTR() pozwala poszukiwać łańcucha znaków w innym łańcuchu. Jeśli go znajdzie, powie nam, gdzie on jest. Wypróbuj:

    A$ = "Witajcie wszyscy"
    PRINT INSTR(A$, "wszyscy")

Ten program wypisuje "10", ponieważ "wszyscy" zostało znalezione na dziesiątej pozycji w "Witajcie wszyscy". Jeżeli łańcuch nie zostanie znaleziony, INSTR() zwraca zero.

INSTR() może się okazać bardzo przydatny, gdy chcesz podzielić łańcuch na części:

    A$ = "dwa kawalki"
    SpacePos = INSTR(A$, " ")
    PRINT LEFT$(A$, SpacePos)
    PRINT RIGHT$(A$, LEN(A$) - SpacePos)

Rozdział 23 - Komentarze i stałe

Większość języków programowania pozwala dodawać do programów uwagi, które są ignorowane przez komputer. To pozwala objaśniać, co jest w programie, komuś kto mógłby ten program czytać w przyszłości. W QBASIC-u na początku komentarza używamy apostrofu ('). Oto przykład:

    ' Program rysujacy prostokaty na ekranie
    ' To jest komentarz, QBASIC go zignoruje.
    SCREEN 12
    CLS
    ' Rysuj 50 razy
    FOR I = 1 TO 50
      ' Wybierz polozenie prostokata
      X1 = INT(RND * 640)
      Y1 = INT(RND * 480)
      X2 = INT(RND * 640)
      Y2 = INT(RND * 480)
      ' Wybierz kolor prostokata
      Color1 = INT(RND * 16)
      ' Rysuj wypelniony prostokat
      LINE (X1, Y1) - (X2, Y2), Color1, BF
    NEXT I

Komputer będzie ignorował wszytkie te linie komentarzy, ale my ludzie możemy je przeczytać i zapamiętać, jak program działa. Dobrzy programiści stosują komentarze, aby pomóc innym zrozumieć, co zostało zrobione. Komentarze pomogą również nam pamiętać, co zrobiliśmy, gdy wrócimy do programu za jakiś czas.

Stałe

Innym sposobem uczynienia programu łatwiejszym do zrozumienia jest używanie stałych. Stałe wyglądają i działają jak zmienne, ale nie mogą się zmieniać. Oto przydatny program:

    CONST Pi = 3.141593
    INPUT "Wpisz promien okregu: ", Promien
    PRINT "Obwod wynosi:"; 2 * Pi * Promien
    PRINT "Pole powierzchni wynosi:"; Pi * Promien * Promien

Jeśli nie użyjemy stałej Pi, musimy liczbę 3.141593 w tym programie skopiować dwa razy. Użycie stałej czyni program łatwiejszym do czytania i zrozumienia. Chroni nas także przed pomyłkami podczas kopiowania.


Rozdział 24 - Sub-Procedury (SUBs)

Gdy program robi się długi, trzeba podzielić go na mniejsze kawałki, z którymi łatwiej pracować. QBASIC nazywa te kawałki "sub-procedurami" lub procedurami SUB. Inne języki programowania używają innych nazw, jak np. podprogram.

Aby pracować z SUB-ami w QBASIC-u, trzeba zajrzeć do okna dialogowego "SUBs", które pokaże nam listę naszych SUB-ów. Wybierz "View | SUBs..." z menu aby przenieść się do okna "SUBs". Można także nacisnąć klawisz F2, aby uzyskać to samo szybciej. W oknie można wybrać SUB, z którą chcemy pracować, albo wybrać główny moduł (Main Module). Jeśli właśnie zaczynasz (File | New), zobaczysz, że główny moduł nazywa się "Untitled" i nie ma żadnych SUB-ów.

W QBASIC-u można zdefiniować nową SUB po prostu przez wpisanie jej. To przeniesie cię do widoku nowej procedury. Spróbuj wpisać to:

    SUB RysujOkrag
      CIRCLE (320, 240), 100, 15
    END SUB

Zauważ, że gdy nacisnąłeś Enter po pierwszej linii, zostałeś przeniesiony do nowego ekranu z twoją nową SUB właśnie. Teraz jeżeli pójdziesz do okna dialogowego "SUBs" (View | SUBs...), możesz zobaczyć, że masz SUB nazywającą się "RysujOkrag" i główny moduł nazwany "Untitled".

Teraz trzeba wrócić do głównego modułu, aby rzeczywiście użyć tą nową SUB. Z menu wybierz View | SUBs..., aby dostać się do okna dialogowego SUBs. Teraz kliknij podwójnie na "Untitled", aby powrócić do Main Module. Ekran zrobi się pusty, ale nie martw się, twoja SUB ciągle tam jest. Teraz wpisz i uruchom to:

    SCREEN 12
    CLS
    RysujOkrag

Widzisz? RysujOkrag zrobił, co miał do zrobienia.

Spróbuj dodać inną SUB. Zobacz, czy zdołałeś zapamiętać potrzebne kroki. Wróć do poprzedniego przykładu, jeśli potrzebujesz pomocy.

    SUB PlayMary
      PLAY "e8 d8 c8 d8 e8 e8 e4"
    END SUB

Teraz trzeba zmienić główny moduł, aby użyć naszą nową SUB. Więc wróć do Main Module i zmień go, żeby wyglądał jak to:

    SCREEN 12
    CLS
    RysujOkrag
    PlayMary

Teraz uruchom to i powinieneś zobaczyć okrąg i usłyszeć melodyjkę.

Dzielenie programów na mniejsze części, jak tutaj, pomoże ci zrozumieć duże programy.

Argumenty

Czasami chcesz przekazać do procedury SUB liczbę lub łańcuch znaków. QBASIC pozwala i na to. Oto nowa wersja procedury RysujOkrag:

    SUB RysujOkrag2 (Promien)
      CIRCLE (320, 240), Promien, 15
    END SUB

Ta wersja pozwala nam przekazać Promien. Gdy to robimy, Promien nazywa się "parametrem" lub "argumentem" naszej procedury SUB. Oto jak moglibyśmy przesłać argument z głównego modułu:

    SCREEN 12
    CLS
    RysujOkrag
    RysujOkrag2 (20)
    PlayMary

Moglibyśmy także w głównym module zrobić coś takiego:

    SCREEN 12
    CLS
    FOR I = 5 TO 200 STEP 5
      RysujOkrag2 (I)
    NEXT I

Zmienianie argumentów

Gdy potrzeba przekazać coś głównemu modułowi, możesz zmienić jeden z argumentów w SUB i główny moduł zobaczy tą zmianę.

    SUB DodajJeden(X)
      X = X + 1
    END SUB

    CLS
    I = 0
    DodajJeden(I)
    PRINT I

Gdy uruchomisz ten program, wypisze on na ekranie wartość 1. Jest tak dlatego, bo wartość I jest zmieniana przez procedurę SUB DodajJeden. Gdy trzeba tylko zwrócić wartość, czasem lepszym wyborem jest procedura FUNCTION. Będzie ona opisana później.

Zakres

A co, jeżeli mieliśmy zmienne w głównym module i w SUB i tak się zdarzyło, że miały te same nazwy? Czy będzie to ta sama zmienna? Odkryjmy to. Wpisz taką SUB:

    SUB Zakres
      PRINT "Zakres mowi: "; X
      X = 23
    END SUB

I taki główny moduł:

    X = 15
    Zakres
    PRINT "Main Module mowi: "; X

I uruchom to. Co się stało? Zakres powiedział "0", bo X dla Zakresu było nową zmienną. Główny Moduł powiedział 15, bo Zakres nie zmienił X-a z Głównego Modułu, on zmienił swój własny X. X z Zakresu i X z Głównego modułu są różnymi zmiennymi.

Zmienne, które tworzysz w SUB, nie mogą być widziane przez Moduł Główny. Zmienne w Głównym Module nie mogą być widziane przez SUB. Jeśli trzeba współdzielić zmienne, możesz przekazać je do SUB jako argumenty.

Dane globalne

Jest możliwe zrobić tak, aby zmienne z modułu głównego były dostępne dla SUB bez przekazywania ich jako argumenty. Dodaj "SHARED X" do procedury Zakres, w ten sposób:

    SUB Zakres
      SHARED X
      PRINT "Zakres mowi: "; X
      X = 23
    END SUB

Teraz, kiedy to uruchomisz, zobaczysz że SUB Zakres może już widzieć X z głównego modułu. Zakres nie ma już własnego X. Nazywa się to "dane globalne" (albo "zmienne globalne"), ponieważ są one wszędzie widoczne, i jeśli możesz, powinieneś tego unikać. Większość programistów uważa to za niebezpieczne, bo trudno jest rozeznać się, która procedura SUB mogła zmienić wartość takiej zmiennej.

Możesz także z Głównego Modułu uczynić zmienną globalną dla wszystkich procedur SUB, przez dodanie w tym module "DIM SHARED" zanim ustawisz X na 15:

    DIM SHARED X
    X = 15
    Zakres
    PRINT "Main Module mowi: "; X

W ten sposób łatwiej jest zobaczyć, które zmienne są globalne, bo można je znaleźć w Głównym Module. Problem może być z tym, że te zmienne są globalne dla wszystkich procedur SUB w programie. Zazwyczaj tylko niektóre SUB-y potrzebują widzieć zmienne globalne; w takim przypadku lepiej jest stosować SHARED wewnątrz SUB.

Programowanie zorientowane obiektowo

Kiedy zaczynasz się martwić o współdzielenie zmiennych między SUB-y i Moduł Główny, to prawdopodobnie jesteś gotowy zacząć uczyć się programowania zorientowanego obiektowo. Ten styl programowania czyni łatwiejszym współdzielenie zmiennych pomiędzy SUB-ami, a nadal wytwarza kod, który jest łatwy do zrozumienia. Visual BASIC, Java, i C# są językami programowania, które mają właściwości programowania obiektowego i są dosyć łatwe do nauki.

STATIC

Zauważ, że za każdym razem gdy wywołujesz SUB, jego zmienne są tracone po zakończeniu SUB-a. Oto przykład:

    SUB Licznik
      C = C + 1
      PRINT C
    END SUB

    CLS
    Licznik
    Licznik
    Licznik

Niezbyt dobry licznik, skoro zawsze wypisuje "1". Możemy użyć STATIC, aby powiedzieć QBASIC-owi, że nie chcemy znikania C po zakończeniu SUB-a. Wtedy uzyskamy zachowanie, jakiego oczekujemy. Zmień procedurę Licznik, jak niżej:

    SUB Licznik
      STATIC C
      C = C + 1
      PRINT C
    END SUB

I teraz już znacznie lepiej.

Języki programowania zorientowane obiektowo oferują dużo sposobów, aby uniknąć używania zmiennych STATIC. Kiedy zauważysz u siebie wytwarzanie mnóstwa zmiennych STATIC, to już prawdopodobnie czas na nauczenie się języka zorientowanego obiektowo.

Funkcje

Funkcje są całkiem jak SUB-y, ale zwracają wartość. Oto przykład:

    FUNCTION Dodaj (X, Y)
      Dodaj = X + Y
    END FUNCTION

A to Główny Moduł, z którym ona pracuje:

    PRINT Dodaj(3, 4)

DECLARE

Kiedy wprowadzałeś przykładowe programy w tym rozdziale, mogłeś zauważyć, że edytor QBASIC-a dodaje do programów polecenia "DECLARE". Dlaczego to robi? Polecenie "DECLARE" jest uprzedzeniem dla QBASIC-a, że w tym programie są procedury SUB i FUNCTION. Bez tego ostrzeżenia QBASIC nie wiedziałby, co mamy na myśli, kiedy je wywołujemy. Myślałby, że znalazł błąd składni i program zatrzymałby się.

Na szczęście QBASIC załatwia to, wstawiając za nas DECLARE. Niestety, w długich programach może on wstawiać DECLARE gdziekolwiek, co wygląda paskudnie. Na szczęście możesz przenieść DECLARE tam, gdzie zechcesz (tak długo, jak długo jest umieszczone przed pierwszym użyciem SUB lub FUNCTION), a QBASIC nadal dba o resztę.


Rozdział 25 - Struktury danych

Typy wbudowane

QBASIC oferuje pięć wbudowanych typów danych. Każdy z tych typów może zostać określony przez pojedynczy znak dodany po nazwie zmiennej. Możesz także określać typ, używając polecenia DIM. Ważne jest, aby przy pisaniu programu wskazać prawidłowe typy. Następujące opisy każdego z typów pomogą ci podejmować właściwe decyzje.

Zmienne pojedynczej precyzji (Single-Precision)

Przechowują liczby z częścią dziesiętną. W zmiennej pojedynczej precyzji możesz otrzymać do siedmiu cyfr. Znacznikiem typu w takiej zmiennej jest "!". Jeżeli nie określisz inaczej, każda zmienna bez znacznika typu jest zmienną liczbową pojedynczej precyzji. Oto parę przykładów tworzenia i używania tych zmiennych:

    X = 1.5
    DIM Y AS SINGLE
    Y = 2.1
    Z! = 2.5

    PRINT X; Y; Z!

Zauważ, że polecenie DIM może zostać użyte do wskazania QBASIC-owi typu zmiennej. Wtedy dla takiej zmiennej nie potrzebujesz używać znacznika (przyrostka) typu.

Zmienne łańcuchowe (String)

Typ łańcuchowy obsługuje łańcuchy znaków. Na zmiennych łańcuchowych nie możesz wykonywać obliczeń. W poleceniu DIM stosuj "STRING" dla utworzenia zmiennej łańcuchowej. Przyrostkiem typu dla takiej zmiennej jest "$" Oto kilka przykładów tworzenia i używania zmiennych łańcuchowych:

    X$ = "Hello"
    DIM Y AS STRING
    Y = "Goodbye"

    PRINT X$
    PRINT Y

Zmienne całkowitoliczbowe (Integer)

Typ Integer obsługuje liczby bez miejsc dziesiętnych. Liczby te mają zakres od -32768 do 32767. Obliczenia na nich mogą być szybsze, niż na zmiennych pojedynczej precyzji. Dla programów, które muszą działać bardzo szybko, stosowanie zmiennych całkowitoliczbowych może być użuteczne. W poleceniu DIM do ich utworzenia stosuj "INTEGER". Przyrostkiem typu jest dla nich "%". Oto parę przykładów tworzenia i używania zmiennych typu Integer:

    X% = 32
    DIM Y AS INTEGER
    Y = 55

    PRINT X%; Y

Ponieważ obliczenia typu Integer są bardzo szybkie, powszechnie spotkasz następującą linię na początku programów w QBASIC-u:

    DEFINT A-Z

Mówi ona QBASIC-owi, aby przestał zakładać, że wszystkie zmienne są pojedynczej precyzji i zamiast tego przyjął, że wszystkie są całkowitoliczbowe. W ten sposób nie trzeba już używać DIM lub symbolu "%", w całym programie wszystkie zmienne będą typu Integer.

Długie liczby całkowite (Long-Integer)

Ten typ także obsługuje liczby bez miejsc dziesiętnych. Long-integers mają zakres od -2147483648 do 2147483647. Obliczenia na nich są zwykle prawie tak szybkie, jak typu Integer. Może to być użyteczne dla programów, które muszą pracować bardzo szybko. W poleceniu DIM do ich utworzenia stosuj "LONG". Przyrostkiem typu dla zmiennych całkowitoliczbowych jest "&". Oto kilka przykładów tworzenia i używania zmiennych całkowitoliczbowych:

    X& = 65536
    DIM Y AS LONG
    Y = 121072

    PRINT X&; Y

Zmienne podwójnej precyzji (Double-Precision)

Ten typ obsługuje liczby z miejscami dziesiętnymi. W zmiennej podwójnej precyzji możesz otrzymać do piętnastu cyfr. Są one stosowane tam, gdzie potrzeba bardzo dokładnych obliczeń. W poleceniu DIM do ich utworzenia stosuj "DOUBLE". Przyrostkiem typu jest "#". Oto kilka przykładów tworzenia i używania zmiennych podwójnej precyzji:

    X# = 3.14159265358979
    DIM Y AS DOUBLE
    Y = 1.23456789012345

    PRINT X#; Y

Tablice

Tablica pozwala przechowywać listę rzeczy. Tablice są bardzo podobne do zmiennych, ale mogą zawierać więcej niż jedną rzecz. Wypróbuj to:

    N$(0) = "Tadek"
    N$(1) = "Jacek"
    N$(2) = "Ania"
    N$(3) = "Fred"

    FOR I = 0 TO 3
      PRINT N$(I)
    NEXT I

Liczba wewnątrz nawiasów "(1)" jest nazywana "indeksem".

Tablice mogą także przechowywać liczby.

    FOR I = 0 TO 10
      A(I) = I * 2
    NEXT I

    FOR I = 0 TO 10
      PRINT A(I)
    NEXT I

Tablice mają ograniczenie na przechowywanie tylko 11 pozycji (0 do 10). Jeśli spróbujesz iść powyżej 10, otrzymasz błąd "Subscript out of range" ("Indeks spoza zakresu"). Aby stworzyć większe tablice, możesz użyć DIM do wskazania QBASIC-owi, jak duża będzie talica:

    DIM A(20)

    FOR I = 0 TO 20
      A(I) = I * 2
    NEXT I

    FOR I = 0 TO 20
      PRINT A(I)
    NEXT I

Tablice są doskonałe do programów, w których trzeba przechowywać listę rzeczy. Mógłbyś stosować tablice do stworzenia programu książki telefonicznej lub programu, który przechowuje adresy osób z twojej klasy.

TYPE

Czasami będziesz chciał trzymać razem grupę zmiennych, ponieważ one razem coś opisują. Polecenie TYPE pozwala tworzyć własną kolekcję zmiennych. Oto przykład:

    TYPE TypKolega
      Nazwisko AS STRING * 20
      NrTel AS STRING * 14
    END TYPE

    DIM Kolega AS TypKolega

    Kolega.Nazwisko = "Jan Wiatr"
    Kolega.NrTel = "1-310-555-1212"

    PRINT Kolega.Nazwisko; ": "; Kolega.NrTel

TYPE tworzy nasz nowy typ czyli kolekcję zmiennych. DIM tworzy nową zmienną o tym typie. Kiedy pracujemy z typami, stosujemy nazwę zmiennej, zakończoną kropką("."), a po kropce nazwę zmiennej z TYPE.

Ponieważ TYPE pozwala używać pojedynczej zmiennej do reprezentowania kolekcji zmiennych, możesz używać TYPE do przekazywania wielu parametrów do SUB-a za jednym zamachem. Może to być dobry sposób na uniknięcie używania zbyt wielu SHARED w SUB.

W QBASIC-u TYPE może zawierać każdy z wbudowanych typów zmiennych. Type może także zawierać inny TYPE. Jednakże TYPE nie może zawierać tablicy. Visual BASIC pozwala na to, ale nie QBASIC.

Baza danych

Zastosowanie razem tablic i TYPE pozwala utworzyć coś, co jest znane jako baza danych. Wypróbuj to:

    TYPE TypKolega
      Nazwisko AS STRING * 20
      NrTel AS STRING * 14
    END TYPE

    ' Baza danych
    DIM Koledzy(2) AS TypKolega

    ' Wypelnia baze danych nazwiskami i numerami
    Koledzy(0).Nazwisko = "Jan Wiatr"
    Koledzy(0).NrTel = "1-310-555-1212"

    Koledzy(1).Nazwisko = "Jacek Chmura"
    Koledzy(1).NrTel = "1-340-555-6545"

    Koledzy(2).Nazwisko = "Karol Deszcz"
    Koledzy(2).NrTel = "1-350-555-2421"

    ' Druk calej bazy danych
    FOR I = 0 TO 2
      PRINT Koledzy(I).Nazwisko; ": "; Koledzy(I).NrTel
    NEXT I

Rozdział 25.5 - Konwersja typu

STR$() i VAL()

Do tej pory używaliśmy zmiennych łańcuchowych do przechowywania łańcuchów, a zmiennych numerycznych do przechowywania liczb. A co, jeśli rzeczywiście trzeba wykonać obliczenia na liczbach, które znajdują się w zmiennej łańcuchowej? Lub być może trzeba wydostać jakoś kilka cyfr ze zmiennej łańcuchowej? QBASIC dostarcza nam funkcje STR$() and VAL().

STR$() pozwoli przekształcić liczbę na łańcuch. Jak tutaj:

  A = 25        ' A moze przechowywac tylko liczby
  PRINT A
  B$ = STR$(A)  ' Przeksztalca A na lancuch, przechowany w B$
  PRINT B$

VAL() pozwoli przekształcić z łańcucha na liczbę. Jak tutaj:

  A$ = "25"    ' Nie mozna robic zadnych obliczen na zmiennej lancuchowej
  PRINT A$
  B = VAL(A$)  ' Przeksztalca A$ na liczbe przechowywana w B
  PRINT B

Przekształcanie liczb

Obejmuje CINT(), FIX(), INT(), CDBL(), CSNG(), CLNG()


Rozdział 25.75 - PRINT USING

(Autor pozostawił ten rozdział pusty.)
      Jeżeli zwykłymi poleceniami PRINT będziemy wypisywać liczby jedna pod drugą, QBasic wyrówna je do lewej strony, inaczej niż robimy to np. przy dodawaniu na papierze. Aby QBasic wypisał nam liczby w taki sposób, używa się polecenia PRINT USING:

  PRINT USING"#####.##"; 1234.567
  PRINT USING"#####.##"; 789

Fragment "#####.##" nazywa się łańcuchem formatującym. Znaki # określają w nim położenie cyfr liczby. Jeżeli liczba ma część ułamkową dłuższą niż ilość miejsc przewidzianą na nią w łańcuchu, to jest ona zaokrąglana. Dla liczb całkowitych część ułamkowa zawiera zera (które normalnie QBasic opuszcza).

PRINT USING używa również inne niż # znaki formatujące. Listę ich wszystkich można znaleźć w Pomocy do QBasica"


Rozdział 25.9 - DATA i READ

Ładowanie tablicy z mnóstwem danych może okazać się bardzo nudne.

  ' Ladowanie tablicy
  A(0) = 10
  A(1) = 24
  A(2) = 31
  A(3) = 15
  A(4) = 67
  A(5) = 34
  A(6) = 87
  A(7) = 92
  A(8) = 14
  ' ... To moze sie ciagnac jakis czas...

  FOR I = 0 TO 8
    PRINT A(I)
  NEXT I

Aby zaoszczędzić miejsca i wpisywania, QBASIC dostarcza polecenia DATA i READ. Można umieścić listę wartości danych w poleceniu DATA i wczytać ją do tablicy używając READ. Następujący program robi dokładnie to, co poprzedni.

  DATA 10, 24, 31, 15, 67, 34, 87, 92, 14

  FOR I = 0 TO 8
    READ A(I)
  NEXT I

  FOR I = 0 TO 8
    PRINT A(I)
  NEXT I

QBASIC, czytając kod, opuszcza polecenia DATA. Zwraca na nie uwagę tylko wtedy, gdy znajdzie polecenie READ. Za każdym razem, gdy trafi się READ, QBASIC pobiera wartość z polecenia DATA i umieszcza ją w zmiennej w poleceniu READ.

RESTORE

RESTORE mówi QBASIC-owi, z którego polecenia DATA rozpocząć czytanie. W swoim programie możesz potrzebować załadować kilka różnych tablic. RESTORE pozwala ci zorganizować polecenia DATA w każdy sposób, w jaki zechcesz.

  Imiona:
  DATA Fred, Janek, Jacek, Zosia
  Wartosci:
  DATA 10, 24, 31, 15, 67, 34, 87, 92, 14

  ' Start od polecenia DATA po "Wartosci:"
  RESTORE Wartosci
  FOR I = 0 TO 8
    READ A(I)
  NEXT I

  ' Start od polecenia DATA po "Imiona:"
  RESTORE Imiona
  FOR I = 0 TO 8
    READ N$(I)
  NEXT I

RESTORE każe QBASIC-owi rozpocząć czytanie od następnego polecenia DATA po etykiecie. Etykieta jest nazwą, jak "Imiona:" lub "Wartosci:". Zauważ, że gdy tworzymy nową etykietę, używamy dwukropka ":", ale gdy używamy etykietę w poleceniu RESTORE, opuszczamy dwukropek.

Ładowanie bazy danych

Polecenia DATA są doskonałe do baz danych. Oto nowa wersja przykładu bazy danych, tym razem używająca DATA.

    DATA "Jan Wiatr", "1-310-555-1212"
    DATA "Jacek Chmura", "1-340-555-6545"
    DATA "Karol Deszcz", "1-350-555-2421"

    TYPE TypKolega
      Nazwisko AS STRING * 20
      NrTel AS STRING * 14
    END TYPE

    ' Baza danych
    DIM Koledzy(2) AS TypKolega

    ' Wczytuje baze danych z polecen DATA
    FOR I = 0 TO 2
      READ Koledzy(I).Nazwisko, Koledzy(I).NrTel
    NEXT I

    ' Wypisuje cala baze danych
    FOR I = 0 TO 2
      PRINT Koledzy(I).Nazwisko; ": "; Koledzy(I).NrTel
    NEXT I

Rozdział 26 - Odczytywanie i zapisywanie plików

Do tej pory nasze programy były zależne od programisty, podającego im dane do pracy. To nie działałoby dobrze w przypadku programu książki telefonicznej. Użytkownik powinien wypełnić nazwiska i numery telefonów. QBASIC pozwala dostać informację od użytkownika przez INPUT. Ale gdy program się kończy, ta informacja przepada.

Zapisywanie do pliku

Rozwiązaniem tego problemu jest pozwolić użytkownikowi wprowadzić informację, a następnie program będzie przechowywał ją w pliku na twardym dysku. QBASIC oferuje szereg sposobów, aby to wykonać. Spróbuj tego:

    INPUT "Wpisz swoje imie: ", Imie$
    OPEN "testfile.txt" FOR OUTPUT AS #1
    WRITE #1, Imie$
    CLOSE #1

Gdy uruchomisz ten program i wpiszesz swoje imię, umieści on je w pliku na twardym dysku nazwanym "testfile.txt". Możesz posłużyć się Notatnikiem, aby go odnaleźć i sprawdzić, że twoje imię tam jest. Możesz potrzebować rozgryźć, gdzie QBASIC umieszcza plik. Będzie to trochę skomplikowane. Jeśli wyjdziesz z QBASIC-a i spod DOS-a wpiszesz to:

  type testfile.txt

powinieneś zobaczyć swoje imie i wszystko, cokolwiek wpisałeś. Komenda DOS-a "type" kopiuje zawartość pliku na ekran. Mógłbyś spróbować także tego:

  notepad testfile.txt

To powinno wywołać Notatnik z twoim plikiem. Kiedy pracujesz z plikami, dobrym pomysłem jest wiedzieć, jak wprowadzać je do Notatnika. W ten sposób możesz je podglądać aby sprawdzić, czy zawierają one to, czego oczekiwałeś.

OPEN, WRITE i CLOSE

Są trzy polecenia: OPEN, WRITE i CLOSE, które są potrzebne do zapisywania informacji do pliku. Polecenie OPEN (Otwórz) mówi QBASIC-owi trzy rzeczy:

  1. nazwę pliku (testfile.txt);
  2. czy chcemy zapisywać do pliku (OUTPUT), czy czytać z pliku (INPUT);
  3. numer pliku (#1 w tym przykładzie).

Kiedy plik już jest otwarty, będziemy używać numer pliku, aby QBASIC wiedział, do którego pliku chcemy zapisywać. Mógłbyś mieć dużo plików otwartych w tym samym czasie, tak więc numer pliku pozwala QBASIC-owi wiedzieć, z którym plikiem chcesz pracować.

Polecenie WRITE (Pisz) mówi QBASIC-owi, do którego pliku chcemy zapisywać (#1), i co chcemy zapisywać (Nazwa$). Jest to bardzo podobne do polecenia PRINT, lecz zamiast wysyłania informacji na ekran WRITE wysyła je do pliku.

Na koniec trzeba zamknąć (CLOSE) plik, aby QBASIC wiedział, że skończyliśmy. W przeciwnym razie QBASIC nie mógłby w ogóle niczego zapisać do pliku. Polecenie CLOSE potrzebuje wiedzieć tylko, który plik chcemy zamknąć, więc wymaga tylko numeru pliku.

Odczytywanie z pliku

Następujący program pobierze imię i wypisze je na ekranie:

    OPEN "testfile.txt" FOR INPUT AS #1
    INPUT #1, Imie$
    CLOSE #1
    PRINT Imie$

Trzy są główne rzeczy odmienne w tym programie, jeśli porównasz go z poprzednim.

  1. Polecenie OPEN używa "INPUT" zamiast "OUTPUT". Mówi to QBASIC-owi, że zamierzamy pobrać dane z pliku.
  2. Polecenie INPUT, które widzieliśmy przedtem, jest użyte do czytania z pliku. #1 mówi mu, że chcemy czytać z pliku #1. Kiedy używaliśmy INPUT w innych programach, nie było tam #1. Bez numeru pliku INPUT pobiera dane z klawiatury. Z numerem pliku - pobiera dane z pliku.
  3. Zamiast pobierać cokolwiek od użytkownika na początku programu, wyświetlamy na końcu to, co zostało odczytane z pliku, dobrym starym poleceniem PRINT.

Rzeczą, która się nie zmieniła w ogóle, jest polecenie CLOSE. Zamykamy plik #1 aby QBASIC wiedział, że z nim skończyliśmy. Chociaż prawdopodobnie nie stracimy żadnych danych, jeśli nie zamkniemy pliku w tym przypadku, jest to nadal dobra rzecz do zrobienia. QBASIC może otworzyć tak dużo plików, że jeśli zostawimy jeden otwarty, nie będziemy mogli otworzyć żadnego więcej.

Prowadzenie logu

Czasami może być bardzo przydatne zapisać do pliku, kiedy program został uruchomiony, aby móc zobaczyć, co zdarzyło się potem. Nazywa się to "prowadzeniem logu". Możemy użyć opcję "APPEND" (Dołącz) w poleceniu OPEN do otwarcia pliku i po prostu dopisywać do jego końca.

  OPEN "logfile.txt" FOR APPEND AS #1
  PRINT #1, "Program Start: "; TIME$
  CLOSE #1

  CLS
  INPUT "Wpisz swoje imie"; Imie$
  PRINT "Czesc, "; Imie$

  OPEN "logfile.txt" FOR APPEND AS #1
  PRINT #1, "Program Stop: "; TIME$
  CLOSE #1

W tym programie zalogowaliśmy dwie rzeczy, czas startu programu i czas jego zakończenia. Uruchom program kilka razy, po czym wyjdź z QBASIC-a i wpisz:

  notepad logfile.txt

To pokaże ci, co znajduje się w twoim logu.

Odczytywanie z plików

Pomysły: Wyrocznia używająca plik tekstowy na wejściu. Mogłoby to być kombinacją tablic z odczytem z pliku.

Tropienie śladów

Powiedzmy że chcemy, aby nasz program pamiętał, kto się do niego zarejestrował. Chcemy także zliczać, ile razy był uruchamiany. Moglibyśmy spróbować czegoś takiego:

  CLS
  INPUT "Wpisz swoje imie aby zarejestrowac sie w programie: ", Imie$
  PRINT "Dziekuje, "; Imie$
  Zliczaj = Zliczaj + 1
  PRINT "Program jest zarejestrowany dla: "; Imie$
  PRINT "Ten program byl uruchamiany"; Zliczaj; "razy."
  PRINT "Mamy nadzieje ze dobrze sie bawiles."

Ale to nie zadziała. Dlaczego? Ponieważ QBASIC nie może pamiętać wartości zmiennych Imie$ i Zliczaj od jednego uruchomienia programu do następnego.

Aby to poprawić, musimy posłużyć się plikiem. Możemy odczytać plik zanim program wystartuje i zapisać plik z powrotem, gdy program będzie się kończył. W tym pliku zapiszemy imię użytkownika i ile razy program był uruchomiony.

Kod, który to robi, jest nieco bardziej złożony niż te, które robiliśmy dotąd. Jest tak, ponieważ QBASIC obsługuje błędy plikowe w dziwny sposób. Nasz program musi obsłużyć jeden błąd pliku. Gdy będzie uruchamiany po raz pierwszy, nie będzie jeszcze pliku rejestracyjnego, który ma on odczytać. Tak więc OPEN nie powiedzie się. Musimy to obsłużyć, inaczej nasz program nie będzie działał.

' Jesli sa jakies klopoty, QBASIC skoczy do ErrorHandler ponizej.
ON ERROR GOTO ErrorHandler

' To jest kod bledu ktory jest zapisywany
' przez obsluge bledu (error handler).
DIM ErrorCode AS INTEGER

CLS

' Zawsze zeruj to, zanim zrobisz cos, co chcesz sprawdzic.
ErrorCode = 0
' Probuj dostac imie i licznik z pliku.
OPEN "register.txt" FOR INPUT AS #1

' Jezeli nie ma pliku
IF ErrorCode = 53 THEN
  ' Pobierz imie od uzytkownika
  INPUT "Wpisz swoje imie aby zarejestrowac sie w programie: ", Imie$
  PRINT "Dziekuje, "; Imie$
  ' i ustaw licznik na 0
  Zliczaj = 0
ELSE
  ' Pobierz imie i licznik z pliku.
  INPUT #1, Imie$, Zliczaj
  CLOSE #1
END IF

Zliczaj = Zliczaj + 1
PRINT "Program jest zarejestrowany dla: "; Imie$
PRINT "Ten program byl uruchamiany"; Zliczaj; "razy."
PRINT "Mamy nadzieje ze dobrze sie bawiles."

' Zapisz imie i licznik dla nastepnego uruchomienia.
OPEN "register.txt" FOR OUTPUT AS #1
WRITE #1, Imie$, Zliczaj
CLOSE #1

' Ten END chroni nas przed uruchomieniem obslugi bledu
' przy koncu programu. Powoduje zatrzymanie programu,
' tak jak nacisniecie klawisza Break.
END

' QBASIC skoczy tutaj, jezeli przytrafi sie blad.
ErrorHandler:
' Musimy przeniesc kod bledu do zmiennej, inaczej go nie
' zobaczymy, poniewaz ERR jest zerowany kiedy handler
' zakonczy sie.
ErrorCode = ERR
RESUME NEXT

Obsługa błędów plikowych

"ON ERROR GOTO ErrorHandler" mówi QBASIC-owi, że kiedy jest problem, program powinien bezpośrednio skoczyć do "ErrorHandler:" - podprogramu obsługi błędów, który zobaczysz na końcu programu. Tutaj możemy otrzymać kod błędu, który znajduje się w zmiennej QBASIC-a zwanej "ERR" i skopiować go do naszej własnej zmiennej "ErrorCode". Jeżeli tego nie zrobimy, stracimy kod błędu przechowywany w ERR. RESUME NEXT każe QBASIC-owi kontynuować program od miejsca, gdzie wystąpił błąd.

Próbuję bardzo konsekwentnie unikać używania GOTO w moich programach. Programy używające GOTO mogą być bardzo trudne do zrozumienia. Niestety, w tym przypadku QBASIC pozostawia nas bez alternatywy. Musimy użyć GOTO. Tak więc próbowałem użyć najprostszego rozwiązania, które pozostawia kod łatwym do prześledzenia. Mając ten mały podprogram obsługi błędu, możemy po prostu założyć, że ErrorCode będzie zawierał numer błędu, jeżeli coś pójdzie źle. Nie można tylko zapomnieć o wyzerowaniu go, w przeciwnym razie będziesz oglądać stare błędy!

Swobodny I/O

Do tego miejsca stosowalismy coś, co nazywa się "Sekwencyjny I/O". Sekwencyjny oznacza "jeden po drugim". I/O pochodzi od Input/Output - Wejście/Wyjście. Kiedy zapisywaliśmy do pliku imię użytkownika i licznik uruchomień, wpisywaliśmy je jedno po drugim. To jest zapis sekwencyjny. Gdy odczytywaliśmy imię i licznik, czytalismy je jedno po drugim. Najpierw imię, potem licznik. To jest odczyt sekwencyjny. Wszystko razem daje nam "sekwencyjne wejście i wyjście" czyli "sekwencyjny I/O".

Swobodny I/O pozwala czytać i zapisywać dane do dowolnej części pliku, w kolejnosci, w jakiej chcemy. Jest to bardzo przydatne, gdy masz bardzo duże pliki i nie masz dosyć czasu lub pamięci, by czytać wszystko z pliku sekwencyjnie (jedno po drugim). Swobodny I/O (Random I/O) pozwala skoczyć wprost do potrzebnych danych w pliku i czytać lub zapisywać je.

Nawet w bardzo dużych i złożonych programach swobodny I/O jest rzadko używany z powodu jego złożoności. Wyobraźmy sobie, że program ma błąd i zapisuje złe miejsce w pliku! Plik w ten sposób zostanie zniszczony. Nie będziemy tu omawiać swobodnego I/O. Ale, jeśli go potrzebujesz, jest on w QBASIC-u.


Rozdział 27 - Przykładowe programy

Czytaj QBASIC Help

Nauczyłeś się dużo. Jeśli dotarłeś do tego miejsca i nadal dobrze się bawisz, to czas zrobić trochę własnych programów. Pomoc do QBASIC-a jest tym, co powinieneś czytać, gdy tylko jesteś zaciekawiony, co jeszcze QBASIC potrafi robić. On może znacznie wiecej, niż pokazałem ci w tym podręczniku.

Niektóre z następnych przykładów mogą robić rzeczy, o których nie widziałeś wzmianki w książce. Zobacz, jeśli możesz dowiedzieć się, jakie są te nowe rzeczy, zaglądając do Pomocy, która jest dołączona do QBASIC-a.

(Pomoc do QBasic-a - QBASIC Help, dostępna w interpreterze QB - jest oczywiście w języku angielskim. Ale jej przekład na polski możesz znaleźć tutaj. Przyp. tłum.)

Zgadywacz Liczb

W tej grze komputer wytwarza liczbę między 1 i 10. Próbuj odgadnąć tą liczbę.

    CLS
    RANDOMIZE TIMER
    PRINT "Witamy w Zgadywaczu Liczb."
    PRINT "Mysle o liczbie miedzy 1 a 10."
    Liczba = INT(RND * 10 + 1)
    DO
      INPUT "Co odgadles? ", Zgad
      IF Zgad = Liczba THEN
        PRINT "Dobrze!"
        EXIT DO
      ELSE
        PRINT "Sprobuj jeszcze raz."
      END IF
    LOOP

Dodatkowe rzeczy

Budzik

Więcej przykładów

Mam nieco więcej przykładów na mojej stronie "SupaSoft". Po prostu szukaj "QBASIC". Oto kilka, które możesz tam znaleźć:

Uwaga: Jeżeli wpisujesz ręcznie te adresy stron, sprawdź, czy wstawiłeś duże litery dokładnie tak, jak pokazano. Np. sprawdź, czy wpisałeś "SupaSoft", a nie "supasoft". Jeżeli w przeglądarce dostajesz komunikat "Nie można wyświetlić strony", prawdopodobnie to jest powodem.

http://www.tedfelix.com/SupaSoft/snowflak.html - Snowflake: Generator płatków śniegu. Jak prawdziwe śnieżynki, nie ma dwóch takich samych.

http://www.tedfelix.com/SupaSoft/strsplt2.html - Star Split 2: Symulacja gwiaździstego nieba.

http://www.tedfelix.com/SupaSoft/willtell.html - William Tell: Udawaj Wilhelma Tella i próbuj zestrzelić strzałą jabłko z głowy zakładnika.

http://www.tedfelix.com/SupaSoft/capture.html - Capture: Próbuj złapać w pułapkę dwa roboty w labiryncie z bloków.

http://www.tedfelix.com/SupaSoft - Moja strona z programami freeware. Poszukuj "QBASIC" w opisach programów, aby znaleźć próbki QBASIC-a.


Dodatek A - Znajdowanie i instalowanie QBASIC-a

Jeżeli widzisz komunikat "Złe polecenie lub nazwa pliku", to potrzebujesz dostać QBASIC dla twojej maszyny.

Niestety, nie jest to najłatwiejsza rzecz na świecie. Możesz poprosić kogoś, żeby przebrnął przez to razem z tobą.

W Internecie

Jest kilka miejsc w Internecie, gdzie możesz dostać kopię QBasic-a. Zazwyczaj plik nazywa się "qbasic.zip". Oto parę miejsc, które znalazłem:

Prawdopodobnie jest dużo innych miejsc do znalezienia. Użycie wyszukiwarki, np. www.google.com i szukanie "qbasic.zip" zazwyczaj daje dobre wyniki. Jeśli trafisz na QBasic w ten sposób, sprawdź, czy dostałeś "interpreter version 1.1". Jest to wersja QBasic-a, którą stosowałem, pisząc ten podrecznik. Jest najłatwiejsza w użyciu i najmniej skomplikowana. Kiedy już używasz wersję 1.1, możesz spróbować i znaleźć wer. 4.5, która ma kilka sympatycznych właściwości.

W polskim Internecie najłatwiej jest dostać QBasic ze strony AGH http://adam.imir.agh.edu.pl/dydakt/basic/index.htm. Jest tam również skrócony opis języka i zestaw ćwiczeń dla studentów. (Przyp. tłum.)

Kiedy już masz qbasic.zip, trzeba go rozpakować i przenieść qbasic.exe i qbasic.hlp do katalogu c:\windows\command . Każdy, kto jest obeznany z plikami "zip", pomoże ci to zrobić.

Windows 95

QBASIC jest na CD-ROMie Windows 95. Włóż CD z Windows 95 do napędu CD-ROM. Powinno wyskoczyć okno, które zamkniesz (klikając na "X" w prawym górnym rogu okna).

DOS czy Windows?

Są dwie drogi skopiowania plików QBASIC-a do komputera. Użycie Trybu MS-DOS jest metodą najszybszą, lecz trzeba znać literę dysku CD (np. "d:", "e:" lub "z:"). Metoda opisana w "Eksplorator Windows" jest nieco powolniejsza, ale nie potrzebujesz znać litery dysku CD.

Tryb MS-DOS

Powinieneś już być w trybie MS-DOS, próbując startu QBASIC-a. To czyni sprawę łatwiejszą. Przyjmę, że twój CD-ROM ma literę "d:". Jeżeli tak nie jest, wpisz prawidłową literę w komendzie "copy" poniżej. (<Enter> znaczy "Naciśnij klawisz <Enter>"):

     c: <Enter>
     cd \windows\command <Enter>
     copy d:\other\oldmsdos\qbasic.* <Enter>

Od tłumacza:     QBASIC jest też na CD instalacyjnym Windows 98, ale w innym folderze. Jeżeli używasz płyty Windows 98, w komendzie "copy" wpisz:

     copy d:\tools\oldmsdos\qbasic.* <Enter>

To powinno skopiować qbasic.exe i qbasic.hlp do twojego komputera. Przeskocz do części "Skończone!" aby sprawdzić, czy wszystko poszło dobrze.

Eksplorator Windows

Jeśli nie chcesz próbować metody z trybem MS-DOS, także Eksplorator Windows może być użyty do przekopiowania QBASIC-a. Potrzebujemy Eksploratora Windows (nie Internet Explorer'a!), aby skopiować pliki QBASIC-a z CD do katalogu c:\windows\command. Kliknij przycisk "Start", potem "Programy", potem "Eksplorator Windows". Z lewej strony zobaczysz listę dysków twojego komputera. Spójrz na napęd CD (ma on mały obrazek CD, a za nim powinien być opis "Windows 95"). Kliknij na tą ikonkę. W prawej kolumnie zobaczysz listę katalogów na CD.

Znajdowanie QBASIC-a.     Kliknij podwójnie na "Other", potem podwójnie na Oldmsdos. Teraz zobaczysz listę plików. Przeglądaj tą listę, aż znajdziesz dwa pliki nazwane Qbasic. Jeden to sam QBASIC, a drugi jest plikiem pomocy.

Wybieranie plików QBASIC-a     Chcemy skopiować te dwa pliki do katalogu c:\windows\command. Kliknij na pierwszy plik QBasic-a, aż zrobi się niebieski. To oznacza, że jest on wybrany. Potrzebujemy także drugi plik QBasica. Naciśnij i przytrzymaj klawisz <Ctrl>, kiedy będziesz klikać na drugi plik. Teraz obydwa powinny być niebieskie. To znaczy, że oba są wybrane (zaznaczone).

Kopiowanie do Schowka     Naciśnij klawisz <Ctrl> i trzymaj go wciśnięty, i teraz naciśnij klawisz C. To skopiuje pliki do Schowka.

C:\Windows\Command     Teraz kliknij "Narzędzia" w menu Eksploratora Windows, a następnie kliknij "Idź do...". Wpisz:

     c:\windows\command
i naciśnij klawisz <Enter>.

Wstawianie ze Schowka     Teraz naciśnij klawisz <Ctrl> i trzymając go wciśnięty, naciśnij V. To wstawi pliki QBasic-a ze Schowka do katalogu c:\windows\command.

Odmienności Windows 98 SE i Windows XP

(Od tłumacza)       W Windows 98 SE i Windows XP zakładka "Narzędzia" Eksploratora Windows nie ma opcji "Idź do...". Trzeba byłoby więc przenieść się do katalogu c:, otworzyć folder WINDOWS, znaleźć i otworzyć folder COMMAND i dopiero tam wstawić pliki przez naciśnięcie Ctrl-V. Jednak często folder WINDOWS jest chroniony przed dostępem intruzów.
Co pozostaje? Stara, poczciwa dyskietka. Można ją zresztą użyć niezależnie od posiadanego systemu. W menu "Plik" Eksploratora Windows kliknij opcję "Wyślij do" i następnie kliknij "Dyskietka 3,5". Pliki QBasic-a zostaną skopiowane na dyskietkę. Po tej operacji na dyskietce zostanie jeszcze 1 132 032 bajtów wolnych - wystarczająco dużo dla twoich programów. QBASIC można będzie uruchomić, otwierając "Mój komputer", klikając na "Dyskietka 3,5" i następnie na qbasic.exe.

Podobnie jak na dyskietce, można umieścić QBasic w jakimkolwiek folderze na twardym dysku. Można wtedy zrobić do niego skrót na pulpicie. W tym celu kliknij PRAWYM przyciskiem myszy na qbasic.exe, wybierz "Wyślij do" i "Pulpit (utwórz skrót)". Skrót zostanie umieszczony na Pulpicie.

Skończone!

Uff! To by było tyle.

Możesz zamknąć Eksploratora Windows (jeżeli go używałeś), wrócić do okienka Trybu MS-DOS (C:\WINDOWS>_ lub C:\WINDOWS\COMMAND>_), wpisać:

     qbasic
i nacisnąć klawisz <Enter>.


Książki o QBASICu

W oryginale autor przedstawia szereg książek o QBasicu, napisanych po angielsku. Z rzeczy przełożonych na polski znam tylko jedną:

G.Perry QBasic Kurs na zderzenie

QBasic Kurs na zderzenie! Greg Perry, Intersoftland, W-wa 1993

Obszerna (275 str.) książka z licznymi przykładami uczy używania większości poleceń QBasica. Nie uwzględnia stosowania procedur SUB i FUNCTION, tak więc styl programowania jest bardziej zbliżony do GW-Basica.


Other Websites

Od tłumacza: W polskim Internecie jest także parę stron na temat QBasica, często "przyklejonych" do tematu Visual BASIC; wypróbuj wyszukiwarkę Google. Prawie wszystkie dostępne po polsku kursy QBasica zgromadzone są na stronie http://members.lycos.co.uk/kursyprogramowania/kursy.php?id=k_basic&____ord____=1169559776


Copyright 2007, Ted Felix, All Rights Reserved
May be copied or translated freely for non-commercial use.



Słowniczek
[w nawiasach prostokątnych - przybliżona wymowa]

A
append [apend] - dołącz
C
case [kejs] - przypadek
circle [serkl] - okrąg
close [klouz] - zamknij
color [kolor] - kolor
D
data [deite] - dane
debug [dibag] - (inform.) usuwać błędy
declare [diklejr] - deklarować
DOS - Disk Operating System. Dyskowy System Operacyjny; w dawniejszych komputerach zespół programów zarządzających plikami na dysku, w obecnych maszynach symulowany dla zgodności ze starym oprogramowaniem.
do [duu] - rób
draw [drou] - rysuj
E
edit - edytuj, redaguj
else [els] - inaczej, w przeciwnym razie
end - koniec
error [eror] - błąd
escape [iskejp] - ucieczka
exit [eksit] - wyjście
F
file [fajl] - plik
for - dla
G
go to [gou tu] - idź do
H
help - pomoc
I
if - jeżeli
if ... then... - jeżeli ... to...
input - (elektr.,inform.) wejście, dane wejściowe
L
left - lewy, lewa strona
line [lajn] - linia
locate [loukeit] - umiejscowić
loop [luup] - pętla
M
middle [midl] - środek
N
name [neim] - imię, nazwisko, nazwa
new [nju] - nowy
next [nekst] - następny
O
open [oupn] - otwórz
option [opszn] - opcja, wybór
or - albo
output [autput] - (elektr.,inform.) wyjście, dane wyjściowe
P
paint [pejnt] - maluj
play [plej] - graj
print - drukuj
R
read [riid] - czytaj
restore [ristoor] - przywróć
right [rajt] - prawy, prawa strona
run [ran] - biegnij
S
save [seiw] - ratować, zachowywać, tu: zapisz na dysk
screen [skriin] - ekran
search [sercz] - szukaj
select [silekt] - wybierz
sleep [sliip] - śpij
sound [saund] - dźwięk
space [speis] - przestrzeń, tu: spacja
static [statik] - statyczny, nieruchomy
step - krok
string - sznurek, tu: ciąg znaków
T
time [tajm] - czas
V
view [wju] - widok
W
while [uail] - podczas gdy
write [rajt] - pisz

http://deger.republika.pl