Turbo Pascal 7.0
Wstęp Źródła Kurs Programy Linki

Lekcje:     1   2   3   4   5   6   7

Instrukcje, operatory

W tej lekcji dwa powyższe elementy języka zastosujemy w praktyce, pisząc proste programy.


Instrukcja przypisania

Ta instrukcja służy do nadania wartości jakiejś zmiennej. Program zostanie skompilowany, jeśli zmienne będą zgodnego typu. W poniższym przykłądzie zadeklarowaliśmy zmienną a, która jest liczbą byte. W takim wypadku można jej przydzielić wartość np. w ten sposób:
a := 1;
a := b+c;
A := readln;
W pierwszym przypadku przydzieliliśmy jej wartość 1. W drugim - sumę zmiennych b i c - obie te zmienne muszą być typu całkowitego, a wartość ich sumy musi mieścić się w zakresie byte. W drugim przypadku - przypisaliśmy wartość predefiniowanej funkcji readln. Funkcja ta jest zawarta w module system i przyjmuje wartość wpisaną z klawiatury. Jeżeli wpisałbyś np. "a", to wystąpi błąd, gdyż litera 'a' nie jest liczbą (Nie myl z nazwą zmiennej a. Wpisane "a" to zwykła stała typu char lub jednoznakowy łańcuch - string[1]). Po lewej stronie wpisałem "A" z dużej litery. Nie ma to znaczenia, gdyż wielkość liter w nazwach zmiennych, stałych, typów, procedur i funkcji nie ma znaczenia. Zauważ, że błąd może również wystąpić już po uruchomieniu programu.


Operatury arytmetyczne

Służą do obliczania wartości liczbowych. Wyrózniamy następujące operatory: +, -, *, /, div oraz mod. Cztery pierwsze z nich chyba nie wymagają komentarza. Operator div to tzw. dzielenie całkowite, czyli dzielenie, a następnie zaokrąglenie wyniku do liczby całkowitej. Operator mod to reszta z dzielenia. Rozważmy następujący prosty programik:
var a : byte;
begin
  a:=1+2;      {pierwsza linia}
  a:=1-2;      {druga linia}
  a:=1/5;      {trzecia linia}
  a:=1 div 5;  {czwarta linia}
  a:=10 mod 3; {piąta linia}
  a:=100*100   {szósta, ostatnia linia wykonywalnego kodu}
end.
Zadeklarowaliśmy tu zmienną a typu byte. Przeanalizujmy kolejne linie programu. W pierwszej z nich zmiennej a przypisaliśmy wartość 3. W drugiej - wystąpi błąd przekroczenia zakresów, gdyż wartość -1 nie mieści się w przedziale byte (pamiętamy, że liczby byte to liczby całkowite od 0 do 255. Trzecia linia też jest błędna (błąd zostanie wykryty już podczas kompilacji), gdyż wynik z prawej strony instrukcji przypisania nie jest liczbą całkowitą. Inaczej jest w linii czwartej, gdzie wynik dzielenia 1/5 (czyli 0.2) zostanie zaokrąglony - do 0. W piątej linii - reszta z dzielenia 10 przez 3 wynosi 1 (3*3=9, zostaje 1), taka też wartość zostanie przypisana zmiennej a. W szóstej linii zostanie równiez przekroczony zakres, co będzie błędne. Zauważ, że w ostatniej linii (szóstej) nie postawiłem średnika. Przed słowem kluczowym end stawianie średnika nie jest obowiązkowe. Gdybyś postawił średnik na końcu szóstej linii, to kod programu po kompilacji wydłużyłby się o 1 bajt (jednak oczywiście działanie programu nie zmieniłoby się), w związku z tym zalecam poniechanie stawiania średnika w ostatniej linii programu.


Komentarze

W poprzednim przykładowym programie zauważyłeś zapewne teksty ujęte w klamrowe nawiasy. Te teksty to tzw. komentarze, których zawartość jest pomijana przez kompilator i może zawierać nawet polskie znaki. Komentarze można też zagnieżdzać (są dwa typy) - drugi rodzaj komentarza wygląda tak:
(* to jest komentarz *)
(* to jest komentarz {a ten komentarz jest zagnieżdżony} *)
{to jest komentarz {zaś ten jest nieprawodłowo zadnieżdżony}}
W drugiej linii komentarz został zagnieżdżony - zauważ, że komentarze zagnieżdżamy naprzemiennie, czego nie zrobiłem w trzeciej linii - przez co zapis jest nieprawidłowy. Podczas pisania programów z czasem zauważysz że w ostatniej linii wystarczyłoby na końcu usunąć jeden z nawiasów klamrowych, co zlikwidowałoby problem.


Operatory relacyjne

Służą do porównywania wartości zmiennych. Wyróżniamy następujące operatury relacyjne:
  • = - równy
  • <> - różny
  • < - mniejszy
  • > - większy
  • <= - mniejszy lub równy
  • >= - większy lub równy
  • in - jest elementem zbioru
Zadeklarowaliśmy 3 zmienne typu byte o przypisanych wartościach: a=1 b=1 c=2 oraz zmieną tab będącą tablicą array [1..3] of byte o wartości (2,3,4) (tak zapisujemy wartości kolejnych zmiennych tablicy). Rozważmy więc kilka wartości logicznych następujących wyrażeń:
a>c      {1}
b<c      {2}
a>=b     {3}
b<=c     {4}
a in tab {5}
b in tab {6}
Wartość pierwszego wyrażenia to fałsz (False), gdyż a jest mniejsze od c (1<2). Wartość drugiego wyrażenia to prawda (True), ponieważ b ma mniejszą wartość od c. Wartość trzeciej linii to prawda, bo a jest równe b. Podobnie jest w przypadku czwartej linii, b jest mniejsze niż c. Piąta linnia to fałsz, gdyż jedynka nie jest skłądnikiem tablicy tab. W szóstej linii b należy do tablicy tab (jest dokładnie pierwszym składnikiem tej tablicy, czyli tab[1]), więc jeje wartość to prawda.


Operatory logiczne

Skupimy się tu tylko na trzech z nich, które się z resztą najbardziej przydają w praktyce. Operatory logiczne są ściśle związane z działem matematyki - logiką (I klasa liceum). Tak więc:
  • not - to logiczne "nie" (negacja) - zaprzeczenie twierdzenia
  • and - logiczne "i" (koniunkcja) - twierdzenie będzie prawdziwe, jeśli wszystkie jego składniki będą równocześnie prawdziwe.
  • or - logiczne "lub" (alternatywa) - twierdzenie będzie prawdziwe, gdy co najmniej jeden z jego składników będzie prawdziwy.
Aby sprawdzić jak będzie to wyglądało w praktyce, rozważmy następujący przykład (używając już wiedzy o operatorach relacyjnych zawartej w poprzednim akapicie). Zadeklarujmy 2 zmienne - a oraz b, obie typu byte. Zmiennej a przypiszmy wartość 1, a zmiennej b wartość 2.
a=b                   {1}
a<>b                  {2}
(a>b) and (b=2)       {3}
not ((a>b) and (b=2)) {4}
(a>b) or (b=2)        {5}
not (a=2)             {6}
Pierwsze dwa przykłady dotyczą raczej oeratorów relacyjnych. Pierwszy z nich jest oczywiście błędny, a drugi prawdziwy, co chyba nie wymaga komentarza. Trzeci przykład - drugi nawias jest prawdziwy, lecz pierwszy jest fałszem - są one połączone operatorem "i", przez co aby całość była prawdą wszystkie muszą być prawdziwe (a tak nie jest) więc wyrażenie jest fałszywe. Czwarta linia to zanegowane wyrażenie trzecie - jak wsześniej napisałem trzecie było fałszem, więc czwarte jest prawdą (bo zanegowany fałsz to prawda). W piątym wyrażeniu pierwszy nawias jest fałszem, zaś drugi - prawdą, więc całe wyrażenie jest prawdą (zostało połączone operatorem "lub" - więc aby wyrażenie było prawdziwe, wystarczy tylko jedno prawdziwe wyrażenie składowe). W ostatnim przykładzie wartość pod nawiasem jest fałszem (a jest równe 1, a nie 2), lecz jest ono zanegowane, więc całość jest prawdą.


If

Instrukcja warunkowa if jest chyba jedną z najbardziej istotnych funkcji pascalowych. If pozwala na uzależnienie wykonywanych czynności od danych. W praktyce, konstrukcję instrukcji if można zapisać dwoma schematami:
if wyrażenie then instrukcja;
oraz
if wyrażenie then instrukcja1
             else instrukcja2;
Konstrukcja - jak widać - jest dosyć prosta, jednak zrozumienie jej jest wiążące dla umiejętności programowania (nie tylko w Pascalu). W pierwszym przypadku instrukcja zostanie wykonana tylko wtedy, gdy zostanie spełnione wyrażenie. W drugim zaś, jeżeli zostanie spełnione wyrażenie, zostanie wykonana instrukcja1, zaś gdy wyrażenie nie będzie spełnione, to zostanie wykonana instrukcja2. Rozważmy to na kilku przykładach.
uses crt;                                                      {1}
var a:byte;                                                    {2}
begin                                                          {3}
  write('Wpisz liczbę: ');                                     {4}
  readln(a);                                                   {5}
  if (a mod 2)=0 then writeln('Wpisałeś liczbę parzystą.')     {6}
                 else writeln('Wpisałeś liczbę nieparzystą.'); {7}
  readkey                                                      {8}
end.                                                           {9}
W pierwszej linii programu zadeklarowaliśmy używanie modułu standartowego crt (musieliśmy to zrobić, gdyż później używamy readln, writeln, czy readkey, które są zadeklarowane właśnie w tym module). W sumie obyłoby sie bez używania crt, ale tak będzie dla nas o wiele wygodniej. Zalecam też używanie crt w każdym programie. W linii 2 zadeklarowaliśmy zmienną a typu byte. Linia 3 - początek programu, a 4 - wypisanie na ekranie tekstu. Nie daliśmy writeln, gdyż write nie przenosi kursora na następny wiersz i pierwszą kolumnę. Na końcu łańcucha do wypisania jest spacja, przez co całość będzie bardziej estetyczna. Linia 5 - przypisanie zmiennej a wartości z klawiatury. Jest to najprostrze rozwiązanie, ale ma bardzo poważny mankament - jeśli podasz wartość nie będącą liczbą z przedziału 0-255 (przedział byte) to program się zawiesi. Linia 6 i 7 - zastosowano instrukcję warunkową if. Warunkiem tu jest (a mod 2)=0. Gdy wyrażenie to będzie równe 0, to liczba a będzie parzysta (bo reszta z dzielenia liczby parzystej przez 2 jest równa 0). W przeciwnym wypadku będzie to liczba nieparzysta. Mogliśmy tu wpisać "if (a mod 2)<>0 then writeln('Wpisałeś liczbę nieparzystą');" ale nie było to konieczne - przez zastosowanie else uniknęliśmy zbędnego kodu. Wiadomo, że jeśli liczba jest całkowita i nie jest parzysta to musi być nieparzysta. Pamiętaj, że przed else nie można stawiać średnika. Linia 8 to oczekiwanie na naciśnięcie klawisza (nie daliśmy na końcu średnika, bo przed end jest to zbędne), a linia 9 - zakończenie programu.



Case

Instrukcja case jest poniekąd rozszerzeniem if, lecz jest nieco rzadziej używana. Można ją opisac - podobnie jak if - dwom schematami:
case wyrażenie of
  kolejneinstrukcje
end
oraz
case wyrażenie of
  kolejneinstrukcje
  else instrukcja
end
Jedyna istotna różnica jest taka, że w if były tylko 2 możliwości - jakaś określona możliwość (którą w schemacie nazwałem "wyrażenie"), a drugą były wszystkie inne ewentualności. Przy użyciu case możesz określić np. 4 określone możliwości; Tak czy inaczej, w każdym wypadku możesz case zastąpić przez if, ale zmniejsza to przejrzystośc programu i zwiększa długość jego kodu. Rozważmy następujący przykładowy program:
uses crt;
var a:string;
begin
  write('Wpisz łańcuch: ');
  readln(a);
  case a[1] of
   'a'..'z','ą','ć','ę','ł','ń','ó','ś','ż','ź' :
   writeln('Łańcuch zaczyna się z małą literą');
   '0'..'9' : writeln('Łańcuch zaczyna się cyfrą');
   'A' : writeln('Łańcuch zaczyna się dużą literą "A"')
  else
    writeln('Łańcuch nie zaczyna się ani małą literą,'+
    +'ani cyfrą, ani dużą literą "A"');
  readkey
end.
Ten program jest bardzo podobny do poprzedniego. Na początku (po deklaracji zmiennych i modułów) wczytujemy dane z klawiatury (zmienną "a" typu string). Później przy pomocy instrukcji case, ustalamy jaki napis zostanie wyświelony. Jest to zależne od a[1], czyli od pierwszego znaku łańcucha. W pierwszym wypadku zapisaliśmy zbiór małych liter (kody polskich znaków nie mieszczą się poza kodami 'a'..'z', więc musieliśmy zapisać je po przecinku). Przypominam jeszcze, że przed else i end nie stawiamy średnika, jednak w tym pierwszym przypadku jest to konieczne.

Lekcje:     1   2   3   4   5   6   7

Wstęp Źródła Kurs Programy Linki
Powrót