Object Pascal/Struktura programu, podstawowe elementy języka
Struktura programu
edytujprogram nazwa_programu (parametry); //nagłówek {część definiująca} begin {część operacyjna} end.
Przykład
edytujprogram ; {$APPTYPE CONSOLE} uses SysUtils; var a:integer begin writeln ('podaj liczbe'); readln (a); if a mod 2=0 then writeln ('liczba parzysta') else writeln ('liczba nieparzysta') end.
Uwagi
edytujProgram może występować w dwóch wariantach:
- tekstowy - tekstowe okno DOSa, obsługiwane przez bibliotekę modułów RTL (runtime library).
- graficzny - przeznaczony dla środowiska Windows i obsługiwany przez bibliotekę VCL (visual component library).
Podstawowe elementy języka
edytujSłowa kluczowe
edytujZastrzeżone słowa języka (Object) Pascal. Są integralną częścią języka i nie mogą być definiowane przez programistę:
and | array | as | asm | begin | case | class | const | constructor | destructor | dispinterface |div | do | downto | else | end | except | exports | file | finalization | finally | for | function | goto | if | implementation | in | inherited | initialization | inline | interface | label | library | mod | nil | not | object | of | or | out | packed | procedure | program | property | raise | record | repeat | resourcestring | set | shl | shr | string | then | threadvar | to | try | type | unit | until | uses | var | while | with | xor
Zmienne
edytujZmienna to identyfikowany przez nazwę tzw. "pojemnik" na wartość wykorzystywaną podczas działania programu. Każdą zmienną należy deklarować (patrz: deklaracja zmiennych), czyli określić jakiego typu ma być zmienna. Każda zmienna w Object Pascalu posiada swoją nazwę (identyfikator) oraz typ. Identyfikator zmiennej zależy tylko od programisty, nie może zawierać słowa kluczowego (zobacz również typy zmiennych, opisane w osobnym dziale:Typy zmiennych).
Każda zmienna musi zostać:
edytuj- zadeklarowana (określenie typu zmiennej i przydzielenie jej pamięci)
- zainicjalizowana (nadanie zmiennej wartości)
Do wprowadzania wartość "z zewnatrz" do programu służą procedury: read i readln. Wartość zmienniej można również przypisać stosując instrukcję przypisania.
Podział zmiennych:
edytuj- globalne - zdefiniowane na zewnątrz procedury, funkcji czy metody, alokowane w segmencie danych (obszar przydzielany w momencie rozpoczęcia wykonywania programu),
- lokalne - zdefiniowane wewnątrz procedur, funkcji lub metod, alokowane w segmencie stosowym (obszar przydzielany na czas pracy procedury).
Identyfikatory
edytujDefinicja identyfikatora w notacji BNF ma postać:
<identyfikator> ::= <litera> { <litera> | <cyfra> } <litera> ::= A | B | C | D | E | F | G | H | I |J | K | L | M | N |O | P | Q | R | S | T | U | V | W | X | Y | Z a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z | _ <cyfra> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7| 8 | 9
Identyfikator to ciąg liter lub cyfr zaczynający się od litery (znak _ zaliczany jest do liter). Długość identyfikatora jest dowolna, ale tylko pierwszych 255 znaków jest znaczące. Identyfikator nie może zaczynać się od cyfry, np. dozwolony jest identyfikator: _11 natomiast nie wolno użyć: 11_. Nie wolno również używać w identyfikatorach słów kluczowych.
Identyfikatory służą do oznaczania programów, procedur, funkcji, metod, parametrów formalnych, modułów, bibliotek DLL, typów, zmiennych, stałych, etykiet (identyfikator etykiety może być też liczbą), pól rekordów i obiektów.
Każdy identyfikator ma określony zakres ważności. Bez wnikania w szczegóły można przyjąć, że zakres ten obejmuje blok, w którym wystąpiła odpowiednia definicja (deklaracja) identyfikatora, łącznie z blokami wewnętrznymi.
Szereg identyfikatorów posiada predefiniowane znaczenie, ich deklaracje są w poszczególnych modułach, nie są jednak słowami zastrzeżonymi. Jeżeli programista zdefiniuje taki identyfikator, to w zakresie jego ważności standardowe znaczenie jest przesłonięte, można je jednak odsłonić używając notacji:
nazwa-modułu.identyfikator
Dyrektywy języka
edytujPredefiniowane słowa, które nie są zastrzeżone, czyli mogą być zdefiniowane przez programistę. Należą do nich np.
absolute | abstract | assembler | automated | cdecl | deprecated | dynamic | export | exports | external | far | forward | near | overload | override | pascal | platform | private | protected | public | published | read | register | reintroduce | safecall | stdcall | virtual | write
Operatory
edytujPriorytety operatorów
edytujPriorytet | Operatory |
---|---|
1. | jednoargumentowe (+, -, @, not) |
2. | multiplikatywne (*, /, div, mod, and, shl, shr, as) |
3. | addytywne (+, –, or, xor) |
4. | relacyjne (=, <>, <, >, <=, >=, in, is) |
Operatory arytmetyczne
edytujOperatory | Typ argumentu | Typ wyniku |
---|---|---|
+, - (jednoargumentowe) | całkowity, rzeczywisty | Integer, Int64, Extended |
+, -, * | całkowity, rzeczywisty | Integer, Int64, Extended |
/ | całkowity, rzeczywisty | Extended |
div, mod | całkowity | Integer,Int64 |
Operatory logiczne
edytujOperatory | Typ argumentu | Typ wyniku |
---|---|---|
NOT (negacja) | ||
OR (alternatywa) | całkowity | całkowity |
AND (koniunkcja) | logiczny | logiczny |
XOR (różnica symetryczna) | całkowity | całkowity |
SHL (przesunięcie w lewo) | całkowity | całkowity |
SHR (przesunięcie w prawo) | całkowity | całkowity |
Operatory relacyjne
edytuj=, <>, <, <=, >, >=
argumenty typu: prostego, łańcuchowego, znakowego, upakowany typ łańcuchowy (packed array [0..x] of char), Pchar (<,<=,>,>=)
wynik typu: Boolean
Uwagi:
- porównania łańcuchów zgodnie z rozszerzonym kodem ASCII,
- dwa argumenty upakowanego typu łańcuchowego muszą mieć tę samą liczbę elementów,
- argumenty typu Pchar można porównywać, gdy wskaźniki dotyczą elementów wewnątrz tej samej tablicy,
- operacje na wskaźnikach przy typie wskaźnikowym.
Przykłady:
'abc' < 'bc' // true 'Object' + ' ' + 'Pascal' = 'Object Pascal' // true
Operatory teoriomnogościowe
edytujOperatory | Typ argumentu | Typ wyniku |
---|---|---|
+ (suma zbiorów) | typ zbiorowy | typ zbiorowy |
- (różnica zbiorów) | typ zbiorowy | typ zbiorowy |
* (iloczyn zbiorów) | typ zbiorowy | typ zbiorowy |
<= (jest zawarty, jest podzbiorem) | typ zbiorowy | Boolean |
>= (zawiera, jest nadzbiorem) | typ zbiorowy | Boolean |
= (równy) | typ zbiorowy | Boolean |
<> (różny) | typ zbiorowy | Boolean |
in (należy, jest elementem) | typ bazowy | Boolean |
Operator konkatenacji
edytuj+
- Odpowiada operacji sklejania łańcuchów.
- Jeżeli oba argumenty są łańcuchami krótkimi, to wynik też będzie łańcuchem krótkim (z ewentualnym obcięciem).
- Jeżeli przynajmniej jeden argument jest łańcuchem długim, to wynik też jest łańcuchem długim.
Przykład
'Object ' + 'Pascal' = 'Object Pascal'
Komentarze
edytujKomentarze są to ciągi wyrazów, znaków nie mających wpływu na przebieg programu, oznacza się je w następujące sposoby:
{komentarz}
(*komentarz*)
//komentarz
Zapis liczb
edytuj- Liczba całkowita dziesiętna musi być z przedziału :
[-2 147 483 648, 2 147 483 647]
- Liczba całkowita szesnastkowa (należy użyć symbolu $ i liter od A do F dla oznaczenia cyfr szesnastkowych) powinna być z przedziału:
[-$80000000, $7FFFFFFF]
- Liczba rzeczywista składa się z:
- mantysy – jest to liczba dziesiętna postaci:
część-całkowita [. część-ułamkowa]
- opcjonalnie:
- litery E (lub e) – oznacza że podstawą wykładnika jest liczba 10
- cechy – jest to liczba całkowita
- opcjonalnie:
- Procedury: write i writeln pozwlają na wyprowadzanie liczb w postaci sformatowanej, z określoną liczbą cyfr przed i po kropce dziesiętnej:
writeln(liczba:szerokość_pola:liczba_miejsc_dziesiętnych
należy pamiętać, że w skład pola przeznaczonego na liczbę wchodzi również jej znak i kropka dziesiętna, a wykładnik zawsze posiada znak i wiodące zera. Przykład:
liczba:=123.123456789; writeln(liczba:6:5);
pokaże w programie liczbę: 123.12345.
Łańcuchy
edytujŁańcuch jest to ciąg znaków (maksymalnie 255) zapisanych w jednej linii i ujętych w apostrofy, znaków sterujących oraz znaków w postaci dziesiętnej i szesnastkowej poprzedzonych znakiem #.
Przykład:
- 'Object Pascal'
- #125
Deklaracje
edytujDeklaracja modułów
edytujuses lista_nazw_modułów;
Deklaracja etykiet
edytujlabel lista_etykiet;
Deklaracja stałych
edytujconst sekwencja_definicji_stałych;
Przykład:
const a=3-1; imie='Anna'; s= sqrt(25); z:integer=2;
Deklaracja typów
edytujtype identyfikator_typu_1= opis_typu identyfikator_typu_2= opis_typu ... identyfikator_typu_n= opis_typu
Deklaracja zmiennych
edytujvar sekwencja deklaracji;
Przykład:
var a,b:real; c,d,e:integer; begin {dalszy ciąg programu}
Deklaracja zmiennych powinna się znajdować po nagłówku programu w części definiującej a przed słowem kluczowym begin. Składnia języka zabrania deklarowania zmiennych w treści programu.