Object Pascal/Struktura programu, podstawowe elementy języka

Struktura programu

edytuj
 program nazwa_programu (parametry); //nagłówek
 {część definiująca}
 begin
 {część operacyjna}
 end.

Przykład

edytuj
 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).

Podstawowe elementy języka

edytuj

Słowa kluczowe

edytuj

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

Zmienne

edytuj

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).

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

edytuj

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

Dyrektywy języka

edytuj

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

Operatory

edytuj

Priorytety operatorów

edytuj
Priorytet Operatory
1. jednoargumentowe (+, -, @, not)
2. multiplikatywne (*, /, div, mod, and, shl, shr, as)
3. addytywne (+, –, or, xor)
4. relacyjne (=, <>, <, >, <=, >=, in, is)

Operatory arytmetyczne

edytuj
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 logiczne

edytuj
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

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

edytuj
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

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

edytuj

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

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
  • 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

edytuj

Deklaracja modułów

edytuj
 uses lista_nazw_modułów;

Deklaracja etykiet

edytuj
 label lista_etykiet;

Deklaracja stałych

edytuj
 const sekwencja_definicji_stałych;

Przykład:

 const
   a=3-1;
   imie='Anna';
   s= sqrt(25);
   z:integer=2;

Deklaracja typów

edytuj
 type identyfikator_typu_1= opis_typu
      identyfikator_typu_2= opis_typu
      ...
      identyfikator_typu_n= opis_typu

Deklaracja zmiennych

edytuj
 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.