Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Autor: Steven Vickers
Tłumaczył: mgr Jerzy Wałaszek

©2021 mgr Jerzy Wałaszek
I LO w Tarnowie

ROZDZIAŁ 10 – Jeśli ...

Rozkazy: IF, STOP
Operacje: =, <, >, <=, >=, <>, AND, OR
Funkcja: NOT

SPIS TREŚCI
ROZDZIAŁ 1 Przygotowanie ZX81
ROZDZIAŁ 2 Wydawanie komputerowi poleceń
ROZDZIAŁ 3 Lekcja historii
ROZDZIAŁ 4 Sinclair ZX81 jako kalkulator kieszonkowy
ROZDZIAŁ 5 Funkcje
ROZDZIAŁ 6 Zmienne
ROZDZIAŁ 7 Łańcuchy tekstowe
ROZDZIAŁ 8 Programowanie komputera
ROZDZIAŁ 9 Dalsze programowanie komputera
ROZDZIAŁ 10 Jeśli ...
ROZDZIAŁ 11 Zestaw znaków
ROZDZIAŁ 12 Pętle
ROZDZIAŁ 13 Wolno i Szybko
ROZDZIAŁ 14 Podprogramy
ROZDZIAŁ 15 Uruchamianie programów
ROZDZIAŁ 16 Pamięć taśmowa
ROZDZIAŁ 17 Wyświetlanie z bajerami
ROZDZIAŁ 18 Grafika
ROZDZIAŁ 19 Czas i ruch
ROZDZIAŁ 20 Drukarka dla ZX81
ROZDZIAŁ 21 Podłańcuchy
ROZDZIAŁ 22 Tablice
ROZDZIAŁ 23 Gdy zaczyna brakować pamięci
ROZDZIAŁ 24 Liczenie na palcach
ROZDZIAŁ 25 Jak pracuje komputer
ROZDZIAŁ 26 Stosowanie kodu maszynowego
ROZDZIAŁ 27 Organizacja pamięci
ROZDZIAŁ 28 Zmienne systemowe
DODATKI
A Zestaw znaków
B Numery komunikatów
C ZX81 dla znających język BASIC

ROZDZIAŁ 10 – Jeśli ...

Wszystkie dotychczasowe programy były dosyć przewidywalne - przechodziły po kolei przez wszystkie instrukcje, a na końcu co najwyżej wykonywały skok na początek. Nie jest to wcale takie użyteczne. W praktyce od komputera oczekuje się podejmowania decyzji i działania odpowiednio do sytuacji; dokonuje on tego przy pomocy polecenia IF.

Wymaż komputer (używając NEW) i wpisz oraz uruchom ten strasznie zabawny, mały program (nie tłumaczę go ze względu na skojarzenia słowne w języku angielskim):

  10 PRINT "SHALL I TELL YOU A JOKE?"
  20 INPUT A$
  30 IF A$="GET LOST" THEN GOTO 200  
  40 PRINT "HOW MANY LEGS HAS A HORSE GOT?"
  50 INPUT LEGS
  60 IF LEGS=6 THEN GOTO 100
  70 PRINT "NO, 6, FORE LEGS IN FRONT","AND TWO BEHIND." 
  80 STOP
100 PRINT "YES",,"SHALL I TELL YOU IT AGAIN?"
110 GOTO 20
200 PRINT "ALL RIGHT, THEN, I WONT."  
(CHCESZ USŁYSZEĆ KAWAŁ?)

(SPADAJ)
(ILE NÓG MA KOŃ?)


(NIE, 6, PRZEDNIE (FORE brzmi jak four, czyli 4) NOGI Z PRZODU I DWIE Z TYŁU)

(TAK, CZY OPOWIEDZIEĆ CI GO JESZCZE RAZ?)

(DOBRA, W TAKIM RAZIE NIE OPOWIEM)

Zanim omówimy polecenie IF, najpierw spójrz na polecenie STOP w wierszu 80; powoduje ono zatrzymanie programu dając komunikat 9.

Jak widzisz, polecenie IF przybiera postać:

IF warunek THEN polecenie

Tutaj poleceniami są GOTO, lecz mogą być dowolne inne, nawet następne polecenia IF. Warunek jest czymś, co powinno być wyliczone dając w wyniku prawdę lub fałsz; jeśli okaże się, że dostaniemy prawdę, to polecenie umieszczone za THEN zostanie wykonane, lecz w przeciwnym razie komputer je pominie.

Najbardziej użyteczne warunki porównują dwie liczby lub dwa łańcuchy tekstowe; mogą one sprawdzić, czy dwie liczby są równe albo czy jedna jest większa od drugiej, albo mogą sprawdzić, czy dwa łańcuchy tekstowe są takie same lub czy jeden z nich jest wcześniej w porządku alfabetycznym. Używają przy tym relacji  =, <, >, <=, >= i <>.

Relację = zastosowaliśmy dwukrotnie w programie (raz dla liczb i raz dla łańcuchów) i oznacza ona "równa się". Nie jest to tym samym, co = w poleceniu LET.

< oznacza "jest mniejsze niż", zatem relacje

 1<2    -2<-1  i  -3<1

są wszystkie prawdziwe, lecz

1<0   i   0<-2

są fałszywe.

Aby zrozumieć, jak to działa, napiszmy program wczytujący liczby i wyświetlający największą dotąd wczytaną liczbę:

10 PRINT "LICZBA","JAK DOTAD NAJWIEKSZA"
20 INPUT A
30 LET NAJWIEKSZA=A
40 PRINT A,NAJWIEKSZA
50 INPUT A
60 IF NAJWIEKSZA<A THEN LET NAJWIEKSZA=A
70 GOTO 40

Najważniejszą częścią programu jest wiersz 60, który uaktualnia NAJWIEKSZA, jeśli jej poprzednia wartość była mniejsza od nowo wprowadzonej liczby A.

> (M z SHIFT) oznacza "jest większe niż" i działa tak jak <, lecz z drugiej strony. Możesz łatwo je rozróżnić, ponieważ ostry czubek wskazuje w kierunku liczby mniejszej.

<= (R z SHIFT - nie wpisuj tego jako < z następującym =) oznacza "jest mniejsze lub równe", zatem jest prawie takie samo jak <, z tym wyjątkiem, iż daje prawdę również wtedy, gdy obie liczby są równe:
2<=2 - prawda, lecz 2<2 - fałsz.

>= (Y z SHIFT) oznacza "jest większe lub równe" i jest podobne do >.

<> (T z SHIFT) oznacza "jest różne od"' i ma odwrotne znaczenie do =.

Wszystkie z tych czterech operacji porównań posiadają priorytet 5.

Matematycy często zapisują <=, >= oraz <> jako ≤, ≥ i ≠. Piszą również takie rzeczy jak "2<3<4" do zaznaczenia, iż "2<3" i "3<4", lecz tego w języku BASIC robić nie można.

Porównania te można połączyć wykorzystując operacje logiczne AND, OR i NOT (I, LUB oraz NIE).

jedno porównanie AND drugie porównanie

jest prawdziwe, jeśli oba porównania są prawdziwe - w przeciwnym wypadku wynikiem jest fałsz.

jedno porównanie  OR drugie porównanie

jest prawdziwe, jeśli jedno z porównań jest prawdziwe (albo oba).

NOT porównanie

jest prawdziwe, jeśli porównanie jest fałszywe i na odwrót.

Wyrażenia logiczne mogą być tworzone z porównań oraz z AND, OR i NOT tak jak wyrażenia liczbowe tworzone są z liczb i +, - itd.; Jeśli konieczne, możesz nawet umieszczać w nich nawiasy. NOT posiada priorytet 4, AND 3 a OR 2.

Ponieważ (w przeciwieństwie do innych funkcji) NOT posiada względnie niski priorytet, to argument nie potrzebuje nawiasów o ile nie zawiera AND lub OR; zatem NOT A = B oznacza NOT (A = B) (co jest takie samo jak A <> B).

W celu zilustrowania tego, wymaż komputer i wypróbuj ten program:

10 INPUT F$
20 INPUT WIEK
30 IF F$="X" AND AGE<18 OR F$="AA" AND WIEK<14 THEN PRINT "NIE ";
40 PRINT "WPUSZCZAC."
50 GOTO 10

Tutaj F$ użyte zostało w charakterze znacznika kategorii filmu (oznaczenia brytyjskie - przyp. tłum.), gdzie X oznacza film od lat 18, AA od 14, natomiast A lub U bez ograniczeń wieku, natomiast program wylicza, czy osoba w danym wieku może obejrzeć film.

W końcu możemy porównywać nie tylko liczby, lecz również łańcuchy tekstowe. Widzieliśmy "=" używane w F$="X", a użyć można nawet pozostałych 5 relacji, < itd.

Zatem co "jest mniejsze od" oznacza dla łańcuchów? Jednej rzeczy na pewno nie znaczy - "jest krótsze od", zatem nie rób tego błędu. Stwórzmy definicję: jeden łańcuch jest mniejszy od drugiego, jeśli pojawia się wcześniej w kolejności alfabetycznej; i tak:

"SMITH" < "SMYTHE"
"SMYTHE" > "SMITH"
"BLOGGS" < "BLOGGS-BLACKBERRY"
"BILLION" < "MILLION"
"TCHAIKOVSKY" < "WAGNER"
"DOLLAR" < "POUND"

wszystkie relacje są spełnione. <= oznacza "jest mniejsze lub równe" itd. tak samo jak dla liczb.

Uwaga: W niektórych wersjach języka BASIC - lecz nie w ZX81 - polecenie IF może przybrać postać:

IF warunek THEN numer wiersza

To jest dokładnie to samo, co

IF warunek THEN GOTO numer wiersza

Podsumowanie

Polecenia: IF, STOP

Operacje:  =, <, >, <=, >=, <>, AND, OR

Funkcja:  NOT

Ćwiczenia

  1. <> i = są przeciwne w sensie, iż NOT A=B jest tym samym co A<>B

    oraz

    NOT
    A<>B jest tym samym co A=B

    Przekonaj sam siebie, iż >= jest przeciwne do <, a <= jest przeciwne do >, zatem zawsze możesz pozbyć się formy NOT z przodu porównania poprzez zmianę na przeciwną relację.

    Również:

    NOT
    (pierwsze wyrażenie logiczne AND drugie)

    oznacza to samo co:

    NOT
    (pierwsze) OR NOT (drugie),

    oraz

    NOT
    (pierwsze wyrażenie logiczne OR drugie)

    jest tym samym co:

    NOT
    (pierwsze) AND NOT (drugie) (są to tzw. prawa DeMorgana - przyp. tłum.).

    Wykorzystując te własności możesz wyprowadzać funkcje NOT przed nawiasy dotąd, aż będą stosowane tylko do porównań, a wtedy pozbędziesz się ich wszystkich. Stąd, mówiąc w języku logiki, NOT jest zbędne. Jednakże użycie NOT często czyni program bardziej przejrzystym.
  1. Język BASIC może czasami iść według innych zdań niż wynika to z języka angielskiego (pamiętaj, iż jest to tylko tłumaczenie, a nie tekst oryginalnie polski - przyp. tłum.). Na przykład rozważmy zdanie angielskie 'if A doesn't equal B or C' (jeśli A nie jest równe C lub B). Jak zapiszesz to w języku BASIC? Odpowiedź brzmi:

    ani tak "IF A<>B OR C",

    ani tak "IF A<>B OR A<>C",

    tylko tak "IF A<>B AND A<>C" - A musi jednocześnie różnić się zarówno od B jak i od C.

    Nie przejmuj się, jeśli nie zrozumiesz ćwiczeń 3, 4 i 5. Poruszane w nich zagadnienia są raczej wyrafinowane.
  1. (Dla ekspertów)

    Wypróbuj:

    PRINT
    1=2,1<>2

    co możesz się spodziewać, iż da błąd składniowy. W rzeczywistości, jeśli chodzi o komputery, nie istnieje taka rzecz jak wartość logiczna.

    (i) =, <, >, <=, >= oraz <> są binarnymi operacjami o priorytecie 5, dającymi wynik liczbowy. Wynikiem jest wartość 1 (dla prawdy), jeśli dana relacja jest spełniona, oraz 0 (dla fałszu), jeśli nie jest spełniona.

    (ii) W instrukcji

    IF
    warunek THEN polecenie

    warunek może być dowolnym wyrażeniem liczbowym. Jeśli jego wartość wyniesie 0, to zostanie potraktowane jako fałszywe, a każda inna wartość zostanie potraktowana jako prawda. W ten sposób to polecenie IF oznacza dokładnie to samo co:

    IF
    warunek <>0 THEN polecenie

    (iii) AND, OR i NOT są również wyrażeniami obliczanymi liczbowo. 
    X AND Y posiada wartość { X jeśli Y jest niezerowe (traktowane jako prawda)
    { 0 jeśli Y jest zerowe (traktowane jako fałsz)
    X OR Y posiada wartość { 1 jeśli Y jest niezerowe
    { X jeśli Y jest zerowe
    NOT X posiada wartość { 0 jeśli X jest niezerowe
    { 1 jeśli X jest zerowe
    Przeczytaj ten rozdział ponownie z tym oświeceniem, upewniając się, iż wszystko rozumiesz.

    W wyrażeniach X AND Y, X OR Y oraz NOT X, X i Y zwykle przyjmują wartość 0 lub 1 dla fałszu lub prawdy. Przelicz wszystkie dziesięć różnych kombinacji tych operacji i sprawdź, czy otrzymany wynik jest zgodny z twoimi oczekiwaniami co do wyników AND, OR i NOT.
  1. Wypróbuj ten program:

    10 INPUT A
    20 INPUT B
    30 PRINT (A AND A>=B)+(B AND A<B)
    40 GOTO 10

    Za każdym razem wypisuje on większą z dwóch liczb A i B - dlaczego?

    Przekonaj sam siebie, iż potrafisz myśleć o wyrażeniu

    X AND Y

    jako o

    "X jeśli Y (w przeciwnym razie wynikiem jest 0)"'

    a o

    X OR Y

    jako o

    "X o ile nie Y (gdzie w tym przypadku wynikiem jest 1)"

    Wyrażenie wykorzystujące w taki sposób operacje AND i OR zwane jest wyrażeniem warunkowym. Przykład z użyciem OR może być taki:

    LET
    RETAIL PRICE=PRICE LESS VAT*(1.15 OR V$="ZERO RATED")

    Zwróć uwagę, iż operacja AND pasuje do dodawania (ponieważ jej standardowa wartość wynosi 0), a OR pasuje do mnożenia (ponieważ jej standardowa wartość wynosi 1).
  1. Można również otrzymywać tekstowe wyrażenia warunkowe, jednakże tylko z użyciem AND.
    X$ AND Y$ posiada wartość { X$ jeśli Y jest niezerowe
    { "" jeśli Y jest zerowe
    zatem oznacza ono "X$ jeśli Y (w przeciwnym razie pusty łańcuch)"

    Wypróbuj ten program, który odczytuje dwa łańcuchy i wyświetla je w kolejności alfabetycznej:

    10 INPUT A$
    20 INPUT B$
    30 IF A$<=B$ THEN GOTO 70
    40 LET C$=A$
    50 LET A$=B$
    60 LET B$=C$
    70 PRINT A$;" ";("<" AND A$<B$)+("=" AND A$=B$);" ";B$
    80 GOTO 10
  1. Wypróbuj ten program:

    10 PRINT "X"
    20 STOP
    30 PRINT "Y"

    Gdy go uruchomisz, wyświetli on "X" i zatrzyma się z komunikatem 9/20. Teraz wpisz:

    CONT

    Mógłbyś oczekiwać, iż zadziała to tak samo jak "GOTO 20", więc komputer po prostu zatrzyma się ponownie bez wyświetlenia "Y", lecz takie zachowanie nie byłoby zbyt użyteczne, zatem zaprojektowano to dla komunikatów o kodzie 9 (wykonane polecenie STOP) tak, iż numer wiersza jest zwiększany o 1 dla polecenia CONT. Dlatego w naszym przykładzie CONT zachowuje się jak GOTO 21 (które z kolei z powodu braku wiersza 21 zachowa się jak "GOTO 30").
  1. Wiele wersji języka BASIC (lecz nie ZX81 BASIC) posiada polecenie ON, które przyjmuje postać:

    ON
    wyrażenie liczbowe GOTO numer wiersza, numer wiersza, ..., numer wiersza

    Wartość wyrażenia jest wyliczana i w zależności od jego wyniku następuje skok do wiersza o odpowiednim numerze. Jeśli wyrażenie przyjmuje wartość n, to powyższa konstrukcja ma ten sam efekt co:

    GOTO n-ty numer wiersza

    Na przykład:

    ON
    A GOTO 100, 200, 300, 400, 500

    Tutaj, jeśli A ma wartość 2, to zostanie wykonane polecenie "GOTO 200". W języku ZX81 BASIC można to zastąpić przez:

    GOTO
    100*A

    W przypadku gdyby numery wierszy nie występowały zgrabnie co 100, zastanów się nad zastępczym użyciem konstrukcji:

    GOTO
    wyrażenie warunkowe
Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2021 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

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

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.