Programowanie w języku BASIC (wersja Microsoft Qbasic) 1. Wstęp historia i teraźniejszość języka BASIC W pierwszych latach użytkowania komputerów programowało się je w bardzo żmudny sposób używając wyrażanych cyfrowo rozkazów kodu procesora a potem - nieco już czytelniej - wyrażając te rozkazy skrótami słów angielskich w tak zwanych ASSEMBLERACH. Znakomicie ułatwiły programowanie języki wysokiego poziomu. Jednym z pierwszych i najłatwiejszych był BASIC (Beginner's All-purposeSymbolic Instruction Code) opracowany w roku 1964 w uniwersytecie w Dartsmouth szczególnie z myślą o początkujących użytkownikach komputerów. Unowocześnione i rozszerzone wersje języka BASIC przeżywają obecnie swój renesans jako warianty języka Visual Basic w którym - programując obiektowo można tworzyć programy dla środowiska Windows. Visual Basic rozpowszechniany jest zarówno w postaci kolejnych wersji osobnego pakietu programistycznego (Ms Visual Basic) jak i w postaci dodatkowego narzędzia poszerzającego możliwości tak znanych produktów jak Autocad (2000) czy pakiet biurowy Ms Office - wyposażony w VBA czyli Visual Basic for Applications). Nieco wcześniejszą (1985) ale wygodną i bogatą wersją języka dla środowiska DOS jest Ms QBASIC dodawany standardowo do systemu DOS (od wersji 5.0). Pozwala on programować strukturalnie budując własne funkcje i procedury oraz instrukcje złożone do realizacji zadań cząstkowych niezbędnych do prawidłowego funkcjonowania całości programu. Pozwala on także na przykład: generować rysunki, dźwięki i melodie, wykorzystywać okienka i zdarzenia; obsługiwać interfejs szeregowy i t d. Aby przekonać czytelnika, że nie jest to język muzealny, przytoczę dwa przykłady: 1. książka profesora Ryszarda Tadeusiewicza: "Elementarne wprowadzenie do techniki sieci neuronowych z przykładowymi programami" (1998) poparta jest szeregiem przykładów programów właśnie w tym języku 2. dokumentacja kosztownego 100 kanałowego wzmacniacza pomiarowego firmy Hottinger Baldwin Messtechnik zawiera opis jak w języku QBASIC zorganizować współpracę komputera z tym wzmacniaczem (sterowanie nim i transmisję danych) W niniejszym opracowaniu język QBASIC ma w sposób możliwie łagodny wprowadzić nas w istotę programowania komputerów. Każdy kto pozna podstawowe idee i zasady programowania w tym dość prostym języku będzie bez większych problemów mógł - w razie potrzeby - opanować programowanie w dowolnym innym języku programowania. 2. Alfabet języka QBASIC 2.1. Zbiór znaków Zbiór znaków języka Qbasic obejmuje: 1. litery alfabetu angielskiego (A-Z, a-z) 2. cyfry dziesiętne: (0-9) 3. cyfry szesnastkowe: (A-F, a-f) 4. znaki działań arytmetycznych: +, -, *(mnożenie), / (dzielenie), \ (dzielenie całkowite), ^
(potegowanie) 5. kropka dziesietna przed częścią ułamkową. 6. nawiasy - tylko okrągłe: ( ) 7. operatory relacji: >, <, >=, <=, =, <> 8. początek komentarza: ' (apostrof) 9. znaki sterujące postacią wydruku:, (przecinek), ; (średnik) 10. znak oddzielający instrukcje w jednej linii: : (dwukropek) 11. znaki na końcu nazw, sygnalizujące typ zmiennej:!(single), #(double), $(string), %(integer), &(long) 2.2. Słowa kluczowe W języku Qbasic używanych jest ponad 100 określonych słów (pochodzących z języka angielskiego) zwanych słowami kluczowymi. Są to części instrukcji języka, a także nazwy funkcji standardowych i niektórych operatorów (np logicznych). Słowa te będą wymieniane w opisie poszczególnych struktur języka. 3. Struktury danych. Stałe i zmienne. 3.1. Co to są stałe i zmienne Programy komputerowe operują na danych a więc potrzebne są różne ich struktury i odpowiednie sposoby zapisywania. Zacznijmy od najprostszych. Popatrzmy na równanie poniżej: y = 2x + 5 W matematyce jest to równanie linii prostej, a w nim 2 i 5 to stałe a x i y to zmienne mogące przyjmować wartości z określonych zbiorów. W programowaniu też używa się zmiennych i stałych chociaż są pewne różnice a mianowicie: Po pierwsze - w programach (pisanych w językach proceduralnych) nie umieszcza się równań tylko instrukcje rozkazujące wykonać komputerowi konkretne operacje na danych posiadających konkretne wartości. Gdyby więc potraktować to równanie jako polecenie obliczenia wartości y to wcześniej należy nadać konkretną wartość zmiennej x na przykład instrukcją x=7 lub instrukcją polecającą wczytać do x wartość podaną z klawiatury Po drugie języki programowania nie dopuszczają do takiego bałaganiarstwa jak pomijanie znaku mnożenia a więc instrukcja obliczania y miałaby postać: y = 2 * x + 5 co należałoby przeczytać jako: "oblicz wartość wyrażenia 2*x+5 i podstaw wynik do komórki zarezerwowanej dla zmiennej y". Znak "=" jest więc rozkazem podstawiania w języku BASIC. W innych językach np. w Algol'u i Pascal'u symbolem podstawiania jest dwukropek wraz ze znakiem równości czyli " := ". Ponieważ zawsze najpierw obliczana jest wartość wyrażenia z prawej a potem wstawiana do zmiennej zapisanej po lewej więc w programach w Basic'u sens mają instrukcje takie jak: x = x + 1 czyli zwiększ wartość x o 1 A więc co to jest ZMIENNA w programach komputerowych? Zmienna to obiekt, który posiada określoną nazwę i typ oraz w danym momencie określoną (lub na początku jeszcze nie określoną) wartość. Nazwa i typ danej zmiennej ustalone są na cały czas działania programu natomiast jej wartość może być zmieniana w wyniku wykonywania instrukcji programu. Obrazowo można powiedzieć, że "zmienna jest pojemnikiem do przechowywania wartości odpowiedniego dla niej typu", to znaczy tylko takiego typu jaki dla zmiennej został zadeklarowany w sposób jawny (przez programującego) lub w sposób
automatyczny zwany domyślnym (samoczynnie przez QBASIC). Aby nadać zmiennej wartość można to zrobić a) wewnątrz programu - podstawić (przypisać) jej wartość wyrażenia (którym w najprostszym przypadku może być pojedyncza zmienna lub stała) b) wczytać z zewnątrz (uprzednio wprowadzoną) wartość zmiennej z klawiatury lub innego urządzenia zewnętrznego albo z pliku dyskowego Nazwa zmiennej jest zazwyczaj związana z jej rolą i znaczeniem w modelu matematycznym. Zmienne mogą mieć nie tylko wartości liczbowe ale i inne na przykład tekstowe, logiczne albo złożone z wielu typów prostych. Mówimy, że ZMIENNA jest symboliczną reprezentacją struktury danych bo reprezentuje przy pomocy symboli (ciągów liter) dowolne (ale w danym momencie konkretne) wartości tej struktury. Podsumowując i używając bardziej formalnego języka: STAŁA zwana czasem literałem przedstawia konkretną wartość w sposób jawny, dosłowny czyli literalny ZMIENNA to symboliczne przedstawienie struktury danych określonego typu przy pomocy nazwy Przykłady stałych Przykłady zmiennych Objaśnienia -652.74 Delta liczba i zmienna liczbowa "Kowalski" Nazwisko tekst i zmienna tekstowa [3.5, 12.0, -4.2, 8.1] V(k) wektor Kowalski 1964-12-08 ul. Sienkiewicza 30 30-031 Kraków Nazwisko Dat_ur Adres Kod Miasto rekord czyli "karta" z bazy danych Niezależnie od sposobu przedstawienia (literalnego czy symbolicznego) każda struktura danych ma określony typ - jeden z dopuszczalnych w danym języku programowania. Typy jakimi dysponuje QBASIC opisano poniżej. 3.2. Stałe w języku QBasic Stałe mogą w języku QBASIC być liczbami lub ciągami znaków (tekstami) Stałe liczbowe można zapisywać według następujących reguł: liczby ujemne poprzedza znak minus liczby dodatnie może ale nie musi poprzedzać znak plus część ułamkową musi poprzedzać kropka a nie przecinek można używać tzw. "notacji naukowej" zapisu liczb gdzie zamiast "razy 10 do potęgi ±n" występują symbole: E+n, E-n (dla typu pojedynczej precyzji) lub D+n, D-n (dla typu podwójnej precyzji) gdzie n jest wykładnikiem (konkretną liczbą całkowitą). Notacji "naukowej" można używać przy wpisywaniu wartości programach a także może się ona pojawiać się na wydrukach. Na przykład zamiast wpisać 300000 można napisać 3E5 lub 3E+5 a zamiast 0.00023 można zapisać 2.3E-4 (t.zw. "notacja naukowa"). Zmienna typu string może przechowywać tekst liczący (razem z odstępami i wszelkimi znakami)maksimum: 32767 znaków
3.3. Zmienne w języku QBasic Nazwa zmiennej w QBASIC'u może mieć max.40 znaków i to tylko liter angielskich i cyfr a pierwszym znakiem musi być litera. Oprócz zmiennych prostych stosowane są złożone typy danych (zmienne złożone) jak tablice i rekordy. Używa się także nazw: zmienna indeksowana (zamiast tablica) oraz zmienna rekordowa (zamiast rekord). 4. Proste typy danych i ich deklarowanie W języku QBASIC są typy proste (dla zmiennych i stałych) i złożone (dla innych struktur danych). 4.1. Proste typy zmiennych i stałych w języku QBasic: W języku QBasic można używać następujących typów prostych: Nazwa typu Określa Zakres wartości od do String łańcuchy znaków pusty 32767 znaków czyli teksty Integer liczby całkowite -32 768 32 767 Long liczby całkowite -2 147 483 648 2 147 483 647 długie Single liczby rzeczywiste ± 2.802597E-45 ± 3.402823E+38 pojedynczej precyzji Double liczby rzeczywiste podwójnej precyzji ± 4.940656458412465D-324 ± 1.79769313486231D+308 4.2. Deklarowanie typów zmiennych W jęz. BASIC w programach operujących na liczbach nie jest konieczne deklarowanie typu użytych zmiennych i wtedy BASIC domyślnie przyjmie, że są one takiego typu liczbowego jaki jest najczęściej stosowany (liczby rzeczywiste pojedynczej precyzji - SINGLE ) a tam gdzie będą wymagane liczby całkowite zostanie automatycznie pominięta część ułamkowa. Jest to duże ułatwienie szczególnie dla początkujących, jednak na wyższym stopniu zaawansowania powinno się raczej przestrzegać zasady deklarowania typów obowiązującej w innych językach (jak Pascal, C, C++, Java) albo przynajmniej być świadomym jakiego typu są użyte w programie zmienne. Jeśli deklarujemy typy zmiennych (a dla typów tekstowych i złożonych musimy to zrobić) to można to zrobić na dwa sposoby: a) przez deklaracje zapisane na początku programu lub jego podprogramu, mające postać: DIM lista nazw zmiennych AS typ zamiast słowa typ musi wystąpić jedna z nazw typów: String, Integer, Long, Single, Double Przykład: DIM alfa, beta, x, y AS DOUBLE b) drugi sposób: zamiast deklarowania można typ zmiennej zaznaczyć ostatnim znakiem nazwy zmiennej:
Znak Dla typu Przykład $ String ZmiennaTekstowa$ % Integer ZmiennaCalkowita% & Long ZmCalkowitaDluga&! Single ZmRzeczywista! # Double ZmPodwojnejPrecyzji# 5. Złożone typy danych Typy złożone to tablice oraz rekordy. Muszą one koniecznie być deklarowane. Tablice (ang.:arrays): Przykład zadeklarowania tablicy jednowymiarowej czyli ciągu o nazwie "a" i 100 elementach: DIM a(1 TO 100) AS INTEGER albo: DIM a%(1 TO 100) Gdzie symbol % zastępuje wyraz integer. Każdy ze 100 elementów może przechowywać inną wartość na przykład można podstawić: a%(1) = 10 a%(2) = 29 a%(3) = 39 A oto przykład deklaracji tablicy dwu-wymiarowej w matematyce zwanej macierzą DIM a$( 1 TO 4, 1 TO 3) Posiada ona 3x4 czyli 12 elementów i każdy może mieć inną wartość: a$(1,1) a$(1,2) a$(1,3) a$(2,1) a$(2,2) a$(2,3) a$(3,1) a$(3,2) a$(3,3) a$(4,1) a$(4,2) a$(4,3) Na tablicach operujemy przy pomocy pętli FOR.. NEXT.. lub innych 6. Wyrażenia W określonych miejscach instrukcji języka BASIC mogą występować wyrażenia: matematyczne tekstowe logiczne których składnikami mogą być odpowiedniego typu: stałe, zmienne, funkcje, operatory działań oraz nawiasy 6.1. Operatory, funkcje i wyrażenia matematyczne W wyrażeniach matematycznych (algebraicznych) mogą występować takie składniki jak: stałe typów liczbowych czyli liczby np.: 7645, -1.02233, -5.6e-9, 4.71645243945d87 zmienne typów INTEGER, LONG, SINGLE, DOUBLE nawiasy okrągłe operatory działań: +, -, *, /, ^ (potęga), \ (dzielenie całkowite z odrzuceniem reszty) funkcje o wartościach liczbowych Ważniejsze funkcje matematyczne przedstawiono w tabeli:
Funkcja QBASIC'a Objaśnienie ABS(x) wartość bezwzględna ATN(x) arcus tangens COS(x) cosinus EXP(x) e do potęgi x INT(x) część całkowita LOG(x) logarytm naturalny RND(x) liczba pseudolosowa SGN(x) znak (+1 lub -1) SIN(x) sinus SQR(x) pierwiastek kwadratowy TAN(x) tangens 6.2. Operatory, funkcje i wyrażenia tekstowe W wyrażeniach tekstowych czyli posiadających wartość typu STRING mogą występować takie składniki jak: stałe czyli łańcuchy znaków czyli teksty ujęte w cudzysłowy np.: "Ala ma kota", "Delta12", "12-65-23" zmienne typu string np.: a$, tekst$, x1$ nawiasy okrągłe operator łączenia tekstów: + funkcje o wartościach tekstowych Funkcja Opis ASC kod podanego znaku CHR$ znak o podanym kodzie HEX$ zamiana na postać liczby szesnastkowej INSTR szuka fragmentu w tekście LCASE$ zamiana na małe litery LEFT$ pobiera fragment z lewej LEN wyznacza długość tekstu LTRIM$ usuwa spacje przed tekstem MID$ pobiera fragment z wnętrza OCT$ zamiana na postać liczby ósemkowej RIGHT$ pobiera fragment z prawej RTRIM$ usuwa spacje za tekstem SPACE$ wytwarza ciąg spacji STR$ zamiana liczby na łańcuch tekstowy STRING$ wielokrotne powtarzanie znaku UCASE$ zamiana na małe litery VAL wartość liczbowa pewnych tekstów 6.3. Operatory, funkcje i wyrażenia logiczne Wyrażenia logiczne są niezbędne dla instrukcji warunkowych sterujących wykonywaniem programu jak instrukcja IF i niektóre instrukcje pętli. W języku QBASIC nie ma formalnie zmiennych i stałych logicznych jednakże wszystkie wyrażenia posiadające wartości liczbowe mogą być traktowane jak wyrażenia logiczne a mianowicie: jeśli są różne od zera to mają wartość logiczną PRAWDA jeśli są równe zero to mają wartość logiczną FAŁSZ A więc przykładowo instrukcje:
IF x<>0 THEN PRINT "NIE ZERO" oraz IF x THEN PRINT "NIE ZERO" są równoważne Najprostszym typem wyrażeń logicznych są relacje składające się z dwu wyrażeń matematycznych przedzielonych operatorem relacji, jednym z wymienionych w tabeli poniżej. Operatory relacji Operator Opis > większy >= większy lub równy < mniejszy <= mniejszy lub równy = równy <> nie równy Przykłady relacji: x > 3, a >= b, (m*x^2-12.342) <> (b-x)/(b^3-x^2) Dodatkowe zastosowanie operatorów logicznych pozwala tworzyć złożone wyrażenia logiczne Operatory logiczne Operator Opis NOT nie AND i OR lub Istnieją również operatory: XOR - Exclusive OR, EQU - Equivalence, IMP - Implication 7. Struktura programu. Okna podprogramów Program w QBASIC'u nie posiada wiersza tytułowego ale korzystnie jest umieścić na początku programu instrukcje PRINT wyświetlające objaśnienia do czego program służy oraz podać w KOMENTARZACH bardziej szczegółowe uwagi dotyczące działania poszczególnych części programu. Komentarze - muszą być poprzedzane słowem REM lub apostrofem (') i pisane są jak osobna instrukcja. Deklaracje tablic i zmiennych jeśli występują to powinny być przed instrukcjami wykonywalnymi. W jednej linii można zapisać kilka instrukcji ale wtedy należy je oddzielić dwukropkami, jeśli natomiast piszemy po jednej instrukcji w każdej linii to po prostu kończymy je naciśnięciem klawisza ENTER. Gdy wpiszemy linię rozpoczynającą podprogram FUNCTION lub SUB edytor QBASIC'a przeniesie nas do osobnego okna i dopisze instrukcję kończącą ten podprogram. Każdy podprogram oraz program główny ma swoje osobne okno choć widać tylko jedno. Ponieważ reszta programu znika wówczas więc początkujący użytkownicy myślą, że stracili to co wpisali. Bez obawy wystarczy nacisnąć klawisz F2 (lub z menu wybrać View Subs) aby zobaczyć wykaz napisanych już podprogramów i wybrać ten który chcemy oglądać lub poprawiać. 8. Podstawowe instrukcje do budowy programów w języku QBASIC W języku Basic i innych językach programowania, programy składają się z deklaracji (declarations) i instrukcji zwanych inaczej rozkazami lub komendami (statements, commands) o ściśle określonej budowie (gramatyce). Deklaracje opisują struktury danych a czasem i strukturę programu. Instrukcje są poleceniami które komputer ma wykonywać, a więc realizują działanie programu
Deklaracje i instrukcje zawierają pewne angielskie słowa zwane słowami kluczowymi. Słów tych można używać tylko w odpowiednich miejscach odpowiednich instrukcji a nie wolno używać w inny sposób na przykład jako nazw zmiennych. Najczęściej używane instrukcje, stanowiące minimalny zestaw pozwalający pisać proste programy opisano w kolejnych podpunktach 8.1. Sposób pisania instrukcji Każdą instrukcję zaczyna odpowiednie słowo kluczowe (np.: PRINT, IF, FOR,...) a kończy zmiana linii (klawisz ENTER) lub dwukropek. Wyjątkiem jest instrukcja LET w której słowo kluczowe może być pominięte( np.: LET x=5 lub x=5) Słów kluczowych nie wolno używać w roli nazw (zmiennych, etykiet, procedur,...) W razie potrzeby przed instrukcją może wystąpić numer lub etykieta czyli dowolne słowo i dwukropek tak aby można było do tej instrukcji powrócić z innego miejsca instrukcją GOTO etykieta, ale trzeba tego unikać stosując instrukcje strukturalne (blokowe) zawierające w sobie grupy instrukcji. Jeśli w jednej linii programu chcemy napisać kilka instrukcji to oddzielamy je dwukropkami 8.2. Komentarze Nie mają one znaczenia dla działania programu ale mogą być cenne dla człowieka analizującego treść programu a często i dla autora, który najczęściej po miesiącu od napisania programu nie pamięta dokładnie co miał na myśli. Komentarze - muszą być poprzedzane słowem REM lub apostrofem i pisane są jak osobna instrukcja. 8.3. CLS - czyszczenie ekranu Większość programów dobrze jest zacząć od tej komendy aby oczyścić ekran. 8.4. INPUT - wprowadzanie danych Instrukcja ta ma postać: INPUT "tekst żądania danych"; zmienna np.: INPUT "podaj wartość siły:"; sila lub INPUT "siła="; sila Tekst zawarty w cudzysłowach będzie wyświetlony aby użytkownik wiedział, że ma wpisać odpowiednią wartość. Wpisana wartość zostanie wstawiona do zmiennej, której nazwę podano w tej instrukcji. 8.5. PRINT - wyprowadzanie informacji na ekran Ma ona postać: PRINT lista_wyrażeń. Słowo PRINT znaczy "drukuj" (pochodzi z czasów gdy nie używano jeszcze monitorów ekranowych) ale jest używane w znaczeniu: "wyświetl na ekranie". Możliwe warianty tej instrukcji można przedstawić schematem: PRINT wyrażenie, ; Wyrażenia (matematyczne, tekstowe, logiczne) opisano wcześniej. W najprostszych przypadkach ;,
wyrażenia są pojedynczymi zmiennymi lub stałymi. Wyrażenia oddzielane są średnikami lub przecinkami a także na końcu listy może (nie musi) wystąpić przecinek lub średnik. Te przecinki lub średniki mają następujący wpływ na rozmieszczenie elementów wydruku: element występujący po średniku będzie na wydruku (lub ekranie) doklejony bez odstępu do swego poprzednika, element występujący po przecinku będzie na wydruku (lub ekranie) drukowany (wyświetlany) od początku kolejnej 14-to znakowej strefy a więc zazwyczaj z większym odstępem. jeśli na końcu instrukcji PRINT jest średnik lub przecinek to następna instrukcja PRINT będzie w tej samej linii wydruku wyprowadzać dalszy ciąg a jeśli nie ma to od nowej linii. Przykłady: Instrukcja: Wynik jej działania - wyświetlony napis: CLS: PRINT "Ala ma kota i psa" Ala ma kota i psa PRINT "Ala", "ma", "kota", "i", "psa" Ala ma kota i psa PRINT "Ala"; "ma"; "kota"; "i"; "psa" Alamakotaipsa PRINT Ala, ma, kota, i, psa 0 0 0 0 0 PRINT "2002-04-14" 2002-04-14 PRINT 2002-04 - 14 1984 realizacja instrukcji: LET x=9: PRINT "liczba="; x, "kwadrat="; x^2, "pierwiastek="; SQR(x) spowoduje wyświetlenie: liczba=9 kwadrat=81 pierwiastek=3 Pamiętaj, że w instrukcji PRINT: to co w cudzysłowach - będzie dokładnie przekopiowane na ekran jako tekst to co bez cudzysłowów - będzie potraktowane jako wyrażenie algebraiczne, którego wartość ma być obliczona i wyświetlona zamiast wpisywać słowo PRINT wystarczy wpisać pytajnik:? od przecinków i średników zależą odstępy między wyświetlanymi elementami (jak opisano wyżej) 8.6. LPRINT drukowanie Aby wyprowadzać wyniki na drukarkę (zamiast na ekran) wystarczy zastąpić słowo PRINT słowem LPRINT. Po za tym budowa instrukcji LPRINT jest identyczna jak PRINT Wyprowadzanie na ekran i drukarkę z formatowaniem oraz do pliku dyskowego opisano dalej. 8.7. LET - obliczenia i nadawanie wartości zmiennym Instrukcja LET zwana instrukcją przypisania lub instrukcją podstawiania może mieć dwie postacie: LET zmienna = wyrażenie lub częściej używaną postać uproszczoną bez słowa LET: zmienna = wyrażenie W obu przypadkach po polsku można to czytać: "Niech zmienna otrzyma wartość wyrażenia". Jeśli nie pamiętasz co to są wyrażenia to cofnij się do rozdziału 5. W najprostszym przypadku wyrażeniem może być oczywiście także pojedyncza liczba lub pojedyncza zmienna (np.: Sila1 = 17.543: X = Y) ale może też wystąpić na przykład instrukcja: ZETA = (SQR(a^2-INT(a))+.56) / (SIN(a-b)+COS(a^2-LOG(b))^2) Komputer najpierw obliczy wartość wyrażenia zapisanego po prawej a potem podstawi ją do zmiennej zapisanej po lewej. Dlatego mają sens takie instrukcje jak: X=X+1, ALFA=ALFA-5, które zwiększają (dla X) lub zmniejszają (dla ALFA) wartości zmiennych.
8.8. IF... THEN... ELSE... ENDIF - rozgałęzienie warunkowe Instrukcja ta może występować w kilku postaciach - zajmując jedną lub wiele linii programu: 1. postać jednolinijkowa: IF warunek THEN instrukcje1 lub: IF warunek THEN instrukcje1 ELSE instrukcje2 2. postać wielolinijkowa: IF warunek THEN instrukcje1... ELSE instrukcje2... ENDIF gdzie: warunek to dowolne wyrażenie logiczne Po polsku: "Jeśli warunek jest spełniony to wykonaj instrukcje1 w przeciwnym razie wykonaj instrukcje2" 8.9. FOR...NEXT - pętla z licznikiem Bardzo często program musi automatycznie powtarzać pewne operacje (albo określoną liczbę razy albo aż do uzyskania określonego rezultatu). Stosuje się wtedy instrukcje realizujące pętlę. Jedną z możliwości jest zastosowanie pętli FOR...NEXT, na przykład obliczanie kwadratów liczb: 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5 realizuje następujący program z pętlą: CLS PRINT "Obliczanie kwadratów liczb" PRINT "liczba", "kwadrat" FOR y=2 TO 5.5 STEP 0.5 PRINT y, y^2 NEXT y Znaczenie instrukcji FOR.. NEXT jest w tym przypadku następujące: " Dla Y zmieniającego się od 2 do 5.5 z krokiem co 0.5 powtarzaj wykonywanie instrukcji zapisanych poniżej aż do NEXT Y czyli w tym przypadku wyświetlaj Y i Y 2 " 9. Następny krok - kolejne przydatne instrukcje 9.1. PRINT USING i LPRINT USING - drukowanie z formatem Jest to taki wariant instrukcji PRINT, który pozwala wyświetlać wyniki w równych słupkach o określonej ilości cyfr przed i po kropce dziesiętnej. Można przetłumaczyć jej znaczenie jako: "drukuj używając podanego szablonu formatu". W najprostszym przypadku ten szablon formatu to zawarty w cudzysłowach ciąg tylu znaków # ile cyfr chcemy otrzymać odpowiednio przed i po kropce dziesiętnej. Na przykład w poniższym przykładzie - zmodyfikowanym programie KWADR1 - zarezerwowano 6 miejsc na cyfry przed kropką i 4 po kropce: CLS PRINT "Obliczanie kwadratow liczb"
PRINT "liczba", "kwadrat" FOR y = 0 TO 100 STEP 9.05 PRINT USING "######.####"; y; y^2 NEXT y Wpisz, zapisz do pliku KWADR2 i sprawdź działanie tego przykładu a potem przerób podobnie jeden z poprzednich programów. 9.2. Operowanie na tekstach QBASIC może operować nie tylko na liczbach ale i na tekstach a także generować grafikę i dźwięki. Aby BASIC rozpoznał, że chodzi o zmienne i funkcje o wartościach tekstowych musimy ich nazwy kończyć znakiem"$" albo zadeklarować (n.p.: DIM x, y as STRING) Oto przykład programu, który rozpoznaje (na podstawie ostatniej litery imienia) płeć użytkownika i odpowiednio jego lub ją pozdrawia: cls: ' czyści ekran poczatek : input "Podaj twoje imię:"; imie$ if right$(imie$,1) = "a" then zwrot$ = "pani" else zwrot$ = "pan" endif print "A! to " + zwrot$ + imie$ + ", Witam!" goto poczatek Funkcja standardowa: right$(x$,n) zwraca n znaków wycietych z prawej części tekstu X$ Inne funkcje związane z operacjami na tekstach to: Funkcja Opis ASC kod podanego znaku CHR$ znak o podanym kodzie INSTR szukanie fragmentu tekstu LCASE$ zamiana na małe litery LEFT$ wycinanie z lewej LEN długość tekstu (liczba znaków) LTRIM$ usuwanie spacji przed tekstem MID$ wycinanie ze środka RIGHT$ wycinanie z prawej RTRIM$ usuwanie spacji za tekstem SPACE$ wstawienie zadanej liczby spacji STR$ zamiana liczby na tekst UCASE$ zamiana na duże litery VAL wartość liczby danej jako tekst 9.3. PODPROGRAMY Im dłuższy jest program tym staje się mniej czytelny, trudniejszy do analizy i podatniejszy na błędy. Aby temu zapobiec i ułatwić pisanie programów, także przez wielu niezależnych programistów, należy przy projektowaniu programu wyodrębnić samodzielne zagadnienia dające się określić pojedynczymi zdaniami i następnie zapisać je w postaci osobnych podprogramów. W szczególności opłaca się pisać podprogramy, które będą wielokrotnie wykorzystywane w różnych miejscach programu. Każdy podprogram jest identyfikowany przez swą nazwę a jego użytkowanie polega na wpisanie w odpowiednim miejscu programu i odpowiedniej formie wywołania tej nazwy. Większość podprogramów przetwarza dane i wtedy przy ich wywoływaniu wymaga podania odpowiednich wartości parametrów stanowiących dane wejściowe. Istnieją także podprogramy nie wymagające parametrów A więc podprogram musi mieć swą nazwę, może też mieć parametry.
Istnieją dwa typy podprogramów: procedury: SUB... END SUB (niekoniecznie służące do obliczeń) funkcje: FUNCTION... END FUNCTION (zwracające jedną wartość) Edytor QBASIC'a automatycznie przemieszcza każdą wpisywana procedurę (SUB) i funkcję (FUNCTION) do osobnego okna. A więc po wpisaniu słowa SUB lub słowa FUNCTION samoczynnie dopisywane jest zakończenie podprogramu czyli END SUB lub END FUNCTION i znika dotychczas napisany tekst programu gdyż edytor przenosi nas do nowego pustego okna. Wykaz nazw podprogramów i możliwość przejścia do jednego z nich jest możliwa po naciśnięciu klawisza F2 albo po wybraniu z menu pozycji View. 9.3.1. FUNCTION... RETURN - definiowanie własnych funkcji Oprócz możliwości wykorzystywania standardowych funkcji języka BASIC użytkownik może definiować własne funkcje. Funkcja to podprogram którego nazwa pełni zarazem rolę zmiennej wynikowej to znaczy przez swą nazwę funkcja zwraca nam jedną wartość - wyznaczoną na podstawie wartości jednego lub wielu parametrów wejściowych, a czasem bez żadnych parametrów (na przykład w Excel'u są funkcje bezargumentowe: PI(), Dziś()). Oprócz wspomnianych gotowych już funkcji standardowych jak SIN(x), SQR(x) i inne, użytkownik może definiować dowolne własne funkcje przez napisanie odpowiednich podprogramów. Każdy podprogram może używać swoich lokalnych nazw zmiennych i parametrów bez obawy kolizji z nazwami z innych podprogramów. Zaczniemy od najprostszych przykładów, Wpisz: Pojawi się: function srednia(a,b) FUNCTION srednia (a, b) srednia=(a+b)/2 srednia = (a+b)/2 END FUNCTION A więc po wpisaniu pierwszej linii ze magicznym słowem "function" : samoczynnie dopisało się: END FUNCTION zostaliśmy przeniesieni na nowy ekran bo każda funkcja i procedura pisana jest w QBASIC'u na innym ekranie a wybierać i przełaczać możemy po naciśnięciu klawisza F2 (lub z menu View) pamiętajmy że wartość wynikową zawsze trzeba podstawiać do nazwy funkcji Naciśnij klawisz F2 i przełącz edytor do głównego segmentu programu i tam wpisz:? "Testowanie funkcji srednia:"? srednia(3,7) 9.3.2. SUB... ENDSUB, CALL - definiowanie procedur i ich wywoływanie Przykładami procedur mogą być procedury obliczeniowe jak na przykład obliczanie całki, pochodnej, średniej arytmetycznej itp. a także procedury spełniające inną rolę jak na przykład operacje plikowe (przeglądanie, tworzenie katalogów i in.), procedury realizujące wprowadzanie informacji
(obsługa menu, myszki itp.), procedury graficzne (wyświetlanie wykresów i in. obrazów). Mogą być także procedury nie wymagające żadnych parametrów i wykonujące zawsze tą samą ustaloną czynność na przykład: wyświetlenie zawartości bieżącego katalogu, wyświetlenie ustalonego komunikatu, zagranie określonej melodii itp. Oto przykład bardzo prostej procedury o nazwie PAUZA z parametrem n od którego zależy długość pauzy czyli czas wykonywania pętli FOR..NEXT SUB Pauza (n) FOR ii = 1 TO n: NEXT ii END SUB Inna bardzo prosta procedura PING tym razem bez parametrów wytwarza określony dźwięk. SUB ping SOUND 800,.2 END SUB 9.4. WHILE... WEND pętla z warunkiem Czasem liczba powtórzeń realizowanych przez pętlę programową nie jest z góry określona ale powtarzanie ma być realizowane aż do spełnienia pewnego warunku. Do tego celu może służyć pętla WHILE... WEND która powtarza zawarte wewnątrz instrukcje tak długo jak wyrażenie ma wartość niezerową: WHILE wyrażenie... instrukcje... WEND 10. Dźwięki i melodie Dla generowania dźwięków służą instrukcje SOUND oraz PLAY: Bardzo prosta instrukcja SOUND ma tylko 2 parametry: SOUND częstotliwość, czas_trwania częstotliwość - podaje się w Hz w zakresie 37 do 32767 czas_trwania w cyklach zegarowych (od 0 do 65 535), przy czym 18.2 odpowiada 1 sekundzie Dla melomanów polecam instrukcję PLAY: PLAY komendy_muzyczne$ komendy_muzyczne$ - to wyrażenie tekstowe zawierające jedną lub więcej następujących komend opisanych szczegółowo w pliku HELP. Przykład: 'Gra gamy w 7-miu oktawach (0 do6) gama$ = "CDEFGAB" : ' to są nuty gamy PLAY "L8": ' będzie grać ósemkami FOR i = 0 TO 6 PLAY "O" + STR$(i): '- ustawia oktawe PLAY "X" + VARPTR$(gama$) : ' gra gamę NEXT i
11. Operacje plikowe Najbardziej niezbędne instrukcje umożliwiające wczytywanie danych z plików dyskowych oraz zapisywanie wyników na dysk oraz pewne inne operacje plikowe. 11.1. Instrukcje OPEN i CLOSE Przed rozpoczęciem pierwszego odczytywania z pliku lub zapisywania do niego trzeba plik otworzyć instrukcją: OPEN plik$ [FOR tryb] AS [#]identyfikator% gdzie: plik$ - wyrażenie tekstowe określające nazwę pliku tryb to jedno ze słów kluczowych: APPEND, BINARY, INPUT, OUTPUT, lub RANDOM identyfikator% - to numer z zakresu 1 do 255 którym muszą się posługiwać instrukcje odwołujące się do tego pliku Aby zakończyć operacje z danym plikiem trzeba go zamknąć instrukcją: CLOSE #identyfikator% a jeśli chcemy zamknąć wszystkie otwarte pliki to wystarczy CLOSE Przykład: INPUT "Podaj nazwe pliku: "; n$ OPEN n$ FOR OUTPUT AS #1 PRINT #1, "Ten tekst będzie zapisany do pliku" CLOSE 11.2. Wczytywanie danych z pliku OPEN "DANE.TXT" FOR INPUT AS #1 'Otwarcie pliku do odczytu z numerem 1 PRINT "Tekst pliku:" DO WHILE NOT EOF(1) 'Pętla działa aż do napotkania znacznika końca pliku 1 LINE INPUT #1, LINIA$ 'Wczytuje linię tekstu z pliku PRINT LINIA$ 'Wyświetla wczytaną linię tekstu na ekranie LOOP 'Koniec pętli CLOSE #1 'Zamknięcie pliku 11.3. Zapis do pliku Oto przykład programu zapisującego wyniki na dyskietkę do pliku WYNIKI.TXT: CLS PRINT "Drukowanie do pliku WYNIKI.TXT" OPEN "A:\WYNIKI.TXT" FOR OUTPUT AS #1 PRINT #1, "Obliczanie kwadratow liczb" PRINT #1, "liczba", "kwadrat" FOR y = 0 TO 100 STEP 9.05 PRINT #1, USING "######.####"; y; y ^ 2 NEXT y CLOSE #1 Sprawdź jego działanie - wkładając dyskietkę na której zapiszą się wyniki. Następnie otwórz plik wyników w NOTATNIKU i przejrzyj.
11.4. Inne przydatne operacje plikowe CHDIR ścieżka$ MKDIR ścieżka$ RMDIR ścieżka$ FILES [szablon$] - zmiana bieżącego foldera - utworzenie foldera - usunięcie foldera - wyświetlenie zawartości foldera Przykład: MKDIR "C:\TEMP\TEST" CHDIR "C:\TEMP" FILES RMDIR "TEST" KILL plik$ - wymazanie pliku NAME nazwa$ AS nowa_nazwa$ - zmiana nazwy 12. Grafika w języku QBASIC Tryby graficzne Przed jakąkolwiek instrukcja graficzną trzeba komendą SCREEN ustawić tryb graficzny ekranu. Dla współczesnych sterowników ekranowych (kart graficznych) kompatybilnych ze standardem VGA najlepiej użyć trybu nr.9 lub 12 SCREEN 12 ustawia rozdzielczość 640 x 480 pixeli, 16 kolorów (od 0 do 15) oraz 25 linii tekstu po 80 znaków. Dla tego trybu kolor znaków i linii (ale nie tła) można ustawiać instrukcją: COLOR nr_koloru_tekstu SCREEN 9 ustawia rozdzielczość 640 x 350 pixeli, 16 kolorów (od 0 do 15) oraz 25 linii tekstu po 80 znaków, dodatkowo można zmieniać zarówno kolor tekstu jak i tła: COLOR nr_koloru_tekstu, nr_koloru_tła Rysowanie linii i prostokątów Instrukcja: LINE (x1, y1)-(x2, y2), kolor - rysuje odcinek od (x1,x2) do (x1,x2) Instrukcja: LINE (x1, y1)-(x2, y2), kolor, B - rysuje prostokąt pusty, a instrukcja: LINE (x1, y1)-(x2, y2), kolor, BF - rysuje prostokąt wypełniony. Okno graficzne i współrzędne w tym oknie Linie, okręgi i inne elementy graficzne można rysować na całym ekranie (wtedy punkt 0,0 jest w lewym górnym rogu ekranu) ale jeśli chcemy to robić tylko w pewnym oknie to trzeba je zdefiniować. Instrukcja: VIEW (x1, y1)-(x2, y2), kolor_tła, kolor_ramki - definiuje okno graficzne. Bardzo wygodne jest to, że można w tym oknie zupełnie dowolnie ustalić zakres zmian współrzędnych (nie zwracając uwagi na piksele). W tym celu trzeba użyć instrukcji WINDOW podając w niej najpierw jakie pasowałyby nam współrzędne lewego-górnego rogu a potem prawego-dolnego: WINDOW (xmin, ymax)-(xmax, ymin) Ustalanie pozycji wydruku na ekranie: Do tego służy instrukcja: LOCATE wiersz_od góry, kolumna_od_lewej
13. Obsługa interfejsu szeregowego OPEN "COMn: optlist1 optlist2" [FOR mode] AS [#]filenum% [LEN=reclen%] n - numer portu który ma być otwarty (1 = COM1, 2 = COM2). optlist1 - najczęściej używane parametry komunikacji: [baud] [,[parity] [,[data] [,[stop]]]] baud to szybkość transmisji w bodach (bitach na sekundę): 75, 110, 150, 300, 600, 1200, 2400, 4800, 9600 parity - to metoda kontroli błędów z użyciem parzystości kodu: N (bez kontroli) E (parzysty) O (nieparzysty) S (space) M (mark) PE (enable error checking) data - to liczba bitów danych: 5, 6, 7, 8 stop to liczba bitów stop: 1, 1.5, 2 Wartości domyślne: 300 baud, even parity, 7 data bits, 1 stop bit. optlist2 - lista rzadziej używanych parametrów, (oddzielanych przecinkami i opisanych w HELPie) Przykład: OPEN "COM1:300,N,8,1" FOR RANDOM AS #1