13.11.2009 - NK Fisherman w PC World
"Piątek trzynastego" mogę uznać za udany dzień - program NK Fisherman 1.0.1.21 został zamieszczony na płycie DVD magazynu PC World (numer grudniowy).

17.10.2009 - Zmiany na stronie
Dodałem krótki spis planowanych zmian w RegMast 0.5.0

10.10.2009 - Generator Częstotliwości Podakustycznych
Ukazała się oficjalna wersja programu Generator Częstotliwości Podakustycznych, dodatkowo wprowadziłem szereg drobnych zmian na stronie, oraz zaktualizowałem przestarzałe treści ;)

20.09.2009 - NK Fisherman 1.0.1
Do pobrania jest dostępna poprawiona wersja programu NK Fisherman.

18.09.2009 - NK Fisherman 1.0.0 RC1
Do pobrania jest dostępna wersja testowa programu NK Fisherman. Program umożliwia wyłączenie śledzika z portalu Nasza-Klasa (dla części przeglądarek proces jest wykonywany automatycznie).


  Strona główna
  O autorze
  Kurs Basica
  Download


  RegMast
     Informacje
     Wersja 0.5.0
     Screeny

  Labirynt
     Informacje
     Screeny

  Generator Częstotliwości
   Podakustycznych

     Informacje
     Screeny

  Pozostałe
     NK Fisherman
     Genus
     PDOSWP



  Adres email:
  Email

  
  Ustaw jako startową

  Ilość odwiedzin
  





     Poniżej przedstawiam kurs Basica mojego autorstwa. Kurs składa się z opisu kompilatora, dziewięciu części teoretyczno-praktycznych, oraz dwóch typowo praktycznych. W każdej części kursu znajdują się liczne przykłady ułatwiające zrozumienie języka. W kursie (który nawiasem mówiąc pisałem przez ładnych kilkanaście godzin) zawarłem prawie całą swoją wiedzę na temat basica. Mam nadzieję, że moja wiedza komuś się przyda. Wszystkie opisane tu polecenia i przykłady działają poprawnie w QuickBasicu 4.5, oraz QBasicu 1.0. Jeżeli chcesz dowiedzieć się więcej na temat QuickBasica wejdź tutaj. Na stronie znajdziesz historię kompilatora, oraz pliki różnych kompilatorów do pobrania (ostrzegam, iż nie wiem czy pliki są legalne, dlatego nie zamieszczam ich na swojej stronie i nikogo nie namawiam do ich ściągania - pliki ściągasz na własną odpowiedzialność). Na końcu kursu zamieściłem dodatkowe linki do różnych ciekawych stron związanych z programowaniem w basicu. Znalazł się tam również bezpośredni link do spakowanych przykładów zaprezentowanych na tej stronie, co z pewnością usprawni naukę. Skoro wstęp mamy już za sobą, czas brać się do roboty.



     Jeżeli masz ściągnięty kompilator Basica, uruchom go klikając dwukrotnie na ikonie pliku QBasic.exe (lub QB.exe). Poniżej przedstawiam zrzut ekranu kompilatora QBasic 1.0:



     W górnej części ekranu mamy belkę z dostępnymi komendami i opcjami (1), poniżej ekran przeznaczony do edycji projektu (2) oraz nazwie obecnego projektu (3). Krótki opis górnej belki przedstawiam poniżej:

File - operacje na plikach
New - tworzymy nowy plik programu
Open... - otwieramy wcześniej utworzony plik programu
Save - zapisujemy program
Save as... - zapisujemy program w nowym pliku
Print... - drukujemy kod programu
Exit - wychodzimy z kompilatora

Edit - opcje edytowania
Cut - wytnij
Copy - kopiuj
Paste - wklej
Clear - usuń
New SUB... - tworzy nowy podprogram
New FUNCTION... - tworzy nową funkcję

View - opcje podglądu
SUBs... - podgląd podprogramów
Split - pozwala podzielić okno na dwie części, co umożliwia pracę na dwóch plikach w tym samym czasie
Output Screen - pozwala zobaczyć co kompilator wyświetlił podczas ostatniego uruchomienia programu

Search - opcje wyszukiwania
Find... - pozwala znaleźć interesujący nas ciąg znaków
Repeat Last Find - przechodzi do kolejnego wyrażenia (ustawionego w Find...)
Change... - pozwala znaleźć i zamienić ciąg znaków z jednego na drugi

Run - opcje uruchamiania
Start - uruchamia napisany program
Restart - restartuje program
Continue - kontynuuje wykonywanie programu

Debug - opcje debugowania
Step - program będzie uruchamiany krok po kroku
Procedure Step - wykonaj obecny krok
Trace on - śledzenie programu
Toogle Breakpoint - nakazuje programowi zatrzymanie się w linii programu, w której znajduje się punkt stopu (linia podświetlona na czerwono)
Clear All Breakpoints - usuwa wszystkie punkty stopu
Set Next Statement - ustawia kolejny...

Options - opcje programu
Display... - pozwala ustawić kolory tekstu, okien, itp.
Help Path... - pozwala na podanie ścieżki dostępu do pliku QBasic.hlp
Syntax Checking - włącza/wyłącza sprawdzanie poprawności kodu programu

Help - pomoc
Index - indeks poleceń
Contents - spis treści (tematów pomocy)
Topic: xxxxx - wyświetla informacje na temat xxxxx
Using Help - porady jak używać pomocy
About... - informacje na temat kompilatora



     Skoro już zaznajomiłeś się z obsługą kompilatora, możemy zacząć kurs. Pierwszym poleceniem jakie należy poznać jest: CLS. To Polecenie jest odpowiedzialne za wyczyszczenie ekranu i ustawienie kursora w lewym górnym rogu. O przydatności tego polecenia chyba nie trzeba za dużo mówić. Jeżeli potrzebujesz czystego ekranu po prostu piszesz CLS i ekran jest pusty. Następnym poleceniem z jakim Cię zapoznam będzie PRINT, dzięki któremu na ekranie można napisać dowolny ciąg znaków. Polecenie PRINT może służyć również do innych celów, na razie jednak skoncentruję się na tym jednym. Zastosowanie obu powyższych poleceń przedstawia program:

10 CLS
20 PRINT "Twoj pierwszy program"


Efektem tego programu jest wyczyszczenie ekranu i napisanie tekstu znajdującego się między cudzysłowami. Polecenie PRINT można skrótowo zastąpić znakiem zapytania ? - kompilator automatycznie zamieni ? na PRINT. Polecenia PRINT można również użyć do wyświetlenia wyników matematycznych np:

10 CLS
20 PRINT 10+20


W efekcie otrzymamy wynik 30. Skoro zajmujemy się poleceniem PRINT, warto poznać dwa inne polecenia pośrednio z nim związane. Pierwszym z nich jest LOCATE y,x odpowiedzialne za ustawienie kursora w pozycji x (poziom) i y (pion). Dzięki niemu można w bardzo precyzyjny sposób umieścić tekst na ekranie. Drugim poleceniem jest COLOR tekst,tło, który umożliwia zmianę koloru tekstu, oraz koloru tła. Prezentuje to kolejny przykład:

10 CLS
20 LOCATE 5,3
30 COLOR 14
40 PRINT "Tekst w miejscu (5,3) o kolorze zoltym"
50 LOCATE 10,6
60 COLOR 10,5
70 PRINT "Tekst w miejscu (10,6) o kolorze zielonym na fioletowym tle"


Powyższy program można zapisać na różne sposoby. Można np: zamienić miejscami polecenia LOCATE i COLOR, a efekt programu będzie identyczny jak ten powyżej. Należy jednak pamiętać, że kolejność poleceń jest BARDZO ISTOTNA. Niektóre polecenia mogą być zamienione miejscami, inne nie. Jeżeli zamienimy miejscami polecenia COLOR oraz PRINT, tekst nie zostanie napisany na żółto - kolor zmieni się dopiero po napisaniu tekstu. Należy o tym pamiętać ! Poza tym istnieje możliwość zapisania programu w sposób bardziej skrótowy:

10 CLS: LOCATE 5,3: COLOR 14: PRINT "Tekst w miejscu (5,3) o kolorze żółtym": LOCATE 10,6: COLOR 10,5: PRINT "Tekst w miejscu (10,6) o kolorze zielonym na fioletowym tle"

Jak widać, wszystkie polecenia zostały zapisane w jednej linijce kodu. Korzystając ze znaku dwukropku : można łączyć kilka poleceń w jednej linijce.

     Po pewnym czasie, gdy będziesz już pisał większe programy, może się okazać że zrozumienie tego co napisałeś dwa dni temu sprawia ci kłopot. W takich przypadkach przydaje się polecenie komentarza REM. Wszystko co po nim napiszesz zostanie pominięte przez kompilator np:

10 CLS
20 REM Pierwszy program
30 PRINT "Twoj pierwszy program"


Polecenie REM możesz zastąpić znakiem ' (pod klawiszem z cudzysłowem)

10 CLS
20 PRINT "Twoj pierwszy program" 'to jest druga linia programu

Zanim przejdziemy do bardziej ambitnych rzeczy (zmiennych) przedstawię jeszcze jedno polecenie: SLEEP x, dzięki któremu zatrzymamy pracę programu na czas X sekund. Gdy wstawimy do programu polecenie SLEEP x, program zatrzyma swoje działanie i zacznie pracować dalej gdy upłynie określona ilość sekund, lub użytkownik naciśnie dowolny klawisz.

10 CLS
20 PRINT "Pierwsza linijka tekstu"
30 SLEEP 3
40 PRINT "Druga linijka tekstu"

     Zapewne zauważyłeś, iż każda linia kodu zaczyna się od pewnej liczby (czym dalszy element programu tym większa liczba). Nie każda linia musi być numerowana - numerowane muszą być jedynie te linie, do których znajdują się odnośniki w programie. W zawartych na tej stronie przykładach numerowałem każdą linię ponieważ łatwiej mi wytłumaczyć działanie prezentowanego przykładu.



     Skoro poznałeś już podstawowe polecenia, możemy przejść do drugiej części kursu programowania. Rozpoczniemy go od polecenia INPUT, oraz od zmiennych. Polecenie INPUT służy do komunikacji użytkownika z komputerem. Zanim rozpocznę dokładną definicję polecenia, przyjrzyjmy się poniższemu przykładowi:

10 REM Prg2.1 - Polecenie INPUT
20 CLS
30 INPUT "Jak masz na imię ";imie$
40 INPUT "Ile masz lat";rok
50 PRINT "Na imie masz ";imie$
60 PRINT "Masz";rok;"lat"

Pierwsze dwa polecenia powinny być już zrozumiałe, więc zajmijmy się poleceniami zawartymi w linijkach 30 i 40. Podczas polecenia INPUT komputer zatrzymuje swoje działanie i czeka na odpowiedź na postawione pytanie w "cudzysłowie". Gdy odpowiemy, komputer zapisuje informacje do zmiennej (tutaj: rok i imie$). Następnie dzięki poleceniu PRINT komputer pokazuje nam owe zmienne (linijki 50 i 60). Jeżeli chodzi o zmienne, wyróżniamy ich dwa typy:

LICZBOWE - w których mogą być przechowywane tylko cyfry i liczby. Zapisuje się je w postaci liter (np: a, b, c, rok, wiek), lub liter z dodatkiem liczb (a1, b2, itp);

TEKSTOWE - w których mogą być przechowywane wszystkie znaki. Zapisuje się je w postaci liter (lub liter + liczb) z dodatkową końcówką $ (np: a$, b$, c$, rok$, wiek$, a1$, b2$, itp)

Zmienne znajdują praktyczne zastosowanie w każdym programie i pełnią bardzo ważną rolę - pozwalają na zapamiętanie informacji. Jak nazwa wskazuje, zmienne mogą się zmieniać w trakcie pracy programu. Należy również nadmienić, iż zmienne możemy dodawać, odejmować, mnożyć, dzielić itd., co przedstawia poniższy przykład:

10 REM Prg2.2 - Wykorzystanie polecenia INPUT
20 CLS
30 A=10 : B=5
40 PRINT "A+B"; A+B
50 PRINT "A-B"; A-B
60 PRINT "A*B"; A*B
70 PRINT "A/B"; A/B

W lini 30 zostały ustalone zmienne A i B (zostały oddzielone dwukropkiem). W kolejnych liniach program wyświetla wyniki poszczególnych działań matematycznych wykorzystując polecenie PRINT (schemat: PRINT "jakiś tekst" ; zmienna obliczenie matematyczne zmienna). Pomimo faktu, że program pokazuje nam wynik działań matematycznych, wartość zmiennych nie zmienia się. Aby wartość zmiennej zmieniła się należy skorzystać ze schematu: nazwazmiennej = nowawartosc. Jeżeli chcesz dodać do zmiennej jakąś liczbę, powinieneś skorzystać z następującego schematu: nazwazmiennej=nazwazmiennej+jakaswartosc. W tym wypadku wartość zmiennej będzie się równała samej sobie + jeszcze jakaś wartość. Powyższy program można zmodyfikować tak, aby umożliwić użytkownikowi pewną interakcję z programem. W tym celu skasujmy linię 30 i dodajmy dwie poniższe:

30 INPUT" Podaj liczbe numer 1 (A)"; A
35 INPUT" Podaj liczbe numer 2 (B)"; B

Dzięki temu zabiegowi program będzie wyglądał następująco:

10 REM Prg2.3 - Wykorzystanie polecenia INPUT (2)
20 CLS
30 INPUT" Podaj liczbe numer 1 (A)"; A
35 INPUT" Podaj liczbe numer 2 (B)"; B
40 PRINT "A+B"; A+B
50 PRINT "A-B"; A-B
60 PRINT "A*B"; A*B
70 PRINT "A/B"; A/B

Dzięki poleceniu INPUT, komputer zadaje pytanie użytkownikowi o wartość liczby A (linia 30), oraz liczby B (linia 35), po czym pokazuje wyniki prostych działań matematycznych. Podobnie jak zmienne liczbowe, również zmienne tekstowe można w bardzo prosty sposób dodawać (odejmowanie, mnożenie i dzielenie z wiadomych przyczyn nie jest możliwe). Prezentuje to poniższy przykład:

10 REM Prg2.4 - Wykorzystanie polecenia INPUT (3)
20 CLS
30 INPUT" Podaj tekst numer 1 (A)"; A$
35 INPUT" Podaj tekst numer 2 (B)"; B$
40 PRINT "A+B"; A$+B$
50 PRINT "B+A"; B$+A$

Warto nadmienić, że za pomocą jednej komendy INPUT możemy wpisać kilka zmiennych, które należy oddzielić przecinkami. Widać to na poniższym przykładzie:

10 REM Prg2.5 - Wykorzystanie polecenia INPUT (4)
20 CLS
30 INPUT" Podaj liczbe numer 1 (A) i numer 2 (B), oddzielając je przecinkami"; A,B
40 PRINT "A+B"; A+B
50 PRINT "A-B"; A-B
60 PRINT "A*B"; A*B
70 PRINT "A/B"; A/B

Efekt programu 2.5 jest identyczny jak programu 2.3 z tą różnica, że dwie instrukcje INPUT zostały połączone w jedną. Osobiście nie jestem przekonany do tej metody, bo utrudnia ona dialog użytkownika z programem. Jeżeli pomylimy się w jednej zmiennej (zamiast liczby wpiszemy literę) program wskaże błąd i wszystkie zmienne będzie trzeba wpisać ponownie. Taka sytuacja nie zdarzyłaby się w programie 2.3. Jeżeli użytkownik zrobi błąd podczas wpisywania drugiej zmiennej, będzie musiał poprawić tylko tą drugą. Polecenie INPUT sprawdza się jedynie gdy wpisujemy proste wyrażenia tekstowe. Jeżeli chcemy wpisać całe zdania (szczególnie z przecinkami) bardzo przydatna jest komenda LINE INPUT. Dzięki niej przecinki rozumiane są jako część tekstu wpisanego do zmiennej.
     Wspomniałem wcześniej o zmiennych. Warto troszkę rozszerzyć ten temat, bowiem jest on bardzo istotny. Oprócz pojedynczych zmiennych, można tworzyć wektory, oraz tablice zmiennych. Ich zapis jest bardzo prosty. Wystarczy po nazwie zmiennej dodać nawias okrągły (). Prezentuje to poniższy przykład:

10 REM Prg2.6 - Wektory i macierze
20 CLS
30 A(0) = 1: A(1) = 2
40 PRINT "Wartosc pierwszego wyrazenia wektora A wynosi"; A(0)
50 PRINT "Wartosc drugiego wyrazenia wektora A wynosi"; A(1)
60 B(0, 0) = 0: B(0, 1) = 1: B(1, 0) = 2: B(1, 1) = 3
70 PRINT "Wartosc elementu (0)(0) macierzy B wynosi"; B(0, 0)
80 PRINT "Wartosc elementu (0)(1) macierzy B wynosi"; B(0, 1)
90 PRINT "Wartosc elementu (1)(0) macierzy B wynosi"; B(1, 0)
100 PRINT "Wartosc elementu (1)(1) macierzy B wynosi"; B(1, 1)

Program tworzy wektor A składający się z dwóch elementów, po czym wyświetla te elementy. Następnie tworzy macierz o rozmiarze 2x2 i również wyświetla jej elementy. Standardowo kompilator przyjmuje, że programista będzie korzystał z maksymalnego rozmiaru 11 elementów wektora, lub macierzy 11x11 (od 0 do 10). Nie ma jednak problemu, aby samemu stworzyć większy wektor/macierz. W tym celu wystarczy posłużyć się poleceniem
DIM zmienna(wielkosc_wymiaru1,wielkosc_wymiaru2,...,wielkosc_wymiaru_n). Użycie polecenia prezentuje poniższy przykład:

10 REM Prg2.7 - Wektory i macierze (2)
20 CLS
30 DIM liczba(15, 15)
40 FOR a = 0 TO 15
50 FOR b = 0 TO 15
60 liczba(a, b) = a + b: PRINT liczba(a, b); " ";
70 NEXT b: NEXT a

Powyższy program tworzy macierz 15x15, wypełnia ją liczbami, a następnie wyświetla jej zawartość. Zapewne zastanawiasz się, co oznaczają polecenia w liniach 40 i 50. Są to pętle, o których poczytasz więcej w dalszej części kursu (rozdział 5).



     Ponieważ wiesz już co to są zmienne, przejdziemy do kolejnego zagadnienia - skoków w programie. Pierwszym poleceniem, który umożliwia skok jest GOTO x. Dzięki niemu możemy skoczyć z obecnej linii programu do linii x (z ang. "go to" - "idź do"). Aby lepiej zrozumieć polecenie przyjrzyj się poniższemu przykładowi:

10 REM Prg3.1 - Polecenie GOTO
20 CLS
30 PRINT" Program demonstuje uzycie polecenia goto"
40 GOTO 30

W linii 30 program ma za zadanie napisać na ekranie tekst, po czym w lini 40 ma skoczyć do lini 30, co powoduje ponowne napisanie tekstu. Całość powtarza się bez końca - jest to martwa pętla. Jedynym sposobem na przerwanie programu jest wyjście z kompilatora (pomocna będzie kombinacja klawiszy ALT+CTRL+DEL). Jak widać w powyższym przykładzie, nierozważne używanie polecenia GOTO x może być niebezpieczne i spowodować zacięcie się programu. Aby lepiej zrozumieć ideologię GOTO x napisz poniższy programik:

10 REM Prg3.2 - Polecenie GOTO (2)
20 CLS
30 PRINT" Numer 1"
40 GOTO 70
50 PRINT" Numer 2"
60 END
70 PRINT" Numer 3"
80 GOTO 50

Analizując polecenia krok po kroku: w linii 30 zostaje napisany tekst: "Numer 1", następnie w linii 40 następuje skok do linii 70, w której zostaje napisany tekst: "Numer 3", następnie ponownie następuje skok, tym razem do linii 50, w której zostaje napisany tekst: "Numer 2". Program kończy się w linii 60 poleceniem END, które przy tej okazji króciutko omówię. Otóż polecenie END służy do zakończenia programu w trakcie jego trwania. Zakończenie programu może nastąpić z dwóch przyczyn: gdy cały kod programu zostanie wykonany i kompilator nie znajdzie dalszej części kodu, lub gdy kompilator znajdzie polecenie END. Na początku kursu wspominałem na temat numerowania linijek kodu. W tym miejscu widać czarno na białym jakie linie kodu powinny być poprzedzone liczbą porządkową. Są to wszystkie linie, do których odnosi się instrukcja GOTO x. Podobna zasada dotyczy zresztą następnego polecenia (w sumie dwóch poleceń): GOSUB x, oraz RETURN. Oba polecenia należy traktować jako nierozerwalną parę. Polecenie GOSUB x działa podobnie do polecenia GOTO x, z tą różnicą, że gdy nastąpi skok do linii x, komputer będzie wykonywał wszystkie polecenia tak długo, aż nie trafi na polecenie RETURN, które rozkaże powrót do linii w której umieszczone jest polecenie GOSUB x. Aby lepiej zrozumieć zawiłości działania powyższych poleceń, napiszmy sobie poniższy przykład:

10 REM Prg3.3 - Polecenie GOSUB i RETURN
20 CLS
30 GOSUB 60
40 PRINT" Koniec"
50 END
60 PRINT" Poczatek"
70 RETURN

W linii 30 skaczemy za pomocą polecenia GOSUB 60 do linii 60, po czym wykonujemy polecenie napisania na ekranie tekstu "Początek". W lini 70 pojawia się polecenie RETURN, które nakazuje programowi powrót do linii w której znajduje się polecenie GOSUB 60 i wykonywanie kolejnych poleceń znajdujących się po linii 30 - czyli napisania tekstu "Poczatek" w linii 40. Program kończy swoje działanie w linii 50 poleceniem END. Początkowo można się troszkę pogubić w tych wszystkich skokach. Nauczenie się ich jest niezbędne, jeżeli chcesz napisać bardziej złożony program...



     ...podobnie jak niezbędne jest nauczenie się instrukcji warunkowych, które umożliwiają większą kontrolę nad programem. Dzięki nim możemy zaplanować co dany program ma zrobić gdy zostanie spełniony określony warunek. Unaoczni nam to poniższy przykład:

10 REM Prg4.1 - Instrukcje warunkowe IF,THEN (1)
20 CLS
30 INPUT " Wpisz cyfre 5:"; a
40 IF a = 5 THEN PRINT " Podales poprawna cyfre": END
50 PRINT " Podales cyfre inna niz 5"

W powyższym programie w linii 30 komputer prosi użytkownika o podanie cyfry 5. To, co użytkownik wpisze zależy tylko i wyłącznie od jego woli. Wybór użytkownika zostanie zapisany do zmiennej "a". W linii 40 za pomocą instrukcji warunkowej IF...THEN następuje sprawdzenie warunku - czy użytkownik podał prawidłową cyfrę. W zależności od sytuacji, program wyświetli odpowiedni komunikat. Jak widać, składnia instrukcji warunkowej, którą użyliśmy w przykładzie jest bardzo prosta: IF zmienna = wartość THEN polecenie. Należy nadmienić, że w miejsce znaku równości "=" można wstawić następujące znaki, oraz ich kombinacje:

"<" - znak mniejszości, gdy pierwszy człon jest mniejszy od drugiego,
">" - znak większości, gdy pierwszy człon jest większy od drugiego,
"<=" - gdy pierwszy człon jest nie większy od drugiego (czyli może być mniejszy, lub równy), oraz
"=>" - gdy pierwszy człon jest nie mniejszy od drugiego (czyli może być większy, lub równy).

Modyfikując odrobinę przykład Prg4.1 możemy uzyskać ciekawszy efekt:

10 REM Prg4.2 - Instrukcje warunkowe IF,THEN (2)
20 CLS
30 INPUT " Wpisz cyfre 5:"; a
40 IF a = 5 THEN PRINT " Podales poprawna cyfre": END
50 IF a < 5 THEN PRINT " Podana cyfra jest za mala": END
60 IF a > 5 THEN PRINT " Podana cyfra jest za duza": END

Kilka linijek wcześniej wspominałem o członach. W powyższym przykładzie (w każdej z trzech instrukcji warunkowych) pierwszym członem jest zmienna a, natomiast drugim wartość 5. Warto pamiętać, iż członem nie musi koniecznie być jakaś stała wartość. Możemy jako obu członów użyć dwóch różnych zmiennych. Przedstawia to poniższy przykład:

10 REM Prg4.3 - Instrukcje warunkowe IF,THEN (3)
20 CLS
30 INPUT " Wpisz pierwsza liczbe"; a
40 INPUT " Wpisz druga liczbe"; b
50 IF a = b THEN PRINT " Obie liczby sa identyczne": END
60 IF a < b THEN PRINT " Liczba pierwsza jest mniejsza od drugiej": END
70 IF a > b THEN PRINT " Liczba druga jest mniejsza od pierwszej": END

Czasami wymagane jest spełnienie kilku warunków jednocześnie. W takiej sytuacji bardzo pomocne stają się łączniki AND ("i"), oraz OR ("lub"). Pierwszego używamy gdy oba warunki muszą zostać spełnione, aby polecenie zostało wykonane. W przypadku drugiego łącznika spełnienie jednego z dwóch wymaganych warunków spowoduje wykonanie polecenia. Prezentuje to poniższy przykład:

10 REM Prg4.4 - Instrukcje warunkowe IF,THEN (4)
20 CLS
30 INPUT " Wpisz pierwsza liczbe"; a
40 INPUT " Wpisz druga liczbe, wieksza od pierwszej"; b
50 INPUT " Wpisz trzecia liczbe, wieksza od drugiej"; c
60 IF a < b AND b < c THEN PRINT " Podales poprawne liczby": END
70 PRINT" Podane liczby nie spelniaja warunkow"

Oczywiście członów może być dużo więcej - wszystko zależy od wymagań stawianych programowi. Jak zapewne zauważyłeś, po THEN następuje polecenie, które program ma wykonać gdy zostanie spełniony warunek. Co jednak należy zrobić, gdy poleceń do zrealizowania jest więcej ? Można np: użyć polecenia GOTO, lub GOSUB. W przypadku polecenia GOTO sytuacja staje się łatwiejsza, bowiem polecenie THEN samo w sobie działa tak samo jak GOTO i co za tym idzie wystarczy jedynie wpisać numer linii, do której program na skoczyć. Prezentuje to kolejny przykład:

10 REM Prg4.5 - Instrukcje warunkowe IF,THEN (5)
20 CLS
30 INPUT " Wpisz pierwsza liczbe"; a
40 INPUT " Wpisz druga liczbe, wieksza od pierwszej"; b
50 INPUT " Wpisz trzecia liczbe, wieksza od drugiej"; c
60 IF a < b AND b < c THEN 80
70 PRINT" Podane liczby nie spelniaja warunkow": END
80 PRINT" Podane liczby spelniaja warunki"

Należy natomiast pamiętać iż polecenie THEN NIE działa jak GOSUB. Aby użyć GOSUB, należy wpisać THEN GOSUB x (x - numer linii). Na tym kończę swój wykład na temat instrukcji warunkowych.



     Skoro problem instrukcji warunkowych mamy już za sobą, możemy przejść do tematu pętli. Temat pętli został już wcześniej poruszony (rozdział 2), jednak dopiero teraz zostanie dokładnie omówiony. Pętle służą do powtarzania pewnych czynności określoną ilość razy. Do tego celu należy użyć polecenia FOR zmienna = a to b STEP c działanie polecenia NEXT zmienna. Składnia wydaje się być bardzo zagmatwana, ale spokojnie - zaraz wszystko się wyjaśni. Pętlę rozpoczynamy od FOR. Następnie należy podać nazwę zmiennej liczbowej i znak równości. W miejscach oznaczonych jako a i b podajemy dwie liczby, które należy oddzielić wyrażeniem TO. Liczba a jest liczbą, od której zaczyna się liczenie pętli, a liczba b liczbą na której liczenie ma się zakończyć. Na koniec piszemy wyrażenie STEP i w miejscu c działanie jakie ma nastąpić gdy instrukcje w pętli się zakończą. Teraz, gdy już mamy przygotowaną całą składnię, piszemy instrukcje, które mają być wykonywane przez pętle. Całość kończymy poleceniem NEXT. Polecenie FOR...NEXT jest zdecydowanie poleceniem trudniejszym do wytłumaczenia i dlatego podam teraz kilka przykładów, które mam nadzieje ułatwią zrozumienie pętli. Zacznijmy od najłatwiejszego przykładu:

10 REM Prg5.1 - Polecenie FOR i NEXT
20 CLS
30 FOR a = 1 to 10 STEP +1
40 PRINT" Ten wyraz powinien pojawic sie na ekranie 10 razy"
50 NEXT a

W linii 30 tworzymy pętlę. Do zmiennej "a", której początkowa wartość wynosi 1 (liczba przed wyrażeniem TO), ma być dodawane +1 (liczba po wyrażeniu STEP), aż zmienna "a" wyniesie 10 (liczba po wyrażeniu TO). W linii 40 następuje polecenie, które ma być wykonane przez pętlę (w tym wypadku tylko jedno), a w linii 50 zakończenie pętli. Efektem programu jest napisanie na ekranie 10 razy napisu "Ten wyraz powinien pojawic sie na ekranie 10 razy". Spróbujmy teraz pobawić się troszkę z tym programikiem. Zamieńmy np: "STEP +1", na "STEP +2":

10 REM Prg5.2 - Polecenie FOR i NEXT (2)
20 CLS
30 FOR a = 1 to 10 STEP +2
40 PRINT" Ten wyraz powinien pojawić się na ekranie 10 razy"
50 NEXT a

Jak się okazuje, napis zostaje napisany tylko 5 razy. Dzieje się tak, ponieważ do zmiennej "a", której początkowa wartość wynosi 1, jest dodawane +2 tak długo, aż zmienna "a" wyniesie 10. Zobaczmy teraz kolejny przykład:

10 REM Prg5.3 - Polecenie FOR i NEXT (3)
20 CLS
30 FOR a = 1 to 10 STEP +1
40 PRINT a
50 NEXT a

Tutaj efektem programu jest wyświetlenie zmiennej "a", a ponieważ zmienna cały czas zmienia swoją wartość (jest powiększana o 1 co sugeruje wyrażenie STEP +1), to program pokazuje nam liczby od 1 do 10 (tak jak zadeklarowaliśmy w linii 30 - "a = 1 to 10" - czyli zacznij od 1, skończ na 10). Teraz zmienimy trochę powyższy program:

10 REM Prg5.4 - Polecenie FOR i NEXT (4)
20 CLS
30 FOR a = 10 to 1 STEP -1
40 PRINT a
50 NEXT a

Program 5.3 i 5.4 są prawie identyczne. Jedyną różnicą jest fakt, że w pierwszym programie liczby, które pojawiają się na ekranie, ułożone są rosnąco, a w drugim malejąco. Decyduje o tym człon STEP +1 i STEP -1. Bardzo istotną i interesującą rzeczą jest fakt, iż można robić pętle w pętlach. Zademonstruję to na programie 5.5

10 REM Prg5.5 - Polecenie FOR i NEXT (5)
20 CLS
30 FOR a = 1 to 5 STEP +1
40 FOR b = 1 to 3 STEP +1
50 PRINT "Numer:"; b
60 NEXT b
70 PRINT a; "trojka juz minela"
80 NEXT a

Tutaj widać dokładny przykład zastosowania kilku pętli jednocześnie. W linii 30 tworzymy pętlę A dążącą do 5, a w linii 40 pętlę B dążącą do 3. Następnie w linii 50 i 60 wyświetlamy zmienną "b" i tworzymy zakończenie pętli B. W linii 70 wyświetlamy tekst, a w linii 80 zakańczamy pętlę A. W praktyce wygląda to tak, że pętla B jest powtarzana 5 razy przez pętlę A. Oprócz pętli skończonych, do których zalicza się FOR, występuje również pętla nieskończona. Pętle różnią się tym, iż pierwsza z nich zostaje wykonana odpowiednią ilość razy, natomiast druga będzie wykonywana tak długo dopóki nie zostanie spełniony warunek zakończenia pętli. Ten drugi typ pętli jest reprezentowany przez polecenia DO...LOOP. Na podstawie poniższego przykładu postaram się wytłumaczyć działanie tej pętli

10 REM Prg5.6 - Petle nieskonczone DO LOOP (5)
20 CLS
30 DO
40 INPUT "Podaj pierwsza liczbe ", liczba1
50 INPUT "Podaj druga liczbe ", liczba2
60 PRINT "Wynik dodawania liczb wynosi";liczba1+liczba2
70 INPUT "Czy powtorzyc dodawanie (t/n)? ", odpowiedz$
80 LOOP WHILE odpowiedz$="t"
90 PRINT "Petla zostala zakonczona."

Pomiędzy DO i LOOP wstawia się polecenia, które mają zostać wykonane przez pętlę. Pętla będzie powtarzana tak długo dopóki będzie spełniony warunek występujący po WHILE.



     Ponieważ podstawowe polecenia mamy już za sobą, możemy się troszkę rozerwać i popracować nad grafiką. Poleceniem od którego musimy zacząć jest SCREEN x, który służy do ustawienia odpowiedniego trybu graficznego w którym program będzie pracował. Pod "x" można wpisać jedną z następujących wartości:

0 - tryb tekstowy (16 kolorów znaków)
1 - rozdzielczość 320*200, 16 kolorów tła, 4 kolory obiektów
2 - rozdzielczość 640*200, 2 kolory obiektów
7 - rozdzielczość 320*200, 16 kolorów obiektów
8 - rozdzielczość 640*200, 16 kolorów obiektów
9 - rozdzielczość 640*350, 16 kolorów obiektów
10 - rozdzielczość 640*350, 2 kolory obiektów
11 - rozdzielczość 640*480, 2 kolory obiektów
12 - rozdzielczość 640*480, 16 kolorów obiektów
13 - rozdzielczość 320*200, 256 kolorów obiektów

Z góry uprzedzam, że nie jestem pewny części z powyższych informacji, bowiem osobiście korzystam jedynie z kilku trybów. Standardowo kompilator ustawia tryb SCREEN 0, dzięki czemu możemy wyświetlać litery, cyfry i znaki w 16 możliwych kolorach (do zmiany koloru służy polecenie, o którym wspominałem na początku kursu - COLOR). Aby rozpocząć pracę w trybie graficznym, musisz umieścić polecenie SCREEN wraz z interesującym się trybem wyświetlania grafiki. Osobiście w poniższych przykładach będę się opierał na trybie 9. Skoro wybór trybu mamy już za sobą, czas przejść do kolejnego polecenia, którym jest LINE(x1,y1)-(x2,y2),kolor. Dzięki niemu na ekranie monitora pojawi się linia o początku w punkcie (x1,y1) i końcu (x2,y2), oraz kolorze "kolor". Zastosowanie dwóch poznanych wyżej poleceń przedstawię na krótkim przykładzie poniżej:

10 REM Prg6.1 - Zastosowanie polecen: SCREEN i LINE
20 CLS
30 SCREEN 9
40 LINE(100,100)-(540,250),14
50 SLEEP 5

Polecenie LINE można również wykorzystać do rysowania prostokątów, co przedstawia kolejny przykład:

10 REM Prg6.2 - Rysuje prostokąt
20 CLS
30 SCREEN 9
40 LINE(100,100)-(540,250),14, b
50 SLEEP 5

Jak widać, na koniec polecenia LINE wystarczyło dodać jedynie człon , b. Powyższy prostokąt można w prosty sposób wypełnić kolorem:

10 REM Prg6.3 - Wypelniony prostokat
20 CLS
30 SCREEN 9
40 LINE(100,100)-(540,250),14, BF
50 SLEEP 5

Tym razem na koniec polecenia LINE dodałem człon , bf. Ponieważ umiesz już rysować linie i prostokąty, możemy zająć się okręgami. Aby narysować okrąg należy posłużyć się poleceniem CIRCLE (x,y), promień, kolor, start, koniec. Polecenie rysuje okrąg o środku w punkcie "x i y", o promieniu "promień", kolorze "kolor" oraz na podstawie wartości start i koniec określa wycinki okręgu.

10 REM Prg6.4 - Okrag
20 CLS
30 SCREEN 9
40 CIRCLE (320, 150), 100, 10
50 SLEEP 5

Jak widać komputer narysował okrąg w punkcie (320,150) o promieniu 100 i kolorze 10. Często jednak to co powinno być okręgiem, tak naprawdę jest elipsą. Jest to spowodowane złym doborem rozdzielczości. Gdybym w przykładzie powyżej użyłbym SCREEN 12 okrąg byłby proporcjonalny zarówno w pionie, jak i w poziomie. W powyższym przykładzie nie skorzystaliśmy z rysowania wycinków okręgu. Spróbujmy to zrobić w poniższym przykładzie:

10 REM Prg6.5 - Wycinki okregu
20 CLS
30 SCREEN 9
40 CIRCLE (280, 180), 100, 10, -0.0001, -1.57
50 SLEEP 5

Jak widać, program narysował wycinek okręgu (a konkretniej pierwszą jego ćwiartkę). Wartości "start" i "koniec" mogą przyjmować wartości od 0 do 6.28. Wartości te wynikają ze wzoru na obwód okręgu: 2*pi=2*3.14=6.28. Dlaczego ja zastosowałem wartości ujemne ? Ponieważ wartości ujemne oznaczają, że dodatkowo chcemy narysować promienie wychodzące od środka okręgu do punktów "start" i "koniec". Jeżeli chodzi o zasadę rysowania wycinków, to polega ona na tym że program rozpoczyna wycinek w punkcie "start" (punkt 0 jest ułożony poziomo po prawej stronie okręgu), po czym porusza się przeciwnie do ruchu wskazówek zegara i kończy na punkcie "koniec". Nasuwa się pytanie, jak wypełnić okrąg i tym samym narysować koło. Sprawa jest troszkę trudniejsza, niż w przypadku prostokątu. Aby wypełnić okrąg musimy posłużyć się poleceniem PAINT (x,y), kolor_wypełnienia, kolor_krawędzi.

10 REM Prg6.6 - Wypelnianie obiektow
20 CLS
30 SCREEN 9
40 CIRCLE (320, 150), 100, 10
50 PAINT (320,150), 12, 10
60 SLEEP 5

Ponownie jak w przykładzie Prg6.4 zostaje narysowany okrąg o środku w punkcie (320,150), promieniu 100 i kolorze 10, po czym w linii 50 następuję wypełnienie obiektu w punkcie (320,150) o kolorze wypełnienia 12 i kolorze krawędzi 10. Wszystko w porządku, tylko co oznacza kolor krawędzi ? Otóż jest to numer koloru, który ogranicza obszar malowania. Jeżeli zamienisz wartość koloru_krawędzi (10) na dowolny inny kolor, cały ekran zostanie zamalowany. Polecenia PAINT można użyć do wypełniania dowolnych obiektów. Można go również użyć do pewnej sztuczki, co pokażę na poniższym przykładzie:

10 REM Prg6.7 - Nowe zastosowanie polecenia PAINT
20 CLS
30 SCREEN 9
40 PAINT (0,0), CHR$(85)
50 SLEEP 5

Współczynniki x i y nie są w tym przypadku istotne bowiem polecenie PAINT dotyczy całej możliwej powierzchni ekranu i właśnie dlatego wpisałem (0,0). Bardziej istotny jest fragment CHR$(85), który określa wzór wypełnienia. Numer w nawiasie informuje o wyglądzie wzoru wypełnienia i może przyjmować wartości od 0 do 255 (czyli tyle co 2 do potęgi 8). Aby wiedzieć jak wygląda wzór malowania, należy znać system dwójkowy. Liczba 85 (zapisana w systemie dziesiętnym) odpowiada liczbie 01010101 (zapisanej w systemie dwójkowym). Jedynka oznacza, że dana linia ma zostać wypełniona wybranym kolorem. Nasuwa się jednak pytanie - jakim kolorem, skoro żadnego nie wybierałem ? Na to pytanie odpowiem po zapoznaniu się z poniższym przykładem:

10 REM Prg6.8 - Nowe zastosowanie polecenia PAINT - zmiana koloru
20 CLS
30 SCREEN 9
40 PAINT (0,0), CHR$(0) + CHR$(85)
50 SLEEP 5

Jak widać, kolor zmienił się na zielony. Zostało to spowodowane dopisaniem fragmentu CHR$(0), który dodaje +1 do wartości koloru (tym samym wartość koloru = 2 co odpowiada kolorowi zielonemu ; jedynka odpowiadała kolorowi granatowemu). Wystarczy zatem dopisać CHR$(0) przed CHR$(x) w takiej ilości jaka jest nam potrzebna, aby otrzymać zamierzony kolor. Można również wykorzystać kilka kolorów i kilka wzorów wypełnienia, dzięki czemu uzyska się ciekawy efekt:

10 REM Prg6.9 - Nowe zastosowanie polecenia PAINT - zmiana koloru cz.2
20 CLS
30 SCREEN 9
40 PAINT (0, 0), CHR$(0) + CHR$(85) + CHR$(0) + CHR$(100)
50 SLEEP 5

W tym przypadku ciemny i jasny kolor zielony są malowane na przemian. Ostatnim poleceniem, o którym jedynie wspomnę będzie PSET (x,y),kolor, które zapala piksel w punkcie "x i y" o kolorze "kolor". Uważam że jest to proste polecenie i przykłady obrazujące jego użycie będą raczej zbędne.



     Ponieważ omówiłem podstawowe polecenia graficzne, wypada teraz skupić się na muzyce i dźwiękach. Z góry jednak uprzedzam, iż nigdy nie korzystałem z poleceń dźwiękowych i stąd bierze się moja nikła wiedza na ten temat. Najprostszym poleceniem jakiego można użyć jest BEEP, który wydaje z głośników "Błąd krytyczny". Zastosowanie BEEP przedstawia przykład:

10 REM Prg7.1 - Polecenie BEEP
20 CLS
30 BEEP
40 END

Drugim poleceniem dotyczącym dźwięku jest SOUND x, y. To polecenie wydaje dźwięk z brzęczka o częstotliwości x (w hercach), który trwa y impulsów zegarowych (18 impulsów to w przybliżeniu 1 sekunda). Całość przedstawia kolejny przykład:

10 REM Prg7.2 - Polecenie SOUND
20 CLS
30 SOUND 440, 18
40 END

W powyższym przykładzie komputer wydał z siebie dźwięk nuty C trwający sekundę. Niestety oba powyższe polecenia mają małe możliwości. Sytuację poprawia polecenie PLAY, które umożliwia granie całych melodii. Spójrzmy na kolejny przykład:

10 REM Prg7.3 - Polecenie PLAY (1)
20 CLS
30 PLAY "mb"
40 PLAY "t255"
50 PLAY "o2 c1 d4 f4 e4 d4 g2 g2 g4 a4 e4 f4 d2 d2 d4 f4 e4 d4 c4 o3 c4 o2 b4 a4 g4 f4 e4 d4 c1 d4 f4 e4 d4 g2 g2 g4 a4 e4 f4 d2 d2 d4 f4 e4 d4 c4 g4 d4 e4 c2 p2"
60 PLAY ON
70 END

W linii 30 nakazujemy komputerowi grać w tle (czyli wszystkie inne polecenia mogą być dalej wykonywane). W linii 40 nadajemy tempo muzyce (od 0-wolno do 255-szybko). W linii 50 układamy nuty, które mają być zagrane przez komputer. Przy tej okazji warto omówić co oznaczają litery i cyfry. Otóż wyróżniamy następujące nuty: C D E F G A H. Liczby przy nutach informują program o ich długości (1 - cala nuta, 8 - ósemka itp.). Litera "P" oznacza pauzę (liczba oznacza to samo co przy nutach), natomiast "." (kropka) przedłuża nutę o połowę. W linii 60 występuje komenda rozkazująca zagranie muzyki. Na tym kończę skromny kurs na temat muzyki.



     W tym dziale zajmiemy się poleceniami przydatnymi przy edycji tekstu. Zanim przejdziemy do konkretów, warto zapoznać się z poleceniem WIDTH x,y. Polecenie WIDTH ustawia odpowiednią szerokość i wysokość ekranu. Polecenie działa tylko w trybie pełnoekranowym. Użycie polecenia WIDTH przedstawia przykład:

10 REM Prg8.1 Zmiana rozmiaru ekranu - WIDTH
20 SCREEN 0
30 WIDTH 40
40 CLS
50 PRINT " Duze litery"
60 SLEEP 3
70 WIDTH 80
80 PRINT " Male litery"

Oczywiście WIDTH działa również w trybach graficznych. Informacji na temat możliwych wartości x i y w danym trybie graficznym powinieneś szukać w pomocy Basica (pod pojęciem SCREEN - tam znajdują się wszystkie możliwe tryby). Po króciutkim wstępie zostawiamy sprawę wielkości ekranu i przechodzimy do tematu znaków. Jak wiadomo, w kodzie ASCII znajduje się 256 znaków - zwykła klawiatura posiada jedynie 101/102 klawisze. Sprawy nie ratuje fakt, iż pojedynczy klawisz jest często wykorzystany do wpisywania dwóch różnych znaków. Sprawa jest prosta - nie mamy dostępu do części znaków za pomocą klawiatury. Jak więc uzyskać do nich dostęp ? Wystarczy użyć polecenia, które już w kursie się pojawiło: CHR$(x). Używając kombinacji poleceń PRINT CHR$(x) jesteśmy w stanie wyświetlić dowolny znak z tablicy ASCII. Wszystko przedstawia poniższy przykład:

10 REM Prg8.2 Wyswietlanie znakow z tablicy ASCII
20 CLS
30 FOR a = 15 TO 255
40 PRINT a; CHR$(a); "  ";
50 NEXT a

Powyższy program wyświetla znaki od 15 do 255. Znaki 0 - 14 są niewidoczne. Jeżeli chcesz zobaczyć pełną tablicę znaków, wejdź do pomocy Basica, wybierz Contents, a następnie ASCII character codes. Jeżeli natomiast szukasz polecenia działającego w sposób odwrotny, powinieneś skorzystać z ASC("znak"), dzięki któremu uzyskasz numer "znaku". Kolejnymi poleceniami bezpośrednio nawiązującymi do tematu są LEFT$(zmienna,numer_znaku), oraz RIGHT$(zmienna,numer_znaku). Pierwsze polecenie umożliwia pobranie ze "zmiennej" znaku o numerze porządkowym określonym przez "numer_znaku". Wyliczanie znaków rozpoczyna się od lewej strony (czyli od początku zmiennej). Drugie polecenie działa identycznie, a jedyną różnicą jest wyliczanie znaków od prawej strony. Zastosowanie poleceń przedstawia przykład

10 REM Prg8.3 Pobieranie znakow ze zmiennej - LEFT$, RIGHT$
20 CLS
30 INPUT " Jak masz na imie "; imie$
40 PRINT : PRINT" Pierwsza litera twojego imienia jest: ";LEFT$(imie$,1)
50 PRINT " Ostatnia litera twojego imienia jest: ";RIGHT$(imie$,1)

Powyższy przykład raczej dokładnie obrazuje możliwości obu poleceń. Podobnie działającym poleceniem jest MID$(zmienna,numer_znaku,ilosc_znakow), które umożliwia wyciągnięcie ciągu znaków z wnętrza zmiennej. "Numer_znaku" wskazuje na znak od którego chcemy rozpocząć wyjmowanie znaków, natomiast "ilosc_znakow" informuje ile znaków ma zostać pobranych. Kolejny przykład:

10 REM Prg8.4 Pobieranie znakow ze zmiennej - MID$
20 CLS
30 INPUT " Jak masz na imie "; imie$
40 PRINT : PRINT" Druga, trzecia i czwarta litera twojego imienia to: ";MID$(imie$,2,3)

Kolejne polecenia przydadzą się, jeżeli duże litery znajdujące się w zmiennej będziesz chciał zamienić na małe (lub na odwrót). W przypadku zamiany dużych liter na małe należy użyć polecenia LCASE$(zmienna), natomiast gdy chcesz uzyskać odwrotny efekt powinieneś skorzystać z UCASE$(zmienna). Użycie obu poleceń prezentuje przykład:

10 REM Prg8.5 Duze i male litery - LCASE$, UCASE$
20 CLS
30 INPUT " Jak masz na imie "; imie$
40 PRINT : PRINT" Twoje imie pisane dużymi literami: ";UCASE$(imie$)
50 PRINT " Twoje imie pisane malymi literami: ";LCASE$(imie$)

W programach często zdarza się, że chcemy pewien znak powtórzyć określoną ilość razy. Co prawda można to zrobić wciskając klawisz odpowiednią ilośc razy, lub zastosować pętle, jednak istnieją łatwiejsze rozwiązania. Polecenie STRING$(ilosc_znakow, "znak") pozwala powielać "znak" tyle razy, ile zostało określone w "ilosc_znakow". Drugie polecenie - SPACE$(ilosc_znakow) umożliwia wstawienie odstępu (spacji) w ilości równej "ilosc_znakow". Zastosowanie obu poleceń przedstawiam poniżej:

10 REM Prg8.6 - STRING$, SPACE$
20 CLS
30 PRINT " Po tym tekscie pojawi sie 10 gwiazdek "; STRING$(10, "*")
40 PRINT : PRINT " Natomiast tutaj "; SPACE$(15); "znajduje sie 15 znakowy odstep"

Czasami może zajść potrzeba sprawdzenia z ilu znaków składa się zmienna. Takiej informacji może dostarczyć polecenie LEN(zmienna). Użycie polecenia może wyglądać następująco:

10 REM Prg8.7 Sprawdzanie dlugosci zmiennej
20 CLS
30 INPUT " Podaj swoje imie (max. 8 znakow) "; imie$
40 IF LEN(imie$)>8 THEN PRINT " Podane imie jest za dlugie": END
50 PRINT " Wprowadziles imie, ktore sklada sie z ";LEN(imie$);"liter."

Ostatnim poleceniem związanym z tematem będzie INSTR(zmienna,szukany_zwrot) służący do szukania ciągu znaków w zmiennych. Szukanym zwrotem może być tekst zawarty w "cudzysłowie", jak również inna zmienna. Jeżeli polecenie znajdzie szukany fragment, zwróci nam numer znaku w którym rozpoczyna się szukany zwrot. Przykład demonstruję poniżej:

10 REM Prg8.8 Szukanie ciagu znakow w zmiennej - INSTR
20 CLS
30 zmienna1$ = "Kot w butach"
40 PRINT "Wyrazenie 'w butach' zaczyna sie od:"; INSTR(zmienna1$, "w butach");"pozycji"
50 zmienna2$ = "but"
60 PRINT "Wyrazenia zmiennej2 zaczyna sie od:"; INSTR(zmienna1$, zmienna2$);"pozycji"
70 PRINT "Wyrazenie 'oko' zaczyna sie od:"; INSTR(zmienna1$, "oko");"pozycji"

Jeżeli polecenie INSTR zwróci wartość zero, oznacza to że szukane wyrażenie nie zostało znalezione.



     Nadszedł czas na zapoznanie się z poleceniami odpowiedzialnymi za zapis i odczyt danych. Na początek zaczniemy od przykładu programu umożliwiającego zapis danych na dysku twardym.

10 REM Prg9.1 Zapis danych na dysku twardym
20 CLS
30 INPUT " Podaj nazwe pliku:"; plik$
40 INPUT " Podaj tekst, ktory ma zostac w nim zapisany"; tekst$
50 OPEN plik$ + ".txt" FOR OUTPUT AS #1
60 PRINT #1, tekst$
70 CLOSE 1

Linie 10 - 40 powinny być zrozumiałe. W linii 50 otwieram (polecenie OPEN) kanał nr.1 przeznaczony do zapisu danych, o czym informuje człon FOR OUTPUT AS #1. W tej samej linii łączę kanał nr.1 z plikiem podanym przez użytkownika (plik$) i dodaje do nazwy pliku człon "txt". Jak wiadomo każdy plik powinien mieć jakieś rozszerzenie. Ja zdecydowałem się na txt, jednak nic nie stoi na przeszkodzie, aby wybrać inne rozszerzenie. W linii 60 za pomocą polecenia PRINT #1 łączę się z kanałem nr.1 i wysyłam dane "tekst$" do wcześniej utworzonego pliku. Jeżeli chcesz zapisać więcej danych, możesz je oddzielić przecinkami, lub dodać większą ilość PRINT #1. W linii 70 zamykam otwarty kanał (polecenie CLOSE 1). Analogicznie sytuacja wygląda z odczytem danych:

10 REM Prg9.2 Odczyt danych z dysku twardego
20 CLS
30 INPUT " Podaj nazwe pliku:"; plik$
40 OPEN plik$+".txt" FOR INPUT AS #1
50 INPUT #1, tekst$
60 CLOSE 1
70 PRINT" Odczytano plik i pobrano nastepujace dane: ";tekst$

i dlatego podaruję sobie komentarz. Poniżej przedstawiam jeszcze jeden, troszkę bardziej złożony przykład:

10 REM Prg9.3 Zapis i Odczyt danych z dysku twardego
20 CLS
30 REM tworze plik z przykladowymi danymi
40 OPEN "temp.txt" FOR OUTPUT AS #1
50 FOR a = 1 TO 10
60 PRINT #1, "To jest"; a; "linijka tekstu"
70 NEXT a
80 CLOSE 1
90 REM teraz odczytuje plik "temp.txt" i rownolegle zapisuje
100 REM jego zawartosc do pliku "kopia.txt"
110 OPEN "temp.txt" FOR INPUT AS #1
120 OPEN "kopia.txt" FOR OUTPUT AS #2
130 FOR a = 1 TO 10
140 INPUT #1, tekst$
150 PRINT #2, tekst$
160 NEXT a
170 CLOSE 2
180 CLOSE 1
190 PRINT " Dane skopiowane sprawidlowo."

W liniach 40 - 80 tworzę nowy plik "temp.txt" i uzupełniam go treścią "To jest 'a' linijka tekstu". Następnie w liniach 110 - 180 tworzę dwa równoległe kanały - pierwszy do odczytu, drugi do zapisu - i rozpoczynam równoległą transmisję danych. W tym przykładzie chciałem zwrócić uwagę na to, że można używać jednego kanału kilka razy w programie, jednak nigdy nie można otworzyć tego samego kanału, jeżeli wcześniej nie został on zamknięty. Dlatego właśnie w liniach 110 i 120 utworzyłem dwa różne kanały.



     Ponieważ nie mam już zbyt wiele nowych poleceń do opisania, postanowiłem dodać do tego kursu troszkę więcej rzeczy praktycznych i tym samym (mam nadzieje) bardziej przydatnych. W tym dodatku zajmiemy się tworzeniem menu wyboru. Z góry mówię, iż nie chodzi mi o wygląd menu (to jest sobie w stanie każdy samodzielnie zaprojektować). Mam raczej na myśli technikę wykonywania menu do twoich własnych programów. Na początek kod źródłowy jednego z moich przykładów:

10 REM PrgA1 - Menu wyboru TYP-1
20 CLS
30 PRINT " Witaj w programie Menu Wyboru TYP-1"
40 PRINT : PRINT " 1. Wykonaj polecenie nr.1"
50 PRINT " 2. Wykonaj polecenie nr.2"
60 PRINT " 3. Wykonaj polecenie nr.3"
70 PRINT " 4. Wykonaj polecenie nr.4"
80 PRINT " 5. Wykonaj polecenie nr.5"
90 PRINT " k. Wyjdz z programu"
100 LOCATE 10, 1: COLOR 14: LINE INPUT " Wybierz opcje i potwierdz ja enterem ";opcja$
110 COLOR 7
120 IF opcja$ = "1" THEN 200
130 IF opcja$ = "2" THEN 300
140 IF opcja$ = "3" THEN 400
150 IF opcja$ = "4" THEN 500
160 IF opcja$ = "5" THEN 600
170 IF LCASE$(opcja$) = "k" THEN END
180 LOCATE 10, 39: PRINT SPACE$(42)
190 GOTO 100
200 PRINT : PRINT " Wybrales polecenie nr.1"
210 END
300 PRINT : PRINT " Wybrales polecenie nr.2"
310 END
400 PRINT : PRINT " Wybrales polecenie nr.3"
410 END
500 PRINT : PRINT " Wybrales polecenie nr.4"
510 END
600 PRINT : PRINT " Wybrales polecenie nr.5"
610 END

Jak widać, kod źródłowy jest znacznie większy od wcześniejszych kodów. Nie znaczy to jednak, że jest trudniejszy bowiem wszystkie polecenia już poznałeś (jeżeli tylko przeczytałeś wcześniejsze części tego kursu). Warto jednak pokrótce opisać powyższy przykład. W linii 20 czyścimy ekran, w liniach 30 - 90 wyświetlamy tekst naszego menu. W tym miejscu powinieneś wpisać własne opcje menu. W linii 100 umieszczamy kursor w pozycji (10,1), zmieniamy kolor tekstu na żółty i wyświetlamy tekst z zapytaniem o wybór odpowiedzi. W tym miejscu zatrzymam się na chwilę. Część osób zapewne się dziwi, że użyłem polecenia LINE INPUT, a nie INPUT. Jak już wcześniej wspomniałem LINE INPUT nie ma takich ograniczeń co INPUT (w tym drugim nie można wpisywać przecinków). W linii 110 ponownie zmieniamy kolor na szary (robię to teraz, aby nie zmieniać kolorów za każdym razem w linijkach 200-600). W liniach 120-170 sprawdzam czy została wybrała jedna z dostępnych opcji. Jeżeli tak, następuje skok do miejsca gdzie mają zostać wykonane kolejne polecenia programu. Jeżeli nie została wybrana żadna z możliwych opcji, program przechodzi do linii 180 w której następuje usunięcie tego, co wpisał użytkownik. Do tego celu bardzo przydatne okazuje się polecenie LOCATE, które ustawia kursor za napisem "Wybierz opcje i potwierdz ja enterem" (dzięki temu nie uświadczymy migotania napisow), oraz SPACE$ (które ustawia odpowiednią ilość spacji). W liniach 200-600 znajduje się miejsce na wykonywanie poleceń związanych z wybraną opcją. Zanim przejdę do następnego przykładu, pragnę zwrócić uwagę na linię 170 w której zastosowałem polecenie LCASE$(opcja$). Dzięki temu zabiegowi nie muszę się martwić czy użytkownik wpisał duże "K", czy małe "k". Komputer oba wybory traktuje równoznacznie. Skoro wszystko zostało wyjaśnione, możemy przejść do kolejnego (minimalnie zmienionego) przykładu:

10 REM PrgA2 - Menu wyboru TYP-2
20 CLS
30 PRINT " Witaj w programie Menu Wyboru TYP-2"
40 PRINT : PRINT " 1. Wykonaj polecenie nr.1"
50 PRINT " 2. Wykonaj polecenie nr.2"
60 PRINT " 3. Wykonaj polecenie nr.3"
70 PRINT " 4. Wykonaj polecenie nr.4"
80 PRINT " 5. Wykonaj polecenie nr.5"
90 PRINT " k. Wyjdz z programu"
100 COLOR 14: LOCATE 10, 1: PRINT " Wybierz opcje "
110 COLOR 7
115 opcja$ = INKEY$
120 IF opcja$ = "1" THEN 200
130 IF opcja$ = "2" THEN 300
140 IF opcja$ = "3" THEN 400
150 IF opcja$ = "4" THEN 500
160 IF opcja$ = "5" THEN 600
170 IF opcja$ = "k" THEN END
190 GOTO 115
200 PRINT : PRINT " Wybrales polecenie nr.1"
210 END
300 PRINT : PRINT " Wybrales polecenie nr.2"
310 END
400 PRINT : PRINT " Wybrales polecenie nr.3"
410 END
500 PRINT : PRINT " Wybrales polecenie nr.4"
510 END
600 PRINT : PRINT " Wybrales polecenie nr.5"
610 END

W porównaniu do przykładu PrgA1, w PrgA2 zmodyfikowano linie 100 (zamiast LINE INPUT mamy PRINT) i 190 (GOTO 100 zostało zamienione przez GOTO 115), usunięto linię 180 (była zbędna), oraz dodano linię 115. Cały sekret nowego menu tkwi właśnie w linii 115, w której pojawiło się nowe, wcześniej nie omawiane polecenie zmienna = INKEY$. To nic innego, jak przypisanie zmiennej do klawiatury i oczekiwanie na wciśnięcie klawisza. Gdy klawisz zostanie wciśnięty, kod wciśniętego znaku zostaje zapisany do zmiennej i sprawdzony w instrukcjach warunkowych. Małym nakładem sił pozbyliśmy się przycisku enter, który trzeba było wciskać po każdym wyborze opcji. Ostatni przykład menu jaki mam do zaprezentowania przedstawiam poniżej:

10 REM PrgA3 - Menu wyboru TYP-3
20 CLS
25 opcja = 1
30 PRINT " Witaj w programie Menu Wyboru TYP-3"
40 PRINT : PRINT "   Wykonaj polecenie nr.1"
50 PRINT "   Wykonaj polecenie nr.2"
60 PRINT "   Wykonaj polecenie nr.3"
70 PRINT "   Wykonaj polecenie nr.4"
80 PRINT "   Wykonaj polecenie nr.5"
90 PRINT "   Wyjdz z programu"
95 COLOR 14
100 GOSUB 1000
115 opcja$ = INKEY$
120 IF opcja$ = CHR$(0) + CHR$(72) THEN 160
130 IF opcja$ = CHR$(0) + CHR$(80) THEN 180
140 IF opcja$ = " " THEN 195
150 GOTO 115
160 IF opcja = 1 THEN 115
170 COLOR 0: GOSUB 1000: opcja = opcja - 1: GOTO 95
180 IF opcja = 6 THEN 115
190 COLOR 0: GOSUB 1000: opcja = opcja + 1: GOTO 95
193 IF opcja = 1 THEN 200
194 IF opcja = 2 THEN 300
195 IF opcja = 3 THEN 400
196 IF opcja = 4 THEN 500
197 IF opcja = 5 THEN 600
198 IF opcja = 6 THEN END
200 LOCATE 10, 1: PRINT " Wybrales polecenie nr.1"
210 END
300 LOCATE 10, 1: PRINT " Wybrales polecenie nr.2"
310 END
400 LOCATE 12, 1: PRINT " Wybrales polecenie nr.3"
410 END
500 LOCATE 12, 1: PRINT " Wybrales polecenie nr.4"
510 END
600 LOCATE 12, 1: PRINT " Wybrales polecenie nr.5"
610 END
1000 IF opcja = 1 THEN LOCATE 3, 2: PRINT "*"
1010 IF opcja = 2 THEN LOCATE 4, 2: PRINT "*"
1020 IF opcja = 3 THEN LOCATE 5, 2: PRINT "*"
1030 IF opcja = 4 THEN LOCATE 6, 2: PRINT "*"
1040 IF opcja = 5 THEN LOCATE 7, 2: PRINT "*"
1050 IF opcja = 6 THEN LOCATE 8, 2: PRINT "*"
1060 RETURN

W powyższym przykładzie do poruszania się po menu wybrałem kursory klawiatury. W linii 25 zdefiniowałem nową zmienną i przypisałem jej wartość jeden. W linii 100 następuje skok do linii 1000 (GOSUB 1000). W liniach 1000 - 1050 program sprawdza jaką wartość ma zmienna "opcja" i odpowiednio ustawia gwiazdkę (która służy jako element wyboru). W linii 1060 następuje powrót do linii w której znajdował się GOSUB 1000. W linii 115 program oczekuje na wciśnięcie klawisza. W linii 120 za pomocą CHR$(0) + CHR$(72) sprawdzam czy została naciśnięta strzałka w górę, natomiast w linii 130 (CHR$(0) + CHR$(80)) strzałka w dół. Przy okazji warto podać kody dla pozostałych strzałek: CHR$(0) + CHR$(75) dla strzałki w lewo i CHR$(0) + CHR$(77) dla strzałki w prawo - może kiedyś się przydadzą. W linii 140 oczekuje klawisza spacji, który potwierdza wybór danej opcji. Linie 160 - 170 są odpowiedzialne za ruch gwiazdki w górę menu. Za pomocą instrukcji warunkowej blokuje możliwość wyboru opcji menu mniejszej niż 1. Jeżeli gwiazdka ruszyła się w górę, ustawiam kolor na czarny, skaczę do linii 1000 aby usunąć starą gwiazdę, odejmuję jeden od opcji menu i skaczę do linii 95 gdzie kolor zmienia się na żółty i ponownie wyświetla gwiazdkę, tym razem na nowym miejscu. W liniach 180 - 190 ma miejsce identyczna sytuacja, tyle że dla strzałki w dół. W liniach 193-198 sprawdzam która opcja została wybrana i wykonuję odpowiedni skok do dalszych poleceń związanych z daną opcją. Wydaje mi się, że w miarę dokładnie wytłumaczyłem działanie wszystkich trzech przykładów. Mam nadzieję, że się wam przydadzą.



     Oczywiście z tym słowem "zaawansowana" trochę przesadziłem. Jednak mimo wszystko program mojego autorstwa może znacząco ułatwić tworzenie rysunków w basicu. Zanim pokażę jak z niego korzystać chce wspomnieć o kilku sprawach. Obecnie program QPaint jest w bardzo wczesnej fazie rozwoju, jednak pomimo tego faktu nie planuję dalej nad nim pracować. Nie należy jednak aż tak bardzo się tym zamartwiać, bowiem dobrą wiadomością jest fakt, że program jest opensource. Co za tym idzie każdy może ściągnąć sobie kod źródłowy programu i dowolnie go zmodyfikować. Kto wie, może to TY popracujesz nad moim programem i stworzysz coś całkiem strawnego. Jeżeli Ci się to uda, koniecznie mnie o tym poinformuj ! Jak już wspomniałem, program jest we wczesnej wersji tworzenia i tym samym oferuje jedynie ołówek i... toporne sterowanie. Jedyną zaletą programu jest możliwość wykorzystania stworzonych w programie rysunków do swoich własnych gier i programów. I wbrew pozorom nie jest to takie trudne, jak może się wydawać. Poniższy "program-wzór" pozwoli wyświetlić dowolną grafikę stworzoną w QPaincie. Wystarczy jedynie wkleić poniższy kod programu do swojego projektu i odrazu można się cieszyć gotowym rysunkiem. Oczywiście nic nie stoi na przeszkodzie, aby kod programu zmodyfikować. Wszystko zależy tylko od Ciebie. Zatem zaczynamy...

     Na początku powinieneś ściągnąć program QPaint z mojej strony internetowej, rozpakować go i uruchomić. W następnej kolejności wybierz opcję stworzenia nowego rysunku. Na następnym ekranie pojawią się pytania odnośnie rozmiaru rysunku. Po dokonaniu odpowiednich wyborów twoim oczom ukaże się ekran z nowym projektem. W tym miejscu tworzysz rysunek. Gdy go ukończysz, zapisz go na dysk twardy. Na dysku w katalogu QPaint powinien pojawić się plik rysunku. Teraz powinieneś skopiować ten plik do folderu z programem, w którym chcesz użyć rysunku i w odpowiednim miejscu swojego programu wpisać poniższy kod:

10 REM PrgB1 Wyswietlanie rysunku utworzonego w QPaint
15 REM Ponizej przygotowuje program do wyswietlenia grafiki
20 CLS
30 DIM rys%(241, 131)
40 SCREEN 13
43 REM Tutaj zaczyna sie wlasciwy program odpowiedzialny
47 REM za wyswietlenie grafiki
50 OPEN "nazwa_rysunku.rys" FOR INPUT AS #1
60 INPUT #1, wymiarx, wymiary
70 FOR y = 1 TO wymiary
80 FOR x = 1 TO wymiarx
90 INPUT #1, rys%(x, y)
100 PSET (x + x0, y + y0), rys%(x, y)
110 NEXT x: NEXT y
120 CLOSE 1

W linii 30 tworzymy macierz, do której wczytamy wszystkie piksele rysunku. Tworzenie macierzy nie jest konieczne, chyba że chcesz wykonywać operacje na rysunku. W linii 40 uruchamiamy tryb graficzny (QPaint pracuje jedynie w trybie SCREEN 13). W linii 50 otwieramy kanał dla pliku rysunku. W tym miejscu należy zamiast "nazwa_rysunku" wpisać poprawną nazwę rysunku. Jeżeli chcesz umieścić plik rysunku w podfolderze, musisz dopisać odpowiednią ścieżkę dostępu do pliku (np: grafika\nazwa_rysunku). W linii 60 program odczytuje rozmiary rysunku, a w liniach 70 - 110 tworzy pętle, których długość zależy od rozmiaru rysunku. W linii 90 następuje odczytanie wszystkich pikseli rysunku i zapisanie ich do macierzy rys%. W linii 100 program wyświetla piksel odczytany w linii 90. Całość kończy się w linii 120 zamknięciem kanału. Jak już wspomniałem, tworzenie macierzy nie jest obowiązkowe. Skrócona wersja programu może wyglądać następująco:

10 REM PrgB2 Wyswietlanie rysunku utworzonego w QPaint (2)
20 CLS
40 SCREEN 13
43 REM Tutaj zaczyna sie wlasciwy program odpowiedzialny
47 REM za wyswietlenie grafiki
50 OPEN "nazwa_rysunku.rys" FOR INPUT AS #1
60 INPUT #1, wymiarx, wymiary
70 FOR y = 1 TO wymiary
80 FOR x = 1 TO wymiarx
90 INPUT #1, piksel
100 PSET (x + x0, y + y0), piksel
110 NEXT x: NEXT y
120 CLOSE 1

W tym miejscu całą zawartość macierzy zastąpiliśmy jedną zmienną - "piksel". Taki zabieg znacząco pozwolił oszczędzić pamięć RAM komputera. Osoby, które mają pewne pojęcie o programowaniu z pewnością zauważyły, że wyświetlanie rysunku za pomocą polecenia PSET do najszybszych nie należy. Niestety sam osobiście nie znam innej metody na wyświetlanie rysunków i tym samym mogę cię nauczyć jedynie takiej metody.

     Na tym dodatku kończę swój kurs basica. Mam nadzieję, że moje wypociny komuś się przydadzą. Jeżeli masz jakieś pytania (uwagi, prośby,...) zawsze możesz napisać wiadomość na forum, lub wysłać maila. Jeżeli chcesz zamieścić powyższy kurs na swojej stronie internetowej, pamiętaj że musisz mieć moją zgodę. Ponieważ jest to już koniec kursu, polecam zapoznanie się z następującymi programami mojego autorstwa (wszystkie w wersji opensource):

* Kody źródłowe użyte w kursie
* Pobierz kod źródłowy "Baza Danych"
* Pobierz kod źródłowy "Kółko i Krzyżyk"
* Pobierz kod źródłowy "QPaint"
* Pobierz kod źródłowy "Słownik"
* Pobierz kod źródłowy "Druid"
* Pobierz kod źródłowy "Labirynt 2"

oraz stronami internetowymi:

http://www.pldos.pl/deger/indeks.htm
Na stronie znajduje się pokaźny spis poleceń QBasica. Wszystko w języku polskim.

http://www.qbasicstation.com/index.php
Strona w całości poświęcona QBasicowi (w języku angielskim).

http://westcompsci.pima.edu/cis100/
Na stronie znajduje się kurs QBasica. Strona w języku angielskim.

http://www.svatopluk.com/qbtutor/
Na stronie znajduje się kurs QBasica. Strona w języku angielskim.

Warto również spytać starego wujka Google czy ma coś ciekawego do powiedzenia na temat Basica, QBasica, itd.



Design strony został ściągnięty z Free Web Templates. Twórcą designu jest http://www.senkouryu.net.
Jeżeli poszukujesz dobrego, darmowego layoutu powinieneś odwiedzić powyższe strony.