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

 

 


   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