Object Pascal/Struktura programu, podstawowe elementy języka
Spis treści |
program nazwa_programu (parametry); //nagłówek
{część definiująca}
begin
{część operacyjna}
end.
program ;
{$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.
Program 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).
Zastrzeż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
Zmienna 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).
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.
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).
Definicja 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
Predefiniowane 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
Priorytet |
Operatory |
1. |
jednoargumentowe (+, -, @, not) |
2. |
multiplikatywne (*, /, div, mod, and, shl, shr, as) |
3. |
addytywne (+, -, or, xor) |
4. |
relacyjne (=, <>, <, >, <=, >=, in, is) |
Operatory |
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 |
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 |
=, <>, <, <=, >, >=
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 |
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 |
+
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 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
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
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ń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
uses lista_nazw_modułów;
label lista_etykiet;
const sekwencja_definicji_stałych;
Przykład:
const
a=3-1;
imie='Anna';
s= sqrt(25);
z:integer=2;
type identyfikator_typu_1= opis_typu
identyfikator_typu_2= opis_typu
...
identyfikator_typu_n= opis_typu
var 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.