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 przypisaniaTa 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 arytmetyczneSł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. KomentarzeW 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 relacyjneSłużą do porównywania wartości zmiennych. Wyróżniamy następujące operatury relacyjne:
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 logiczneSkupimy 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:
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ą. IfInstrukcja 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. CaseInstrukcja 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 endoraz case wyrażenie of kolejneinstrukcje else instrukcja endJedyna 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 |