Rozdział 9 - Dalsze programowanie komputera

Wpisz:

NEW

Wymaże to każdy stary program i zmienne w ZX81 (podobne działanie ma CLEAR, lecz CLEAR wymazuje tylko zmienne). Teraz dokładnie wpisz poniższy program:

10 REM TEN PROGRAM OBLICZA PIERWIASTKI KWADRATOWE
20 INPUT A
30 PRINT A,SQR A
40 GOTO 20

(w wierszu 10 sam będziesz musiał wpisać większość spacji).

Teraz uruchom go. Ekran robi się biały i nic się nie dzieje, lecz spójrz na kursor w lewym dolnym rogu ekranu: tak, gdzie można się było spodziewać  K , teraz jest  L  - maszyna przeszła w tryb wprowadzania danych. Stało się to w wyniku polecenia INPUT w wierszu 20. Maszyna czeka na ciebie, aż wpiszesz jakąś liczbę (albo nawet jakieś wyrażenie) i nie pójdzie dalej, dopóki tego nie zrobisz. Gdy dane zostaną dostarczone, będzie to miało taki sam efekt jak:

20 LET A=... cokolwiek wpisałeś

Zaczekaj chwilę, a co stało się z wierszem 10? Wygląda, jakby komputer go zupełnie zignorował. Właściwie to tak zrobił. REM w wierszu 10 oznacza komentarz, którego jedyną funkcją jest przypominanie ci, do czego służy ten program. Polecenie REM składa się ze słowa kluczowego REM, za którym można wpisać cokolwiek się chce, a komputer i tak to zignoruje.

Dobrze, jesteśmy zatem w trybie odczytu dla wiersza 20. Wpisz jakąś liczbę, powiedzmy 4 i wciśnij następnie NEWLINE. Na ekranie pojawi się liczba 4 oraz jej pierwiastek kwadratowy i mogłeś pomyśleć, że to już wszystko. Ale nie - wydaje się, że komputer chce następną liczbę. Spowodowane to jest wierszem 40 z poleceniem GOTO 20, które oznacza: IDŹ DO wiersza 20. Zamiast przelecenia przez wiersze programu i zatrzymania się komputer skacze wstecz do wiersza 20 i rozpoczyna od początku. Zatem wpisz następną liczbę (powiedzmy 2 - w każdym razie niech lepiej będzie nieujemna).

Po kilku następnych liczbach możesz się zastanawiać, czy maszynie kiedykolwiek się znudzi taka zabawa; nie znudzi się. Gdy ponownie zapyta o liczbę, wpisz zamiast niej STOP (A z SHIFT); zrozumie aluzję. Komputer zgłosi komunikat D/20 - wyszukaj go na liście komunikatów (w dodatku B). 20 oznacza numer wiersza, w którym czekał na dane, gdy program został zatrzymany przez ciebie.

Nagle przypomniałeś sobie jednak, że potrzebujesz obliczyć pierwiastki kilku innych liczb? Zatem wpisz:

CONT

(skrót dla CONTINUE - KONTYNUUJ) a komputer wyczyści ekran i poprosi cię o kolejną liczbę.

Dla operacji CONT komputer zapamiętuje numer wiersza w ostatnim komunikacie, który ci wyświetlił i który posiadał kod różny od 0 - i do zapamiętanego wiersza wykonywany jest skok. Ponieważ ostatnim komunikatem było D/20 (a D nie jest równe 0), to w naszym przypadku CONT działa identycznie jak GOTO 20.

Teraz wpisuj liczby aż ekran się cały zapełni. Gdy to się stanie, komputer zatrzyma wykonywanie programu z komunikatem 5/30. Kod 5 oznacza "pełny ekran" a 30 jest numerem wiersza polecenia PRINT starającego się wykonać, gdy odkryło, iż brak dla niego miejsca na ekranie. Znów:

CONT

wyczyści ekran i program będzie kontynuowany - tym razem CONT oznacza GOTO 30.

Zauważ, iż ekran jest wymazywany nie z powodu tego, że jest to polecenie CONT, lecz ponieważ jest ono rozkazem. Wszystkie rozkazy (z wyjątkiem COPY, który pojawia się w rozdziale 20) czyszczą najpierw ekran.

Gdy się znudzisz, zatrzymaj program wykorzystując STOP i przywołaj listing naciskając NEWLINE.

Spójrz na polecenie PRINT w wierszu 30. Przy każdym wydruku para liczb A i SQR A pojawia się w nowym wierszu, a dzieje się tak dlatego, iż polecenie PRINT nie kończy się przecinkiem ani średnikiem. Zawsze w takim przypadku następne polecenie PRINT rozpoczyna wydruk od nowego wiersza (zatem w celu wstawienia pustego wiersza użyj polecenia PRINT, w którym nie ma nic do wydrukowania - po prostu samo PRINT).

Jednakże polecenie PRINT może kończyć się przecinkiem lub średnikiem, a wtedy następne polecenie PRINT będzie wykonywało wydruk tak, jakby te dwa polecenia były jednym długim poleceniem.

Dla przykładu z przecinkami zastąp wiersz 30 przez:

30 PRINT A,

i uruchom program, aby zobaczyć jak kolejne polecenia PRINT mogą tworzyć wydruk w tym samym wierszu, lecz rozdzielony na dwie kolumny.

Z drugiej strony średniki:

30 PRINT A;

upchają wszystko razem.

Wypróbuj również:

30 PRINT A

Teraz wpisz poniższe dodatkowe wiersze:

100 REM TEN PROGRAM MIERZY LANCUCHY TEKSTOWE
110 INPUT A$
120 PRINT A$,LEN A$
130 GOTO 110

Jest to oddzielny program w stosunku do poprzedniego, lecz możesz je mieć w komputerze oba naraz w tym samym czasie. Aby uruchomić ten nowy, wpisz:

RUN 100

Ten program wczytuje łańcuch tekstowy zamiast liczby, wyświetla go oraz jego długość. Wpisz:

KOT     (i jak zwykle NEWLINE)

Ponieważ komputer oczekuje łańcucha, wyświetla dwa cudzysłowy - w celu przypomnienia ci o tym, co również zaoszczędza ci nieco wpisywania. Lecz nie musisz się ograniczać do stałych łańcuchowych (łańcuchów z otwierającym i zamykającym cudzysłowem, które obejmują znaki wewnątrz stałej); komputer wyliczy dowolne wyrażenie łańcuchowe, również takie, które zawiera zmienne łańcuchowe. W takim przypadku musisz wymazać cudzysłowy, które wyświetlił komputer. Wypróbuj tego. Wymaż je (klawisz  a następnie RUBOUT dwa razy) i wpisz:

A$

Ponieważ A$ wciąż zawiera wartość "KOT", to odpowiedzią znów będzie KOT 3.

Teraz wprowadź ponownie

A$

lecz tym razem nie usuwaj cudzysłowów. Zmienna A$ ma wartość "A$", a odpowiedź brzmi 2.

Jeśli zechcesz zastosować STOP przy wprowadzaniu łańcuchów, to najpierw musisz przesunąć kursor w tył na początek wiersza za pomocą .

Teraz popatrz wstecz na RUN 100, które użyliśmy wcześniej. Skacze ono do wiersza 100, zatem nie moglibyśmy zamiast tego zastosować GOTO 100? W tym akurat przypadku odpowiedź brzmi - tak, lecz istnieje różnica. RUN 100 najpierw wymazuje zmienne (jak CLEAR w rozdziale 6), a po tym działa jak GOTO 100. Samo GOTO 100 nie wyczyściłoby niczego. Mogą zaistnieć okoliczności, w których chcesz uruchomić program bez usuwania zmiennych. Wtedy GOTO jest niezbędne a RUN mogłoby spowodować katastrofę, jednakże najlepiej wyrobić sobie nawyk uruchamiania programów poleceniem RUN.

Następną różnicą jest to, iż RUN nie musi posiadać numeru wiersza - wtedy program startuje od pierwszego wiersza. GOTO zawsze musi towarzyszyć numer wiersza.

Oba te programy zatrzymały się, ponieważ wpisałeś STOP w wierszu INPUT, lecz czasami - pomyłkowo - piszesz program, którego nie możesz w ten sposób zatrzymać, a on sam z siebie nie zatrzymuje się. Wpisz:

200 GOTO 200

RUN 200

Wygląda to tak, jakby miało się wykonywać wiecznie, chyba że wyciągniesz wtyczkę zasilania; lecz istnieje mniej drastyczne lekarstwo. Naciśnij klawisz SPACE, który ma u góry napis "BREAK" (PRZERWA). Program się zatrzyma z komunikatem D/200.

Na końcu każdego wiersza programu komputer sprawdza, czy nie jest wciśnięty ten klawisz, a jeśli jest, to zatrzymuje wykonanie. Klawisz BREAK może być również wykorzystywany w trakcie pracy z magnetofonem lub z drukarką.

Dotychczas zapoznałeś się z poleceniami PRINT, LET, INPUT, RUN, LIST, GOTO, CONT, CLEAR, NEW i REM, a większość z nich można użyć albo jako rozkazów, albo jako wierszy programu - obowiązuje to prawie dla wszystkich poleceń w języku BASIC. Jedynym rzeczywistym wyjątkiem jest INPUT, którego nie można użyć w charakterze rozkazu (jeśli spróbujesz, otrzymasz komunikat 8; powodem jest to, iż wewnątrz komputera ten sam obszar jest wykorzystywany na zarówno dla wprowadzanych danych jak i dla rozkazów, co dla rozkazu INPUT wprowadziłoby niezły bałagan). RUN, LIST, CONT, CLEAR i NEW w programach mają raczej zwykle mizerne zastosowanie, co nie oznacza, iż nie można ich tam używać.

 

Podsumowanie

Polecenia: GOTO, CONT, INPUT, NEW, REM, PRINT

STOP w danych wejściowych

BREAK

 

Ćwiczenia

  1. W programie pierwiastka kwadratowego spróbuj zamienić wiersz 40 przez GOTO 5, GOTO 10 lub GOTO 15 - nie powinno to powodować zauważalnej różnicy w uruchomionym programie. Jeśli numer wiersza w poleceniu GOTO odwołuje się do nieistniejącego wiersza, to skok zostanie wykonany do pierwszego wiersza za tym numerem. To samo dotyczy RUN; w rzeczywistości samo RUN  znaczy właściwie RUN 0.

 

 

  1. Uruchom program obliczający długość łańcucha tekstowego, a gdy zapyta o dane wejściowe, wpisz:

X$      (po usunięciu cudzysłowów)

Oczywiście X$ jest niezdefiniowaną zmienną i otrzymasz komunikat 2/110.

Jeśli teraz wpiszesz:

LET X$="COSIK ZDEFINIOWANEGO"

(co samo z siebie da komunikat 0/0) a następnie wpiszesz:

CONT

odkryjesz, iż możesz bez problemu użyć X$ jako danych wejściowych. Ignoruje ono komunikat 0/0. ponieważ zawierał kod 0, a bierze numer wiersza z poprzedniego komunikatu 2/110. To naprawdę jest użyteczne. Jeśli program zatrzyma się z powodu jakiegoś błędu, to możesz wykonać wiele różnych rzeczy, aby błąd usunąć, a następnie zastosować CONT do kontynuowania pracy programu.

 

 

  1. Wypróbuj ten program:

10 INPUT A$
20 PRINT A$;" = ";VAL A$
30 GOTO 10

(zobacz na ćwiczenie 1 z rozdziału 7)

Wstaw dodatkowe polecenia PRINT, aby komputer zapowiadał, co ma zamiar zrobić, i aby prosił o łańcuch tekstowy z nadzwyczajną uprzejmością.

 

 

  1. Napisz program wczytujący ceny i wypisujący od nich podatek VAT (przy stawce 22%). Znów wstaw polecenia PRINT, aby komputer wypisywał, co ma zamiar zrobić. Zmodyfikuj program tak, abyś mógł również wprowadzać stawkę podatku VAT (np. dla zerowego podatku lub przyszłych budżetów).

 

 

  1. Napisz program wyliczający bieżącą sumę wprowadzanych liczb (sugestia: utwórz dwie zmienne: TOTAL - ustawioną na 0 na początku programu - oraz ITEM. Wprowadzaj ITEM i dodawaj ją do TOTAL, drukuj obie i powtarzaj).

 

 

  1. Automatyczne listingi (te nie będące wynikiem polecenia LIST) mogą z powodzeniem wprawić cię w zakłopotanie. Jeśli wpiszesz program z 50 wierszami, wszystkie z poleceniami REM,

1 REM
2 REM
3 REM
:  :
:  :
49 REM
50 REM

to będziesz mógł sobie poeksperymentować.

Pierwszą rzeczą do zapamiętania jest to, iż bieżący wiersz (z kursorem  > ) zawsze pojawi się na ekranie, najczęściej w pobliżu jego środka.

Wpisz:

LIST    (i oczywiście NEWLINE)

a następnie jeszcze raz naciśnij NEWLINE. Na ekranie powinieneś otrzymać wiersze od 1 do 22. Teraz wpisz:

23 REM

a na ekranie pojawią się wiersze od 2 do 23; wpisz:

28 REM

otrzymasz wiersze od 27 do 48 (w obu przypadkach wprowadzają nowy wiersz przesunąłeś kursor programu tak, iż stało się konieczne utworzenie nowego listingu).

Czy nie wydaje ci się to nieco samowolne? W rzeczywistości komputer stara się dać ci dokładnie to, czego chcesz, chociaż trudno mu zawsze poprawnie zgadnąć, skoro ludzie są istotami nieprzewidywalnymi matematycznie.

Komputer zapamiętuje nie tylko bieżący wiersz mający się pojawić na ekranie, lecz również górny wiersz na ekranie. Przy tworzeniu listingu najpierw porównuje górny wiersz z bieżącym.

Jeśli górny wiersz występuje po bieżącym, to nie ma sensu rozpoczynać od niego listingu, zatem użyje bieżącego wiersza jako nowego górnego i od niego rozpocznie listing.

W przeciwnym razie próbuje zrobić listing rozpoczynający się od górnego wiersza. Jeśli bieżący wiersz trafi na ekran, to wszystko jest w porządku; jeśli bieżący wiersz jest tuż pod spodem ekranu, to przesuwa górny wiersz w dół na następny wiersz programu i próbuje jeszcze raz; a jeśli bieżący wiersz jest daleko od spodu ekranu, to zmienia górny wiersz na wiersz bezpośrednio poprzedzający wiersz bieżący.

Poeksperymentuj przesuwanie bieżącego wiersza wpisując:

numer wiersza REM

LIST przesuwa wiersz z kursorem, lecz nie górny wiersz, zatem kolejne listingi mogą być różne. Na przykład wpisz:

LIST

aby otrzymać listing z polecenia LIST i następnie wciśnij ponownie NEWLINE, aby wiersz 0 stał się górnym wierszem. Powinieneś otrzymać na ekranie wiersze od 1 do 22. Wpisz:

LIST 22

co da ci wiersze od 22 do 43; gdy znów naciśniesz NEWLINE, powrócisz do wierszy od 1 do 22. Wydaje się, iż ten mechanizm jest bardziej użyteczny dla krótkich niż dla długich programów.

 

 

  1. Co robiłyby polecenia CONT, CLEAR i NEW w programie? Czy możesz sobie wymyślić jakiekolwiek dla nich zastosowanie?

 

 


   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2018 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe