Dr inż. Robert Wójcik
E-mail: wojcik@ict.pwr.wroc.pl
Języki i metody programowania
4. Podstawowe instrukcje
4.1. Klasyfikacja instrukcji
4.2. Instrukcja warunkowa z pojedynczym wyborem if then 4.3. Instrukcja warunkowa z wielokrotnym wyborem if then else 4.4. Instrukcja wyboru case of
4. Podstawowe instrukcje
4.1. Klasyfikacja instrukcji
Program komputerowy określa sposób wykonania pewnych czynności na ustalonym zbiorze danych. Operacje realizowane w programie są opisane za pomocą instrukcji języka programowania.
Instrukcje dzielą się na:
proste (realizują pojedyncze operacje);
strukturalne (realizują kilka operacji).
Każda instrukcja kończy się średnikiem. Wyjątek stanowi instrukcja bezpośrednio poprzedzająca end.
Instrukcje proste:
przypisania ( := ),
skoku ( goto ),
pusta ( ; ),
wywołania procedury,
inline.
Instrukcje strukturalne:
złożona ( begin .. end; ),
warunkowa ( if, if-else ),
iteracyjna ( for, while, repeat ),
wiążąca ( with ),
asemblerowa ( asm ).
Instrukcja przypisania
Realizuje podstawienie postaci:
nazwa_zmiennej := wyrażenie;
Pod zmienną określoną z lewej strony podstawiana jest wartość wyrażenia znajdującego się z prawej strony.
Np. x:=5; x:=y+4; x:= 2+sin(y)/3;
Zmienna i wyrażenie powinny być zgodnych typów. Jeśli nie są to kompilator stara się dokonać konwersji typu wyrażenia z prawej strony do typu zmiennej znajdującej się z lewej strony. W przypadku, gdy nie jest to możliwe generowany jest błąd kompilacji.
W instrukcji przypisania można dokonać rzutowania typów dla typów całkowitych.
type
tdni = (pon, wt, sr, czw, pt, sob, ndz);
Var dzien: tdni;
k: integer;
z: longint;
begin
k:= 6; dzien:= tdni(k);
dzien:= tdni(6);
{ podstawienie dzien:=tdni(11); błąd zakresu, gdyż ndz = 6 } z:= 60000;
k:= z; { kompilator dokona konwersji z obcięciem } k:= integer(z);
end.
Nie jest możliwa konwersja w przypadku:
Var w: longint;
w:= longint(17.4); { błąd kompilatora }
Instrukcja skoku
label A1, A2;
begin
instrukcje; goto A1;
instrukcje; goto A2;
A1: writeln(’Wykryto wartość dodatnią’);
A2: writeln(’Wykryto wartość ujemną’);
end.
Instrukcja inline
Umożliwia wstawianie kodu maszynowego do programu.
Procedura wpisująca ile elementów o wartości dana do pamięci o adresie cel.
Procedure Wpisz_dane(var cel; ile: word; dana: word);
Begin
inline(
$C4/$7E/cel/ (* LES DI, cel[BP] *)
$8B/$4E/ile/ (* MOV CX, ile[BP] *)
$8B/$46/dana/ (* MOV AX, dana[BP] *)
$FC/ (* CLD *)
$F3/$AB); (* REP STOSW *)
End;
Instrukcja złożona
Realizuje sekwencyjnie kilka wewnętrznych instrukcji prostych zawartych pomiędzy begin oraz end. Instrukcja złożona tworzy z ciągu instrukcji jedną instrukcję określoną przez nawiasy logiczne begin i end.
begin
b:= 2;
n:= n + 1;
j:= n + b;
end;
4.2. Instrukcja warunkowa z pojedynczym wyborem if then
Umożliwia podjęcie decyzji w przypadku, gdy jest spełniony określony warunek. Jest ona często nazywana instrukcją rozgałęzienia ponieważ
w wyniku jej wykonania program podejmuje decyzję, którą z dwóch ścieżek należy wybrać.
if wyrażenie_logiczne then instrukcja;
Jeśli wyrażenie_logiczne jest prawdziwe (wartość TRUE), to wykonywana jest instrukcja.
Np. Jeśli x>=0, to zwiększ licznik.
if x>=0 then licznik:= licznik+1;
lub
if (x>=0) then licznik:= licznik+1;
W przypadku, gdy wyrażenie_logiczne składa się z kilku członów połączonych operatorami logicznymi (np. and, or) poszczególne jego elementy należy wziąć w nawiasy.
Np. Jeśli –5 <= x <= 10, to zwiększ licznik.
if (-5 <= x) and (x <= 10) then licznik:= licznik+1;
Wynika to z faktu, że w języku Pascal operatory logiczne (np. and, or) mają wyższy priorytet niż operatory relacji (np. <, <=).
Zamiast pojedynczej instrukcji można wykonać instrukcję złożoną ujętą w nawiasy logiczne begin i end.
if wyrażenie_logiczne then begin
instrukcja_1;
instrukcja_2; {sekwencja instrukcji prostych}
...instrukcja_n;
end;
Jeśli wartość wyrażenia jest prawdą, to zostaną wykonane wszystkie instrukcje zawarte w nawiasach logicznych begin end. Jeśli wyrażenie jest fałszywe, to żadna z instrukcji nie zostanie wykonana.
Np. if (a<>5) then begin
if (b<10) then c:= a - b;
a := 2b;
end;
Przykład 4.1. Wyznaczenie minimum z trzech liczb rzeczywistych x, y, z i zapamiętanie wyniku w zmiennej min. Wykorzystanie if.
Var x, y, z, min : real;
Begin
write(’Podaj pierwszą liczbę x = ’); readln(x);
write(’Podaj drugą liczbę y = ’); readln(y);
write(’Podaj trzecią liczbę z = ’); readln(z);
min:=x; { wartość początkowa minimum } if y<=min then min:=y;
if z<=min then min:=z;
writeln(’Minimum = ’, min:0:2);
readln;
End.
Przykład 4.2. Wyznaczenie minimum z trzech liczb rzeczywistych x, y, z i zapamiętanie wyniku w zmiennej min. Wykorzystanie if oraz operatora and.
Var x, y, z, min : real;
Begin
write(’Podaj pierwszą liczbę x = ’); readln(x);
write(’Podaj drugą liczbę y = ’); readln(y);
write(’Podaj trzecią liczbę z = ’); readln(z);
if (x<=y) and (x<=z) then min:=x;
if (y<=x) and (y<=z) then min:=y;
if (z<=x) and (z<=y) then min:=z;
writeln(’Minimum = ’, min:0:2);
readln;
End.
4.3. Instrukcja warunkowa z wielokrotnym wyborem if then else
Instrukcja if umożliwia wybór pomiędzy wykonaniem a niewykonaniem instrukcji. Natomiast instrukcja if-else umożliwia wybór pomiędzy dwoma czynnościami w zależności od wartości wyrażenia.
if wyrażenie_logiczne then instrukcja_1 { brak średnika przed else}
else instrukcja_2;
Jeśli wartość wyrażenia_logicznego jest prawdą (TRUE), to wykonana zostanie instrukcja_1. W przeciwnym wypadku instrukcja_1 zostanie opuszczona i wykonana zostanie instrukcja_2.
Np. Var a, b, c: integer;
Begin
a:=1; b:=2; c:=0;
if (a+b > 3) then a:= a + 1 else c:= a + b;
End;
Ponieważ a+b = 3 wykonana zostanie druga instrukcja, tj. c := a + b.
Za pomocą instrukcji if-then-else można decydować o wykonaniu lub niewykonaniu grupy instrukcji.
if wyrażenie_logiczne then begin
{ grupa_instrukcji_1; } end
else begin
{ grupa_instrukcji_2; } end
Np. if (a = b) then c:= d else c:= b;
if (a < 10) then begin
if (b < 7) then c:= a + b else b:= b + 1;
end
else begin c:= 0; a:= a + b; end;
Instrukcja if-then-else może być wielokrotnie zagnieżdżona.
if (warunek_1) then
begin { instrukcje_1; } end else if (warunek_2) then
begin { instrukcje_2; } end else if (warunek_3) then
begin { instrukcje_3; } end ...
else if (warunek_N) then
begin { instrukcje_N; } end
else begin { instrukcje_N+1; } end;
{ wykonywane jeśli wszystkie warunki if (...) then są fałszywe }
Jeśli warunek_1 jest spełniony, to wykona się grupa instrukcji_1, a pozostałe sprawdzenia if zostaną opuszczone. W przeciwnym przypadku instrukcje_1 zostaną pominięte i nastąpi sprawdzenie wyrażenia warunek_2. W podobny sposób analizowane są pozostałe warunki.
W rozpatrywanym przypadku są wykonywane tylko instrukcje związane z prawdziwym warunkiem, a pozostałe są pomijane. Jeżeli żaden warunek nie jest prawdziwy, to wykonywane są instrukcje związane z ostatnim else.
Np. if (delta > 0.0) then writeln(’Dwa pierwiastki rzeczywiste’)
else if (delta = 0.0) then writeln(’Dwa identyczne pierwiastki’) else writeln(’Dwa pierwiastki zespolone’);
Jeśli delta >0.0, to wyprowadzona zostanie informacja, że równanie ma dwa pierwiastki, a pozostałe informacje zostaną pominięte.
Var a, b, c: integer;
a:=3; b:=3; c:=0;
if (a+b > 5) then
if (b>=3) then c:= c+1 { wykona się c = c+1; c =1 } else begin b:= a; c:= c -1; end;
c:= c + a + b; { wykona się c = c + a + b; c=1+3+3 = 7 }
Jeśli a+b > 5, to sprawdzany jest warunek b >= 3. Jeśli warunek a+b > 5 nie jest spełniony, to wykonywana jest instrukcja c:= c + a + b;
Warunek else dotyczy najbliższej instrukcji if, która nie posiada else.
Var a, b, c: integer;
a:=2; b:=3; c:=0;
if (a+b > 5) then
if (b>=3) then c:= c + 1
else begin b:= a; c:= c - 1; end else c:= a + b; { wykona się c = 2 + 3 = 5 }
Można również wykorzystać nawiasy logiczne begin end do pokazania związków pomiędzy if oraz else.
a:=2; b:=3; c:=0;
if (a+b > 5) then begin
if (b>=3) then c:= c + 1
else begin b:= a; c:= c + 1; end;
c:= a + b;
end else
if (c>0) then begin c:= c + a; b:= b + 1; end
else begin b:= b + a; a:= a + 1; end; { b=5; a=3; c=0; }
Przykład 4.3. Wyznaczanie minimum z trzech liczb a, b,c (if-then-else).
Var a, b, c, min: integer;
begin
a:= -20; b:= -50; c:= -10;
if (a<b) then
if (a<c) then min:= a else min:= c else
if (b<c) then min:= b else min:= c;
writeln(’Najmniejsza liczba: ’, min); readln;
end.
4.4. Instrukcja wyboru case of
Jeśli należy dokonać wyboru spośród wielu wariantów, to można wykorzystać instrukcję warunkową if-else. Jednak w większości przypadków wygodniej posłużyć się instrukcją wyboru wielowariantowego, która ma jedną z następujących postaci:
case selektor of
zakres_1_selektora: instrukcja_1;
zakres_2_selektora: instrukcja_2;
...
zakres_M_selektora: instrukcja_M;
end;
gdzie selektor jest zmienną lub wyrażeniem typu porządkowego.
Jeśli wartość selektora będzie należała do jednego z podanych zakresów, to wykonana zostanie instrukcja po dwukropku, natomiast pozostałe przypadki nie będą już rozpatrywane.
Instrukcja odpowiadająca określonemu zakresowi może być instrukcją złożoną ujętą w nawiasy logiczne begin end.
Np. Var i: integer;
readln(i);
case i of
0..100: begin writeln(’Słabo’); writeln(’Postaraj się lepiej’); end;
101..120: writeln(’Dobrze’);
121..190: writeln(’Bardzo dobrze’);
end;
Przykład selektora będącego wyrażeniem.
Var delta: integer;
delta:= -1;
case (delta>=0) of
false: writeln(’Pierwiastki zespolone’);
true: if (delta = 0) then writeln(’Dwa identyczne pierwiastki’) else writeln(’Dwa różne pierwiastki’);
end;
Istnieje wariant instrukcji wyboru, w którym w przypadku braku przynależności selektora do jakiegokolwiek zakresu realizowany jest blok instrukcji występujący po else.
case selektor of
zakres_1_selektora: instrukcja_1;
zakres_2_selektora: instrukcja_2;
zakres_M_selektora: instrukcja_M; ...
else instrukcja_N;
end;
Np. var i: integer;
readln(i);
case i of
0..100: begin writeln(’Słabo’); writeln(’Postaraj się lepiej’); end;
101..120: writeln(’Dobrze’);
121..190: writeln(’Bardzo dobrze’);
else writeln(’Zły zakres’);
end;
Przykład 4.4. Wyprowadzanie pełnej nazwy koloru.
type
TKolory = ( R, G, B );
var
kolor: TKolory;
i: integer;
Begin
readln(i);
kolor:= Tkolory(i); { konwersja typu } case kolor of
R: writeln(’Czerwony’);
G: writeln(’Zielony’);
B: writeln(’Niebieski’);
else writeln(’Inny kolor’);
end ; End.
Przykład 4.5. Opracować program realizujący prosty kalkulator (+,-,,/).
uses crt;
Var oper, zn: char;
a, b, wynik: real;
pom: integer;
Begin clrscr;
repeat
writeln('Podaj pierwszy argument : '); readln(a);
writeln('Podaj drugi argument : '); readln(b);
writeln('Wybierz operacje [+, -, /, *]: '); readln(oper);
pom:= 1; { wybrana operacja jest poprawna } case (oper) of
'+': wynik:= a + b;
'-': wynik:= a - b;
'*': wynik:= a * b;
'/': if (b <> 0.0) then wynik:= a/b
else begin writeln('Dzielenie przez zero'); pom:=0; end;
else begin writeln('Wybrano złą operację'); pom:=0; end;
end;
if (pom>0) then { wyświetlenie wyników } begin writeln(' Wynik: ');
writeln(a:8:4, ' ', oper, ' ', b:8:4, ' = ', wynik:8:4);
end;
repeat
writeln('Czy wykonać kolejne obliczenia (T/N)?');
zn:= upcase(readkey);
writeln;
until ( zn='T') OR (zn='N');
until (zn='N');
End.