INSTRUKCJA WARUNKOWA


Niestety, nie zawsze da się skonstruować programu w prosty sposób - instrukcja po instrukcji, jak w dotychczasowych programach. Mogą one być bardziej złożone. Na przykład: Jeśli współrzędna X będzie większa niż 100 to zmień kolor rysowania na niebieski albo jeśli współrzędna X jest mniejsza od 100 dodaj do zmiennej X 1(jeden) w przeciwnym wypadku wyzeruj zmienną X. Polecenia te mają swoje odpowiedniki w Pascalu.

IF warunek THEN instrukcja

IF  x < 640  THEN  x:=x+1;

Jeśli warunek jest prawdziwy, to wykonaj instrukcję

IF  warunek  THEN  instrukcja1 ELSE  instrukcja2

IF  x < 640  THEN  x:=x+1  ELSE x:=0;

Jeśli warunek jest prawdziwy, to wykonaj instrukcję pierwszą, w przeciwnym wypadku - wykonaj instrukcję drugą (gdy warunek jest fałszywy). W pierwszym przypadku ignorowana jest instrukcja druga (warunek prawdziwy), w drugim - ignorowana instrukcja pierwsza (warunek fałszywy).

Instrukcja wyboru

Jeśli chcemy sprawdzić po kolei kilka warunków i wybrać z nich jeden właściwy można posługiwać się kilkoma instrukcjami warunkowymi w prostym lub złożonym układzie, wygodniej jest jednak użyć instrukcji złożonej

CASE zmienna OF
        wartość1: instrukcja;
        wartość2: instrukcja;
        ...
        ELSE instrukcja
    END;

Porównujemy zmienną z kolejnymi wartościami. Jeśli jest taka sama, to wykonywana jest instrukcja przy tej wartości. Można w instrukcji CASE dołożyć część z ELSE - gdyby żadna z wartości nie była równa zmiennej, wykonana zostałaby instrukcja po słowie ELSE.

CASE rodzaj OF
  1:line(100,100,300,100);
  2:line(100,100,100,300);
  3:line(100,100,300,300);
  4:line(100,300,300,100);
  5:line(100,100,100,100);
  else line(100,200,300,400);
END;

Operatory relacji i logiczne

Podczas operacji logicznych porównujemy ze sobą dwie wartości (tego samego typu). Mogą to być np. liczby albo też informacje zawarte w zmiennych. Warunki logiczne przyjmują zawsze jedną z dwóch wartości PRAWDA lub FAŁSZ. Podczas operacji arytmetycznych posługujemy się operatorami dodawania, odejmowania itd., tak i podczas operacji logicznych mamy operatory relacji.

2=2    prawda                                 2<3   prawda                                  2<=3  prawda

2<>2  fałsz                                      2>3   fałsz                                       2>=2  prawda

Pojedyncze wyrażenia logiczne można łączyć za pomocą operatorów logicznych:

NOT - negacja (jeśli a=b jest prawdziwe to NOT(a=b) jest fałszywe)
IF NOT(x<0) THEN  x:=x-1;

OR - suma logiczna (wyrażenie (a=b) OR (c=d) będzie prawdziwe, jeśli przynajmniej jedno z wyrażeń składowych będzie prawdziwe)
IF (x>0) OR (x<640) THEN  x:=x+1;

AND - iloczyn logiczny (wyrażenie (a=b) OR (c=d) będzie prawdziwe, jeśli będą prawdziwe oba wyrażenia składowe).
IF (y=0) AND (x<640) THEN  y:=480;

 

Typy stałych i zmiennych (proste)

Typy liczbowe całkowite

BYTE - liczby całkowite 0..255 (1 bajt)

INTEGER - liczby całkowite -32768..32767 (2 bajty)

LONGINT- liczby całkowite +- ~2 mld (4 bajty)

Typ liczbowy rzeczywisty (6 bajtów)

REAL - dowolne liczby rzeczywiste przedstawione jako ułamek dziesiętny (5.347) lub w postaci wykładniczej (1.2E+3   czyli 1.2*103 czyli 1200)

Typ napisowy (tyle bajtów ile znaków w tekście)

STRING - teksty do 255 znaków w apostrofach, np. ‘Ala ma kota’, ‘a’, ‘’ - pusty

Typ znakowy (1 bajt)

CHAR - pojedyncze znaki ujęte w apostrofy, np.: ‘a’, ‘A’, ‘1’ (to nie to samo co 1)

Typ logiczny (1 bajt)

        BOOLEAN - zmienne przyjmują wartość prawdy TRUE (1) lub fałszu FALSE (0)

 


GRAF13.PAS - kwadrat odbija się od ścian pionowych

program grafika13;
uses crt,graph;
var
  d,m:integer;
  dx,x,y,b,k:integer;

procedure Kwadrat(x,y,bok,kolor:integer);
begin
  SetColor(kolor);
  MoveTo(x,y);
  LineRel(0,bok);
  LineRel(bok,0);
  LineRel(0,-bok);
  LineRel(-bok,0);
end;

begin
  d:=detect;
  initgraph(d,m,'');
  readln;
  x:=1;
  y:=100;
  b:=60;
  k:=12;
  dx:=1;		{o ile zmienia się współrzędna X}

  repeat
    Kwadrat(x,y,b,k);
    delay(5);
    Kwadrat(x,y,b,0);
{nowe położenie kwadratu zależy od zmiennej DX}
    x:=x+dx;
{jeśli kwadrat dotrze do prawego brzegu zmieniamy kierunek ruchu}
    if x > (640-b) then dx:=-dx;	
{jeśli kwadrat dotrze do lewego brzegu zmieniamy kierunek ruchu}
    if x < 0 then dx:=-dx;
  until keypressed;

  readln;
  repeat
    Kwadrat(x,y,b,k);
    delay(5);
    Kwadrat(x,y,b,0);
    x:=x+dx;
{jednocześnie sprawdzamy warunek dotarcia do prawego i lewego brzegu}
    if (x > (640-b)) or (x < 0) then dx:=-dx;
  until keypressed;
  closegraph;
end.

 

To samo zadanie można zrealizować stosując operatory logiczne. Jednocześnie sprawdzamy odbicia od prawego i lewego brzegu, od dolnego i górnego brzegu

repeat
  Kwadrat(x,y,bok,kolor);
  delay(5);
  Kwadrat(x,y,bok,0);
  x:=x+dx;
  y:=y+dy;
  if (x > (640-bok)) or (x < 0) then dx:=-dx;
  if (y > (480-bok)) or (y < 0) then dy:=-dy;
until keypressed;

Ćwiczenia

Zmień program grafika14 w ten sposób, aby kwadrat poruszał się nie po całym ekranie, ale w prostokącie, którego lewy górny róg znajduje się w punkcie 100,100 a prawy dolny w punkcie 500,400.

Zmień program grafika14 tak, aby po każdym odbiciu od ściany kwadrat zmieniał kolor na inny, może być losowo wybrany.

Zmień program tak, aby po ekranie poruszał się prostokąt, trójkąt, twoje inicjały.