Programowanie w Basic

 

Programowanie na kalkulatorach graficznych: Algebra FX 2.0 Plus i CFX 9850

 

Na kalkulatorach Casio istnieje możliwość pisania programów w języku CTF (Casio Text Format). Do dyspozycji mamy całą gamę standardowych poleceń kalkulatora oraz specjalne polecenia w trybie programowania. Programy piszemy zwykle używając edytora na kalkulatorze, można też pisać w Fa-123 co czasem się przydaje np. gdy mamy przekopiować znaczną ilość tekstu lub wstawić znak który nie jest dostępny z kalkulatora, a takich jest trochę. Wstawiane przez nas polecenia nie składają się z pojedynczych liter (tak wprowadzone słowo jest traktowane jako błąd), lecz stanowią całość. Dzięki temu pisanie programów bezpośrednio na kalkulatorze jest znacznie szybsze i uniemożliwia popełnienie błędów składniowych.

Zakładam, że czytelnik jest zapoznany z podstawową obsługą kalkulatora. Zna wszystkie tryby pracy kalkulatora i wie gdzie znaleźć odpowiednie funkcje.

 

Podstawowe pytanie jakie można sobie zadać, to: do czego przeciętnemu użytkownikowi może przydać się umiejętność tworzenia programów na kalkulatorze, wiedząc, że możliwości takiego kalkulatora są ograniczone. Odpowiedź jest bardzo prosta. Tworząc nawet bardzo proste programy poszerzamy możliwości kalkulatora. Pisanie programów ma wtedy sens gdy wiemy, że wykorzystamy go powtórnie lub bardzo zaoszczędzi nam czas. Żmudne obliczenia, podstawianie do wzorów możemy zastąpić jednym programem. Dlatego takie kalkulatory w pewnych środowiskach jak np. wśród geodetów czy uczniów szkół morskich i marynarzy cieszą się dużym powodzeniem. Wszystko dzięki możliwości budowania nowych funkcji kalkulatora, czyli programowaniu.

 

 

Zmienne

Prawie w każdym języku programowania niezbędna jest możliwość rezerwowania miejsc w pamięci (zmiennych) komputera aby przechować tymczasowo lub na stałe liczby (różne typy: całkowite, zmienno przecinkowe), ciągi znaków (jakiś tekst, który potem chcemy poddać obróbce), rysunki, itd. ... . CTF nie daje nam możliwości tworzenia własnych zmiennych. W języku C możemy np. stworzyć zmienną o nazwie „liczba”, w której będziemy przechowywać tylko liczby całkowite. Możemy wykorzystać wyłącznie to, co daje nam kalkulator, czyli: wszystkie litery, listy, macierze, pamięć funkcji, pamięć rysunków. Zobaczmy jak z tego korzystać.

a)      Litery

Do zmiennej w postaci litery możemy wprowadzać liczby różnych typów. Jest to najbardziej podstawowa metoda przechowywania danych w pamięci. Litery wywołujemy kombinacją klawiszy (Alpha) i klawisza odpowiadającego odpowiedniej literze. Np. chcąc zapisać w komórce pamięci odpowiadającej literze S liczbę 1,232 robimy to następująco: 1.232 -> S. Strzałka jest tu symbolem przypisania.

b)      Listy i Macierze

Listy w kalkulatorze zorganizowane są podobnie jak kolumny w programie Excel. Nie jest to jednak to samo. Dane do listy musimy wpisywać w odpowiedniej kolejności poczynając od pozycji pierwszej. Nie można wstawić np. jakiejś liczby na pozycję nr 5 gdy pozostałe komórki nie zostały wypełnione liczbami.

Przed korzystaniem z listy możemy wcześniej określić jej rozmiar, czyli podać liczbę komórek z których zamierzamy korzystać. Tak utworzona lista automatycznie zostanie wypełniona zerami. W takim przypadku każdą komórkę listy będziemy mogli traktować jak odrębną zmienną.

Przykład (inicjalizacja listy):

Rozmiar listy nr 1 ustalimy na 7 elementów i na miejsce nr 5 wstawimy jakąś liczbę.

 

5->Dim list1

1.2132->list1[5]

 

Chcąc zapisać liczbę w komórce macierzy najpierw musimy określić jej rozmiar. Utworzymy np. macierz składającą się z trzech kolumn i dwóch wierszy.

{2,3}->Dim Mat B

Podobnie jak z listami macierz o zadanym wymiarze została wypełniona zerami. Teraz wpiszmy w wybraną komórkę ( np. 2 kolumna, 1 wiersz) jakąś liczbę.

 

323->Mat B[1,2]

 

Każdą komórkę macierzy możemy teraz traktować jak odrębną zmienną.

 

c)      Pamięć funkcji

Do pamięci funkcji możemy załadować przepis funkcji, który  później chcemy wykorzystać w celu jej narysowania lub obliczenia wartości. Mamy np. funkcję y=x^2+5, piszmy ją do pamięci funkcji fn1. Przepis umieszczamy w nawiasach klamrowych.

 

„X^2+5”->fn1  (to nie działa na CFX 9850 )

 

Należy pamiętać, że wartość x jest taka jak ją sobie wcześniej ustaliliśmy czyli wpisując:

5->X a następnie fn1 otrzymamy wartość funkcji dla liczby 5.

 

Bardzo przydatną własnością pamięci funkcji jest to, że właściwie możemy do niej wpisać cokolwiek nam się podoba, włączając w to całe wyrażenia lub np. fragment programu. Gdy np. mamy jakiś znak lub kod, którego używamy dość często możemy zapamiętać go w jednej z tych pamięci a potem w trakcie pisania programu wywołać.

 

Uwaga: ( tylko CFX 9850 )

·        nie można z pozycji programu wprowadzać wartości do zmiennych funkcyjnych: fn i Yn. Takie przypisanie trzeba zrobić przed uruchomieniem programu. Nie działają np. takie przypisania: "X^2 + 5"-> fn1, ?->fn1, fn1-fn2->fn3

 

 

d)      Pamięć rysunków

W tej pamięci możemy zapisać wygląd ekranu w trybie graficznym czyli gdy np. rysujemy wykres.

 

Polecenia w trybie programowania

Przedstawię teraz polecenia dostępne po naciśnięciu SHIFT + PRGM.

a)      COM

·        Instrukcja warunkowa If

Jeżeli określony warunek jest spełniony, to wykonywana jest zadana przez nas instrukcja, a jeśli nie, wykonywana jest inna procedura (opcjonalne). Np.

If X=5

Then 3->X

Else 6->X

Ifend

 

·       Pętla For.

Dana procedura będzie wykonywana określoną liczbę razy, dopóki nie zostanie osiągnięta zadana wartość zmiennej sterującej. Wartość tej zmiennej przy każdym kolejnym obiegu pętli jest zwiększana lub zmniejszana (standardowo o 1 ale możemy to ustalić przy instrukcją Step). Teraz wypisywane będą liczby do 1 do 5 i gdy X osiągnie wartość 5 pętla zostanie zakończona.

For 1->X To 5

X»

Next

 

Teraz skok ustalmy na 0.5

 

For 1->X To 5 Step 0.5

X»

Next

 

·       Pętle While.

Dana procedura będzie wykonywana dopóki określony warunek jest spełniony. Mamy do wyboru dwa rodzaje pętli: warunek może być zadany na początku lub na końcu pętli. Czyli prawdziwość danego wyrażenia może być sprawdzana przed wejściem do pętli lub po pierwszym wykonaniu znajdującej się w niej procedury.

Np.

0->X

Do

X+1->X

LpWhile X<10

Za każdym razem wartość X jest zwiększana o 1. Wyjście z pętli nastąpi gdy wartość X osiągnie 10. Ale gdyby zadać początkowe X większe lub równe dziesięć to i tak jego wartość zostanie zwiększona. Inaczej będzie z drugą odmianą pętli, tutaj warunek jest sprawdzany na początku i wartość X w powyższym przypadku pozostanie niezmieniona.

 

While X<10

X+1®X

WhileEnd

 

b)      CTL – kontrola działania programu.

·        Prog – uruchamia program, lub podprogram.

Np. Prog „nowe2”

·        Return – kończy pracę programu lub podprogramu (przechodzi do programu głównego)

·        Break – przerywa działanie pętli

·        Stop – kończy działanie programu

 

c)      JUMP – skoki bezwarunkowe.

·        Goto i Lbl

W dowolnym miejscu programu możemy wstawić etykietę Lbl z jednoznakową nazwą np. Lbl 0 lub Lbl R. W innym miejscu programu wstawiamy instrukcję Goto odwołującą się do poprzednio utworzonej etykiety, czyli Goto R. Po napotkaniu takiej instrukcji wykonany zostanie skok do miejsca programu oznaczonego tą etykietą.

·        Þ wynikanie. Taki znak zastępuje instrukcję If.

X=5Þ4->X

Gdy X będzie równe 5, wartość X zostanie zmieniona na 4.

Zastosowanie tej instrukcji zmniejsza wielkość programu i polepsza czytelność kodu programu.

·        Dsz

Funkcja obniża wartość zmiennej sterującej o 1 i sprawdza ile ona wynosi. Jeśli jej wartość jest różna od 0, wykonywana jest instrukcja występująca bezpośrednio po tym poleceniu, czyli bezpośrednio po „ : ” np.

0->X

Dsz X:1»               (po 1 jest znak {display}, tylko dlatego żeby wyświetlić liczbę)

2

W tym przypadku wartość zmiennej sterującej po obniżeniu o 1 wynosi –1 czyli wykonywana jest instrukcja występująca bezpośrednio po dwukropku. Jeśli wartość X wynosiłaby 1, wówczas na ekranie pojawi się tylko liczba 2.

·        Isz

Działa identycznie jak Dsz. Różnica jest tylko w tym, że wartość zmiennej sterującej zwiększana jest o 1.

 

 

d)      ? używamy wtedy, gdy chcemy w trakcie wykonywania programu wprowadzić do zmiennej nową wartość. Program jest wtedy zatrzymywany i czeka na wprowadzenie naszej liczby np. :

?->X

e)      » powoduje wypisanie wartości stojącej przed tym znakiem zmiennej np.

X»

f)        CLR – funkcje kasujące

·        ClrText – kasuje zawartość ekranu w trybie tekstowym

·        ClrGraph – kasuje zawartość ekranu w trybie graficznym

·        ClrList – kasuje dane znajdujące się w określonej liście. Dla listy nr 1 składnia jest następująca: ClrList 1

·        ClrMat – kasuje określoną macierz np. ClrMat A

 

g)      DISP –

·        DrawStat – rysuje aktywne wykresy statystyczne. (czyli te zaznaczone na ON)

·        DrawGraph - rysuje aktywne funkcje z trybu Graph

·        DrawDyna - rysuje aktywne wykresy dynamiczne.

·        DispF-Tbl i DispR-Tbl - wyświetla tablice z wartościami funkcji i rekurencji.

h)      REL – relacje

i)        I/O – funkcje wejścia i wyjścia

·        Locate – wypisanie wartości zmiennej lub tekstu w dowolnym miejscu ekranu w trybie tekstowym.

Locate nr wiersza (od 1 do 7), nr kolumny (od 1 do 21) np.

Locate 1,3,X

Wyświetli wartość X a

Locate 1,3,”X”

Wyświetli na ekranie sam symbol X

 

j)        Getkey – zwraca liczbę odpowiadającą naciśniętemu przyciskowi kalkulatora. Np.

Do

Getkey->K

LpWhile K=0

Program będzie czekał dopóki, dopóty nie zostanie naciśnięty jakiś przycisk. Odpowiadająca mu wartość zostanie wpisana do X.

 

k)      Send( i Receive( - wysyłanie i odbieranie danych

l)        : (dwukropek) – zastępuje znak nowej linii lub display. Przy nadmiernym stosowaniu sprawia, że program stanie się totalnie nieczytelny.

 

Błędy

 

Przy pisaniu programów możemy spotkać się z różnymi typami błędów. Najmniejsze są te, które wskaże nam automatycznie kalkulator, zaś najgorsze, błędy logiczne lub wynikające z dziwnego działania jakiegoś polecenia. Te ostatnie najtrudniej wykryć i usunąć. Przedstawię problemy z którymi najczęściej możemy się spotkać.

 

b)      Błąd składni

Błąd pojawia się wtedy gdy składnia polecenia jest nie taka jak trzeba. Nie ma tu możliwości w złym zapisie polecenia, możemy nieprawidłowo wpisać za to parametry polecenia np. stosując nieodpowiednie nawiasy lub podając za dużo lub za mało parametrów.

c)      Błąd pamięci.

Pojawia się gdy odwołujemy się np. do listy lub macierzy, która nic nie zawiera.

Tak jak zauważyłem, kalkulator potrzebuje trochę wolnej pamięci w przestrzeni gdzie zapisujemy programy. Gdy całkowicie zapchamy tą pamięć, mogą pojawiać się problemy w czasie wykonania programu.

 

d)      Inne ważne rzeczy:

·        program nie może zawierać pustych linii ( tylko CFX 9850 )

·        przy wypisywaniu tekstu poleceniem text współrzędne txt, gdzie ma być wyświetlony przechowywane są w zmiennych x i y. Jeśli np. wcześniej coś tam zapiszemy to po wyświetleniu tekstu nasze dane zostaną utracone. ( tylko CFX 9850 )

·        nie można z pozycji programu wprowadzać wartości do zmiennych funkcyjnych: fn i Yn. Takie przypisanie trzeba zrobić przed uruchomieniem programu. Nie działają np. takie przypisania: "X^2 + 5"-> fn1, ?->fn1, fn1-fn2->fn3  ( tylko CFX 9850 )

·        aby program zadziałał tak jak tego chcemy na każdym kalkulatorze powinniśmy stosować polecenia z menu setup. Np. powinniśmy przed wypisaniem liczby podać typ wpisu jaki chcemy uzyskać bo np. inny kalkulator może być ustawiony nie na Normal jak tego chcemy. Dotyczy to również rysowania wykresów, przewidzenia, że ktoś może mieć wyłączone osie współrzędnych itd.

 

Parę porad

  • Pisząc program musimy zawsze pamiętać o zrobieniu do niego odpowiedniej dokumentacji, ponieważ gdy za parę tygodni na nowo będziemy chcieli z niego korzystać, możemy już nie pamiętać np. jakie listy, zmienne obsługuje i jak działa (np. w przypadku przeróbek). Bardzo polecam pisanie komentarzy w kodzie źródłowym (wstawia się je za znakiem ' ).
  • Na początku każdego programu powinno się zamieścić datę ostatniej modyfikacji kodu oraz mały komentarz: do czego program służy, z jakich zmiennych, list, macierzy korzysta (takie wiadomości są bardzo przydatne, ponieważ użytkownik będzie wiedział np. że po uruchomieniu zostanie skasowana lista 1, w której aktualnie posiada ważne dane, czyli przed uruchomieniem programu będzie musiał przekopiować dane gdzie indziej. Gdy udostępniamy program dla innych to jest KONIECZNE!
  • Plik startowy programu najlepiej zacząć od znaku, który sprawi, że na liście kalkulatora zostanie umieszczony na początku, wtedy nie będziemy musieli go szukać np. gdy posiadamy 50 plików a nasz zaczyna się na M. Takimi preferowanymi znakami są: spacja oraz cudzysłów ". Ja preferuję cudzysłów bo spacja nie jest dobrze widoczna.
  • Zmienne w programie należy dobierać w taki sposób aby ich zmienianie wyrządziło jak najmniej szkody użytkownikowi. Wybieramy te najmniej używane file 6 i listy od 20, podobnie macierze poczynając od Z. Ze zmiennymi literowymi różnie to bywa więc najlepiej dawać to z czym kojarzy się przechowywana tam wartość.
  • W basicu nie ma możliwości pisania funkcji (np. takich jak w C), także gdy chcemy korzystać z jakiejś procedury kilka razy to nie bójmy się pisać podprogramów, które możemy wywoływać w programie głównym. Wtedy kod jest czytelniejszy oraz łatwiejszy do ewentualnych modyfikacji.
  • Zamiast polecenia if-then-ifend można używać znaku wynikania => (niedostępnego normalnie na kalkulatorze), zamieszczam go w programie symbole. Czasem bardzo skróci to kod naszego programu.
  • Gdy chcemy przetestować pewną część programu można użyć polecenia skoku warunkowego
  • Przy testowaniu aby łatwiej trafić do pisanego fragmentu kodu polecam poprzedzenie go komentarzem zawierającym specyficzny znak, który potem łatwo znajdziemy przy pomocy wyszukiwania.
  • Z programu powinno istnieć łatwe wyjście np. przy pomocy ESC a nie przerywanie go klawiszem AC.
  • Program musi działać w miarę szybko, żeby w ogóle miał sens i nie zniechęcał użytkownika. Więc optymalizujmy go jak tylko się da!