WYKŁAD 2
OPERACJE NA WARTOŚCIACH TYPÓW SKALARNYCH
Jak już wiemy typ obiektu określa obok zbioru wartości który ten obiekt może przyjmować również także zbiór operacji które można wykonać na tych obiektach. Operacje kończą się poprawnie o ile wartości argumentów i wyniki operacji nie wykraczają poza zbiór wartości typu.
Operacje na wartościach całkowitych
Dostępnymi operacjami są :
+ - dodawanie,
- - odejmowanie,
* - mnożenie
div - dzielenie całkowite
mod - branie reszty z dzielenia całkowitego
Operatory dzielenia całkowitego i brania reszty są słowami kluczowymi. Ponadto do liczb całkowitych można stosować operatory relacji , np. większe, równe itd.
Przykłady :
7 div 4 (wynikiem dzielenia całkowitego jest 1)
7 mod 4 (reszta z dzielenia ma wartość 3)
Oprócz powyższych operatorów które łączą argumenty typu integer w wyrażeniach mogą również występować nazewniki funkcji tj. identyfikatory (nazwy) funkcji wraz z wartościami argumentów ujętymi w nawiasy okrągłe. Podanie w wyrażeniu nazewnika funkcji nazywamy wywołaniem funkcji. W pascalu mamy do dyspozycji 17 funkcji standardowych tj. takich których nie trzeba deklarować w sekcji deklaracji programu, ponieważ ich opisy są wbudowane w język. Wszystkie funkcje standardowe są jednoargumentowe . Argumentem funkcji może być stała, identyfikator stałej, zmienna lub wyrażenie. Zarówno typ argumentu, jak i typ wyniku są ustalone dla danej funkcji. Funkcjami o argumencie typu całkowitego są:
abs(i) - wartość bezwzględna
sqr(i) - kwadrat
succ(i) - następnik, tj. i + 1
pred(i) - poprzednik, tj i - 1
Funkcjami konwersji liczb rzeczywistych (argument rzeczywisty) do całkowitych są:
round(r) - zaokrąglenie do najbl. liczby całkowitej
trunc(r) - obcięcie do liczby całkowitej w kierunku zera.
Przykłady :
abs(-5) = 5 round(2.7) = 3
sqr(2) = 4 trunc(2.7) = 2
succ(7) = 8 trunc(-2.7) = -2
Operacje na wartościach rzeczywistych
Na liczbach rzeczywistych można przeprowadzać następujące operacje :
+ - dodawanie
- - odejmowanie
* - mnożenie
/ - dzielenie
Zwrócic należy uwagę, że różne są operatory dzielenia dla liczb rzeczywistych i całkowitych.
Ponadto liczby rzeczywiste można porównywać operatorami relacji.
Przykład :
7 div 4 - dzielenie całkowite z odrzuceniem reszty (wynik: 1);
7.0/4.0 - dzielenie rzeczywiste (wynik :1.75);
7/4 - dzielenie rzeczywiste, ale wolno używać liczb całkowitych zamiast rzeczywistych (wynik : 1.75) : wszędzie tam gdzie można użyć liczb rzeczywistych można również uzyć liczb całkowitych ale nie odwrotnie; pascal automatycznie konwertuje liczby całkowite na rzeczywiste
7.0 div 4.0 - zapis nieprawidłowy
Funkcjami standardowymi o wartościach rzeczywistych (niezależnie od argumentu : real czy integer ) są :
sqrt(x) - pierwiastek kwadratowy
ln(x) - logarytm naturalny
exp(x) - funkcja wykładnicza o podstawie e
sin(x) - sinus
cos(x) - cosinus
arctan(x) - arcus tangens
Wartościami funkcji :
abs(x) - wartość bezwzględna
sqt(x) - kwadrat
jest liczba rzeczywista gdy argument jest liczbą rzeczywistą lub liczba integer gdy argument jest typu integer
Język pascal nie przewiduje operatora potęgowania - należy posługiwać się odpowiednio mnożeniem, funkcjami sqr, sqrt, exp i ln.
Dowolną potęgę liczby a można obliczyć posługując się zależnością :
ab = exp(b*ln(a))
Operacje standardowe i funkcje na wartościach typu znakowego :
Zbiór wartości tego typu nie jest sprecyzowany przez standard, lecz stanowią go znaki zewnętrzne, dostępne w danym systemie komputerowym. Wartości tego typu są uporządkowane, ponadto litery są uporządkowane alfabetycznie, a cyfry według wartości liczbowej. A więc kolejność znaków jest ustalona przez uporządkowanie typu char.
Funkcje standardowe dla których argumentem oraz wartością mogą być zmienne typu char to :
succ(z) - następnik; następny znak po znaku z
pred(z) - poprzednik: znak bezpośredniopoprzedzający znak z
Funkcją standardową której wartością jest zmienna typu char jest :
char(i) - określa znak o numerze porządkowym - i w zbiorze wartości typu char
Operacje na wartościach typu logicznego
W wielu algorytmach zachodzi potrzeba badania warunków i podejmowania decyzji o dalszym przebiegu procesu obliczeniowego. Badania takie sprowadza się do sprawdzenia czy dany warunek jest spełniony, czy też nie. W pascalu wprowadzono typ standardowy umożliwiający zapisywanie warunków oraz posługiwanie się nimi - jest to typ boolean. Istnieją tylko dwie stałe logiczne : false i true oznaczające odpowiednio fałsz i prawdę. Na wartościach logicznych w Pascalu można wykonywać następujące operacje :
not - negacja (operacja jednoargumentowa)
and - iloczyn logiczny - koniunkcja (operacja dwuargumentowa)
or - suma logiczna - alternatywa ( operacja dwuargumentowa)
Priorytet :: not ; and; or.
Dla powyższych operatorów obowiązuje tzw. tablica prawdy ; a mianowicie jeśli p oraz q są zmiennymi typu boolean to :
p
|
q
|
not p
|
p or q
|
p and q
|
true false true false |
true true false false |
false true false true |
true true true false |
true false false false |
Przykład wyrażeń logicznych :. not p or q and r
not (p or q) and (q or r)
Funkcją standardową o wartości logicznej jest :
odd(i) - funkcja nieparzystości o argumencie całkowitym
false, gdy i parzyste
odd(i) =
true, gdy i nieparzyste
WYRAŻENIA
Wyrażenie pascalowe jest konstrukcją językową, która służy do wyznaczenia wartości określonego typu. Innymi słowy przez wyrażenie rozumiemy regułę obliczania w wyniku której otrzymujemy pewną wartość. Wyrażenie składa się z argumentów i operatorów. Argumentami są stałe (np liczby), zmienne lub funkcje. Operatory są to symbole pascalowe, które wiążą argumenty wyrażeń. Wyrażenia arytmetyczne to wyrażenie którego wartościowanie daje wynik typu integer lub real. Wyrażeniem logicznym nazywamy wyrażenie, którego wartościowanie daje wynik typu boolean. Wartością wyrażenia logicznego może być jedna z dwóch stałych tego typu a mianowicie : true lub false.Operatory można podzielić na :
a) - arytmetyczne (* / div mod + -)
b) - logiczne (not and or )
c) - relacyjne (< <= > >= = <>)
Jeżeli wyrażenie zawiera różne operatory to wartościowanie wyrażenia przebiega w kolejności jaką określa priorytet operatorów. Gdy wszystkie operatory występujące w wyrażeniu mają jednakowy priorytet działania wykonywane są kolejno od lewej do prawej strony.
Priorytet operatorów :
1) - operator not
2) - operatory multiplikatywne: *, /, mod, div, and;
3) - operatory addytywne: +, -, or;
4) - operatory relacji: <>, <, >, <=, >=;
Przykłady wyrażeń logicznych :
` (x < 0) or (x > 10)
(0 < x) and (x < 5)
x + y > suma
(licznik > 10) or (suma >= 1000)
(znak >= 'a') and (znak <= 'z')
INSTRUKCJE
Instrukcje są to konstrukcje języka opisujące akcje, które mają być wykonane podczas procesu obliczeniowego.
Instrukcje te powodują zmianę wektora stanu programu. Instrukcje Turbo Pascala można podzielić na dwie grupy :
- instrukcje proste
- instrukcje strukturalne (złożone) czyli zbudowane na podstawie pewnego schematu strukturalizacji kilku instrukcji prostych.
Do instrukcji prostych zaliczamy :
- instrukcję przypisania;
- instrukcję skoku;
- instrukcję pustą;
- instrukcję wywołania procedury.
Prawidłowo napisany program w Pascalu nie powinien używać instrukcji skoku.
Instrukcje przypisania
Instrukcja przypisania jest najważniejszą i najczęściej wykorzystywaną instrukcją pascalową. Służy do nadania zmiennej lub funkcji nowej wartości.
Ogólna postać instrukcji przypisania jest następująca :
zmienna := wyrażenie; lub funkcja := wyrażenie
Wyrażenie znajdujące się na prawo od znaku przypisania (:=) przypisywane jest zmiennej lub funkcji po stronie lewej. Obiektem przypisywanym zmiennej może być wyrażenie arytmetyczne, liczba, znak, łańcuch znaków, funkcja lub inna zmienna. Instrukcja przypisania ma pewne istotne ograniczenie - zarówno zmienna jak i przypisywane jej wyrażenie powinny być tego samego typu. Bagatelizowanie tego faktu prowadzi do poważnych błędów trudnych do wyeliminowania.
Przykłady :
godzina := 12;
x := x + 1;
y := 5 + sqr(5.24);
OPERACJE WEJŚCIA - WYJŚCIA
Program komunikuje się z otoczeniem za pomocą urządzeń wejścia - wyjścia czyli najczęściej klawiatury i monitora ekranowego. Do wprowadzania danych ze standardowego urządzenia wejścia (klawiatury) służą dwie wyspecjalizowane procedury : read i readln.
Składnia obu instrukcji jest jednakowa i ma postać :
read (lista zmiennych);
readln (lista zmiennych)
Elementy wchodzące w skład listy należy oddzielić przecinkami. Zasadnicza różnica między read a readln polega na tym, że w przeciwieństwie do read wykonanie instrukcji readln powoduje przejście kursora do nowej linii. Podobne procedury służą do wyprowadzania wyników na standardowe urządzenie wyjścia (ekran). Ich składnia jest następująca :
write(lista zmiennych);
writeln(lista zmiennych);
Przykłady :
read(a,b);
jeżeli z klawiatury kolejno będą wczytane liczby 13 i 24 to zmiennej a zostanie przypisana wartość 13 a b 24; oczywiście obie zmienne muszą być wcześniej zadeklarowane
write(a,b)
następuje wypisanie na ekranie wartości zmiennych a i b, przy czym kursor pozostanie w tej samej linii
writeln(a,b)
następuje wypisanie na ekranie wartości a i b przy czym kursor przechodzi do następnego wiersza
Przy pomocy instrukcji write możemy wypisywać także teksty co stwarza możliwość opisu np zmiennych wczytywanych. lub wyprowadzanych na ekran np:
write('x1 = '); wypisuje na ekranie x1 =
read(x1); wprowadzenie x1
write('x2 = '); wypisuje na ekranie x2 =
read(x2); wprowadzenie x2
Najlepiej aby każdej wyprowadzanej liczbie towarzyszył symbol przypisanej jej zmiennej. Służy do tego konstrukcja :
write('x1 =',x1,' x2 =',x2);
dla x1 = 3 i x2 = 5 efekt na ekranie będzie następujący :x1 =3 x2 =5
W pascalu liczby wyprowadzane są w pewnym standardowym formacie. Jeżeli w określonej sytuacji dany format nam nie odpowiada to możemy go zmienić, korzystając z instrukcji ;
write(a:x) dla zmiennych integer
- gdzie x oznacza liczbę miejsc przeznaczonych na liczbę lub
write(a:x1:x2) dla zmiennych real
- gdzie x1 - liczba miejsc przeznaczonych na liczbę;
- x2 - liczba miejsc po przecinku.
Przykłady :
write(liczba_całkowita:5);
write(liczba_rzeczywista:10:3);