Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 3: Podstawowe elementy języka © Jan Kaczmarek
Przypomnijmy, że program napisany w Object Pascalu musi mieć odpowiednią strukturę: program nazwa-programu (parametry); {$APPTYPE CONSOLE} uses SysUtils; {dalsze definicje i deklaracje} begin {instrukcje} end. Zapisując programy w Pascalu możemy stosować tylko symbole z alfabetu tego języka, w szczególności słowa kluczowe (program, begin, end,…). Z symboli alfabetu budujemy proste elementy programu, do których zaliczamy: identyfikatory, liczby, stałe logiczne, łańcuchy i komentarze.
Identyfikatory Identyfikator to ciąg liter lub cyfr zaczynający się od litery (znak _ zaliczany jest do liter). Długość identyfikatora jest dowolna, ale komputer rozpoznaje tylko pierwsze 255 (63, 127) znaków (zależy to od wersji Pascala). Identyfikatory służą do nazywania (oznaczania) wszelkich obiektów (w szczególności zmiennych, typów, stałych, procedur i funkcji), jakie używamy w programie. Identyfikatorem musi być nazwa-programu napisana po słowie program. Przykłady: identyfikatory poprawne identyfikatory błędne pole a+b (niedozwolony znak +) a111 dl dzialki (niedozwolony odstęp) dl_dzialki 122 (same cyfry, brak litery na początku) AB A[X] (niedozwolone znaki [ i ]) xyz begin (zastrzeżone słowo kluczowe)
Liczby W Pascalu możemy stosować następujące rodzaje liczb: Liczby całkowite – zbudowane są z cyfr i mogą zaczynać się znakiem + lub –, muszą być z przedziału: [–2147483648 , 2147483647] Liczby rzeczywiste – zbudowane są z cyfr i muszą zawierać kropkę (dla oddzielenia części całkowitej od części ułamkowej) lub literę E (lub e) dla wskazania tzw. wykładnika lub kropkę i literę E (lub e) jednocześnie. Liczba może mieć znak + lub –, wykładnik (jeśli wystąpi) musi być liczbą całkowitą. Liczby rzeczywiste odpowiadają liczbom dziesiętnym, które nie są całkowite, w szczególności ułamkom dziesiętnym. Object Pascal dopuszcza także liczby całkowite szesnastkowe (ze znakiem lub bez znaku), rozpoczynające się znakiem $ i zbudowane z cyfr szesnastkowych (0-9, A, B, C, D, E, F), muszą być z przedziału: [-$80000000, $7FFFFFFF]
Jeżeli liczba rzeczywista zawiera literę E (lub e), czyli jest postaci aEw, to jej wartość wynosi a*10w. Liczby tej postaci są stosowane do zapisania bardzo dużych (lub bardzo małych) wielkości. Przykłady: liczby całkowite: 1 987 +987 -987 liczby rzeczywiste: 1234.2 -98.76 0.674 -0.000001 +9.87E-3 (wartość 9.87*10-3) 9e11 (wartość 9*1011) liczby szesnastkowe: -$1234 $ABCD
Stałe logiczne W Pascalu występują dwie stałe logiczne TRUE (true) i FALSE (false) dla oznaczenia odpowiednio wartości „prawda” („tak”) i „fałsz” („nie”).
Łańcuchy Łańcuch (nazywany także napisem) składa się z ciągu znaków ASCII (maksymalnie 255) zapisanych w jednej linii i ujętych w apostrofy (‘). Odstęp zapisany w łańcuchu jest istotny. Przykłady: ‘podaj a: ‘ ‘wieksza z liczb to: ‘ ‘iloczyn = ‘ ‘A‘ ‘bledne dane‘ Łańcuchy mogą być wykorzystane - przy wprowadzaniu danych, jako komunikaty określające, jakie dane należy wprowadzić - przy wyprowadzaniu wyników, gdy opisują wyprowadzane wyniki - przy wyprowadzaniu komunikatów, np. o błędach.
Komentarze i separatory Komentarzem jest ciąg symboli alfabetu Pascala zamknięty w nawiasy klamrowe { i } lub ich odpowiedniki (* i *). Komentarze są pomijane przez kompilator i pełnią wyłącznie funkcję informacyjno-objaśniającą dla czytającego program. Przykłady komentarzy: {to jest komentarz} (* ten fragment znajduje wiekszą z liczb a i b *) Komentarze, odstępy, znaki sterujące o kodach ASCII od 0 do 31 nazywa się separatorami. Naciśnięcie klawisza ENTER generuje dwa separatory o kodach ASCII równych 10 i 13, co odpowiada przejściu do nowej linii. Stosowanie odstępów (wcięć), przejść do nowej linii, tabulacji (tzw. białych znaków) nie jest konieczne, ale jest zalecane, gdyż zwiększa się w ten sposób czytelność programu.
program wieksza; {program znajdowania większej z dwóch podanych liczb} {$APPTYPE CONSOLE} uses SysUtils; var a, b, max : integer; begin write (‘podaj a: ‘); readln (a); write (‘podaj b: ‘); readln (b); if a>b then max := a else max := b; write (‘wieksza z liczb to: ‘ , max); readln; end.
program iloczyn; {program znajdowania iloczynu il = 1. 2. 3. … program iloczyn; {program znajdowania iloczynu il = 1*2*3*…*n dla danego n} {$APPTYPE CONSOLE} uses SysUtils; var n, i, il : integer; begin write (‘podaj n: ‘); readln (n); il := 1; for i:=1 to n do il := il*i; write (‘iloczyn = ‘ , il); readln; end.
Typy danych Określenie typu danych to określenie, jaki jest zbiór wartości, które może przyjmować dany obiekt. Z typem związany jest ponadto zbiór operacji, jakie można wykonać na jego wartościach. Zobaczymy później, że każdy operator lub funkcja mają argumenty ustalonego typu i dają wynik ustalonego typu, określonego przez reguły języka. Błędne konstrukcje językowe mogą być zatem wykryte już na etapie kompilacji bez konieczności wykonania programu. Najprostsze typy danych w Pascalu to typy całkowite, rzeczywiste, logiczny, znakowy i łańcuchowe. Typy te określamy za pomocą predefiniowanych (tzn. znanych już kompilatorowi) identyfikatorów. Programista może sam określać (opisywać) bardziej złożone typy, może też definiować identyfikatory odpowiadające tym opisom.
Typy całkowite Typy całkowite są predefiniowane, tzn Typy całkowite Typy całkowite są predefiniowane, tzn. nie wymagają opisu. Obiekty, które są typu całkowitego mogą przyjmować wartości, które są liczbami całkowitymi. W zależności od identyfikatora typu dozwolony jest określony zakres tych liczb: Typ Zakres integer od –2147483648 do 2147483647 shortint od –128 do 127 smallint od –32768 do 32767 longint od –2147483648 do 2147483647 byte od 0 do 255 word od 0 do 65535 Warto zwrócić uwagę, jakie wartości (ale tylko całkowite) będzie przyjmował nasz obiekt i wybrać odpowiedni dla niego typ.
Typy rzeczywiste Typy rzeczywiste są predefiniowane, tzn Typy rzeczywiste Typy rzeczywiste są predefiniowane, tzn. nie wymagają opisu. Obiekty, które są typu rzeczywistego mogą przyjmować wartości, które są liczbami rzeczywistymi. W zależności od identyfikatora typu jest określony zakres tych liczb i ich dokładność: Typ Zakres Dokładność real od 5.0*10–324 do 1.7*10308 15–16 cyfr single od 1.5*10–45 do 3.4*1038 7–8 cyfr double od 5.0*10–324 do 1.7*10308 15–16 cyfr extended od 3.6*10–4951 do 1.1*104932 19–20 cyfr Zalecane jest używanie typu real.
Typ logiczny Typ logiczny jest predefiniowany, tzn. nie wymaga opisu Typ logiczny Typ logiczny jest predefiniowany, tzn. nie wymaga opisu. Obiekty, które są typu logicznego mogą przyjmować wartości, które są stałymi logicznymi. Typ logiczny określa identyfikator Boolean. Typ znakowy Typ znakowy jest predefiniowany, tzn. nie wymaga opisu. Obiekty, które są typu znakowego mogą przyjmować wartości, które są znakami ASCII ujętymi w apostrofy (jednoznakowymi łańcuchami). Typ znakowy określa identyfikator char.
Typy łańcuchowe Typ łańcuchowy jest predefiniowany, tzn Typy łańcuchowe Typ łańcuchowy jest predefiniowany, tzn. nie wymaga opisu. Obiekty, które są typu łańcuchowego mogą przyjmować wartości, które są łańcuchami. Typ łańcuchowy określa identyfikator string. Typ łańcuchowy może dodatkowo określać maksymalną długość łańcucha. Ma wówczas postać string [zakres], gdzie zakres jest liczbą całkowitą od 1 do 255, która określa maksymalną długość łańcucha. Jeśli nie podano jawnie zakresu, to przyjmuje się zakres = 255.
Zmienne i ich deklarowanie Zmienna to symboliczne ujęcie wielkości (obiektu), która w trakcie wykonywania programu może zmieniać swoje wartości. Zmienna jest identyfikowana przez swój identyfikator. W Pascalu każda zmienna musi mieć określony typ (tzw. mocna kontrola typów) i nie może on się zmieniać w trakcie wykonywania programu. Jeśli zmienna nie jest predefiniowana (tzn. nie jest już znana kompilatorowi), to trzeba określić (zadeklarować) typ tej zmiennej.
Typ zmiennej określa się w deklaracji zmiennej postaci: Typ zmiennej określa się w deklaracji zmiennej postaci: var sekwencja-deklaracji gdzie każdy element sekwencji-deklaracji ma postać: lista-identyfikatorów : opis-typu; lista-identyfikatorów zawiera identyfikatory zmiennych oddzielone przecinkami, a opis-typu może być w szczególności określony przez podanie identyfikatora typu. Deklaracje zmiennych powinny wystąpić w części {definicje i deklaracje} po deklaracjach modułów, stałych i typów. Przykład: var i, j, k : integer; x, y, z : real; rowne : Boolean; znak1, znak2 : char; napis : string; nazwisko, imie : string[20];
program wieksza; {program znajdowania większej z dwóch podanych liczb} {$APPTYPE CONSOLE} uses SysUtils; var a, b, max : integer; begin write (‘podaj a: ‘); readln (a); write (‘podaj b: ‘); readln (b); if a>b then max := a else max := b; write (‘wieksza z liczb to: ‘ , max); readln; end. Jakie zmienne występują w tym programie?
program iloczyn; {program znajdowania iloczynu il = 1. 2. 3. … program iloczyn; {program znajdowania iloczynu il = 1*2*3*…*n dla danego n} {$APPTYPE CONSOLE} uses SysUtils; var n, i, il : integer; begin write (‘podaj n: ‘); readln (n); il := 1; for i:=1 to n do il := il*i; write (‘iloczyn = ‘ , il); readln; end. Jakie zmienne występują w tym programie?
Stałe i ich definiowanie Stała to symboliczne ujęcie wielkości (obiektu), która w trakcie wykonywania programu nie zmienia swojej wartości. Stała i jej wartość są identyfikowane przez sam zapis stałej, np. jest to liczba (np. 564), stała logiczna (np. TRUE) lub łańcuch (np. ‘Ala ma kota‘). Stała może być identyfikowana także przez identyfikator (nazywa się ją literałem), ale trzeba go wówczas zdefiniować (o ile nie jest to stała predefiniowana). Definicja literału ustala synonim dla danej stałej w postaci identyfikatora.
Definicja stałych (literałów) ma postać: Definicja stałych (literałów) ma postać: const sekwencja-definicji-stałych gdzie każdy element sekwencji-definicji-stałych ma postać: identyfikator = wyrażenie-stałe; identyfikator : oznaczenie-typu = wyrażenie-stałe; oznaczenie-typu to identyfikator (lub opis) typu, a wyrażenie-stałe to wyrażenie, którego wartość możemy obliczyć nie odwołując się do zmiennych, np. stała. Definicja stałych powinna wystąpić w części {definicje i deklaracje} po deklaracjach modułów, a przed deklaracjami typów i zmiennych. Przykład: const eps = 0.1E-11; imie = ’Alicja’; prawda = true; a = 2 + 5; zero : integer = 0; tekst = ‘Proszę podać imie i nazwisko pracownika ‘