PODSTAWOWE WIADOMOSCI O JĘZYKU TURBO PASCAL
Podstawowe wiadomości o języku Turbo Pascal
Pierwszy opis języka Pascal opublikował w 1971 r. Niklaus Wirth. Pomyślany on był jako język służący do nauki programowania. Pascal stosowany początkowo do celów edukacyjnych stał się profesjonalnym narzędziem informatycznym. Od tego czasu pojawiło sie wiele wersji tego języka, znacznie odbiegających od pierwowzoru, łamiących nawet strukturalizm języka. Międzynarodowa Organizacja Normalizacyjna ISO przedstawiła w 1980 roku celem ujednolicenia propozycję standardu Pascala. Produkt firmy Borland International Inc. - Turbo Pascal odbiega od niego znacznie.
Każdy program źródłowy składa się z:
Jednostek leksykalnych (ciągów symboli podstawowych, tj. małych i dużych liter alfabetu angielskiego wraz ze znakami podkreślenia, cyfr dziesiętnych i szesnastkowych, znaków specjalnych i dwuznaczników nie zawierających odstępu),
Odstępów (spacje, tabulacje, znaki zmiany wiersza i komentarze).
Symbole podstawowe.
Litery |
A B C D E F G H I J K L M N O P Q R S T U V W 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 y z _ |
Cyfry |
1 2 3 4 5 6 7 8 9 0 |
Znaki specjalne |
+ - * / = ^ < > ( ) [ ] { } . , : ; ` # $ @spacja |
Znaki sterujące |
Kody ASCII od 0 do 31 |
Symbole dwuznakowe |
:= operator przypisania |
Jednostki leksykalne.
Słowa kluczowe
Są to spójne ciągi liter tworzące zarezerwowane słowa angielskie o ustalonym znaczeniu. Poniżej ich lista (52 pozycje);
and |
array |
asm |
begin |
case |
const |
constructor |
destructor |
div |
do |
downto |
else |
end |
file |
for |
function |
goto |
if |
implementation |
in |
inherited |
inline |
interface |
label |
mod |
nil |
not |
object |
of |
or |
packed |
procedure |
program |
record |
repeat |
set |
shl |
shr |
string |
then |
to |
type |
unit |
until |
uses |
var |
while |
with |
xor |
|
Deklaratory
Są to spójne ciągi liter o ustalonym znaczeniu, które nie są jak słowa kluczowe słowami zarezerwowanymi:
absolute |
assembler |
external |
far |
forward |
interrupt |
near |
private |
public |
virtual |
Identyfikatory
Są to ciagi liter i znaków rozpoczynające się od litery, nie będące słowem kluczowym. Znak podkreślenia _ uznawany jest za literę. Liczba znaków identyfikatora może być dowolna, ale tylko pierwsze 63 są rozróżniane. Nie są rozróżniane duże i małe litery. Identyfikatory służą do oznaczania programów, stałych, typów, zmiennych, pól w rekordach, procedur, funkcji, parametrów formalnych.
Liczby
Nazywane są także literałami arytmetycznymi i dzielą się na:
Liczby całkowite.
Reprezentowane są one jako ciąg cyfr dziesiętnych lub szesnastkowych poprzedzonych ewentualnie znakiem +, -. Ciąg cyfr szesnastkowych powinien być poprzedzony znakiem $. W systemie szesnastkowym wykorzystywane są dodatkowo znaki A, B, C, D, E, F.
Liczby całkowite mogą zajmować w pamięci:
|
1 bajt |
krótkie |
zakres [-128..127] |
|
2 bajty |
normalne |
zakres [-32 768..32 767] |
|
4 bajty |
długie |
zakres [-2 147 483 648..2 147 483 647] |
Liczby całkowite z zakresu:
|
[0..255] |
to liczby bajtowe |
1 bajt |
|
[0..65 535] |
to liczby słowowe |
2 bajty |
Liczby rzeczywiste
Składają się one z mantysy, litery E i cechy. Mantysa jest liczbą dziesiętną, a cecha całkowitą. Mogą one zawierać wyłącznie cyfry dziesiętne. Dopuszczalne jest opuszczenie części ułamkowej wraz z kropką albo samej części ułamkowej albo litery E i cechy.
Zakresem liczb rzeczywistych jest przedział [2.9E-39..1.7E38]. Liczby rzeczywiste zajmują 6 bajtów a ich mantysa ma maksymalnie 11-12 cyfr znaczących. W zestawach z koprocesorem dostępne sa ponadto następujące literały rzeczywiste:
|
pojedyńcza długość |
[1.5E-45..3.4E48] |
4 bajty |
mantysa 7-8 cyfr |
|
podwójna długość |
[5.0E-324..11.7E308] |
8 bajtów |
mantysa 15-16 cyfr |
|
rozszerzone |
[1.9E-4951..1.1E4932] |
10 bajtów |
mantysa 19-20 cyfr |
|
typu Comp |
[-263+1..263-1] |
8 bajtów |
mantysa 19-20 cyfr |
Łańcuchy
Zwane są one inaczej literałami łańcuchowymi i służą do reprezentowania ciągu znaków:
ciąg znaków między apostrofami, 'to jest łańcuch'',
znak sterujący ^H <Ctrl-H>,
znaki w postaci dziesiętnej i szesnastkowej: #127 (reprezentacja znaku o kodzie dziesuiętnym 127), #$7F (j.w. lecz kod szesznastkowy).
Literały logiczne
Mają one postać napisu true lub false.
Komentarze
Są to napisy rozpoczynające sie od { i kończące się }. Jeżeli po { wystąpi $ to mamy do czynienia z dyrektywą kompilatora.
Struktura programu
Program napisany w Turbo Pascalu składa się z:
nagłówka programu,
deklaracji modułów,
bloku,
znaku . (kropki).
Nagłówek programu
Nagłówek programu składa się ze słowa kluczowego program, po którym występuje nazwa programu (identyfikator) oraz ewentualnie ujęta w nawiasy okrągłe lista identyfikatorów (kolejne elementy tej listy oddzielamy przecinkami). Liście tej nie jest nadawana żadna interpretacja, jest więc ona najczęściej pomijana. Może zostać także pominięta cała nazwa programu. Nie jest to jednak wskazane z metodologicznego punktu widzenia. Nazaw programu stanowi formę komentarza i opisuje jego działanie.
Blok
Blok programu w języku Turbo Pascal składa się z:
części opisowej, w której:
definiuje się typy i nazwy literałów,
podaje sie deklaracje etykiet i zmiennych, a także
umieszcza sę definicje i deklaracje procedur i funkcji.
Kolejność ta jest dowolna, dopuszczalne jest także przeplatanie się poszczególnych elementów.
części wykonawczej, która składa się z instrukcji złożonej zawierającej ciąg instrukcji wykonywanych sekwencyjnie ograniczony słowami kluczowymi begin i end.
Struktura programu napisanego w Turbo Pascalu jest więc następująca:
program Nazwa_Programu (lista_identyfikatorów); deklaracja modułów część opisowa begin ciąg instrukcji end. |
Najprostszy program napisany w Pascalu, pozbawiony opcjonalnej części opisowej, z pustym ciągiem instrukcji, ma więc następującą budowę:
program Nic_Nie_Robię; { naglowek mozna bylo pominac} |
Deklaracje modułów
Moduły służą do grupowania procedur i funkcji w biblioteki. W systemie Turbo Pascal użytkownik ma możliwość korzystania z kilku modułów standardowych, w których zgromadzone są podstawowe funkcje i procedury języka. Moduł standardowy System jest dołączany automatycznie przez kompilator. W celu wykorzystania innych modułów należy ten fakt najpierw zadeklarować. Służy do tego konstrukcja:
uses lista_nazw_modułów |
Nazwy kolejnych modułów na liście oddzielane są przecinkami.
Deklaracje etykiet
W Turbo Pascalu instrukcja programu może być poprzedzona etykietą. Mechanizm ten służy do przekazywania sterowania do tej instrukcji za pomocą instrukcji skoku bezwarunkowego goto. Opinia na temat używania skoku w programach twórcy Pascala N. Wirtha jest zdecydowanie jednoznaczna:
Wystąpienie instrukcji skoku w programie pascalowym często świadczy o tym, że programista nie nauczył sie myśleć w Pascalu.
Etykieta składa się z:
identyfikatora lub
ciągu do czterech cyfr, który może być poprzedzony nieznaczącymi zerami.
W treści programu bezpośrednio po etykiecie występuje dwukropek : oddzielający daną etykietę od innej etykiety lub instrukcji. Deklaracje etykiet mają postać:
label lista_etykiet |
Nazwy kolejnych etykiet na liście oddzielane są przecinkami. Przykład etykiety i "zaetykietowanej" instrukcji zamieszczony jest poniżej:
label |
Definicje nazw literałów (stałych)
Język Turbo Pascal umożliwia zastąpienie literałów przez odpowiednie przypisane im identyfikatory. Jest to w zasadzie zabieg kosmetyczny, mający na celu zwiększenie czytelności programu. Definicja stałych dokonywana jest za pomocą konstrukcji:
const |
Przykłady dwóch postaci definicji stałych umieszczone są poniżej:
const |
Trzy ostatnie literały określane są mianem literałów zmiennych. Niektóre nazwy literałów są predefiniowane, jak np. Pi = 3.1415…
Definicje typów
Absolutnie każda zmienna wykorzystywana przez nas w programie musi zostać zadeklarowana. Deklaracja oznacza określenie jej nazwy (identyfikatora) i wartości, które może ona przyjmować. Typ zmiennej możemy najprościej określić jako zbiór jej wartości. Typy wykorzystywane w Turbo Pascalu dzielą się na:
standardowe (predefiniowane), nie wymagające żadnegop dodatkowego opisu,
niestandardowe, wprowadzane przez programistę, musza być przez niego dodatkowo opisane.
Składnia definicji typu, opisującej typ i jednocześnie przyporządkowującej mu odpowiedni identyfikator jest następująca:
type sekwencja_definicji_typów gdzie każda z definicji typu ma postać identyfikator_typu - opis _typu; |
"Typologia" Turbo Pascala wyróżnia następujące typy:
|
|
|
wyliczeniowy |
|
|
|
okrojony |
|
|
porzadkowy |
calkowity |
|
prosty |
|
logiczny |
|
|
|
znakowy |
|
|
rzeczywisty |
|
|
łancuchowy |
|
|
typ |
|
tablicowy |
|
|
strukturalny |
rekordowy |
|
|
|
zbiorowy |
|
|
|
plikowy |
|
|
|
|
|
|
obiektowy |
|
|
|
wskaźnikowy |
|
|
Typ prosty składa się z z uporządkowanego oraz skończonego, przeliczalnego, zbioru wartości.
Dla typu porządkowego jednoznacznie określane są wartości porzedzające i następujące po danej wielkości. W języku Turbo Pascal istnieje szereg predefiniowanych typów prostych:
zbiór liczb całkowitych (typy ShortInt, Integer, LongInt, Byte, Word),
zbiór liczb rzeczywistych (typy Real, Single, Double, Extended, Comp),
zbiór wartości logicznych typu Boolean,
zbiór znaków typu Char.
Typ wyliczeniowy i okrojony definiowane są przez użytkownika.
Typ łańcuchowy, którego elementami mogą być dowolne znaki, służy do reprezentowania tekstów.
Typy strukturalne definiuje się przez podanie:
typów składowych,
metody strukturalizacji, określającej sposób dostępu do poszczególnych elementów składowych (określany jest tzw.selektor).
Przykłady definicji typów mogą być następujące:
type |
Deklaracje zmiennych
Deklaracje zmiennych składają się ze słowa kluczowego var, po którym następuje wykaz deklaracji.
var |
Lista identyfikatorów to oddzielona przecinkami lista nazw zmiennych, a opis typu zawiera określenie typu zmiennej.
Istotnym elementem jest zakres zmiennej, to jest obszar, dla którego jest ona zadeklarowana i w którym może być wykorzystywana. Jest nim zawsze blok, w którym została ona zadeklarowana, począwszy od miejsca, w którym zadeklarowany został jej identyfikator. W przypadku o strukturze zagnieżdżonych bloków mamy do czynienia ze zjawiskiemprzesłaniania. Ilustruje to poniższy rysunek:
Blok1
Blok2 |
Zmienna Cos zadeklarowana w Bloku2 to zupełnie inna zmienna niż Cos z Bloku1. Ilustrację deklaracji zmiennych stanowią poniższe przykłady.
var |
Definicje i deklaracje procedur i funkcji
Nie wnikając w szczegóły tzw. programowania proceduralnego, które poznamy już niedługo, możemy powiedzieć, że definicje te będą określały zakres czynności, które będą wykonane po wywołaniu procedury bądź funkcji. Podprogramy umożliwiają wprowadzenie w programie "porządnych" skoków. W przypadku funkcji dodatkowo jest określany także typ wyniku.
Sztuka „pisania” programu
Już po pierwszych próbkach pisania w Pascalu widać, że w tym szaleństwie jest metoda. Przyjęte zostały pewne reguły gry, zwiększające czytelność.
słowa kluczowe i deklaratory zapisywane są pogrubioną czcionką,
komentarze zapisywane są czcionką pochyłą, kursywa,
stosowane są tzw. wcięcia (dwuznakowe), podobne do akapitów,
tekstowi staramy się nadać strukturę kolumnową,
wyróżniamy definicje podprogramów, aby uwypuklić "porządne" skoki.
Na wydruku komputerowym (listingu) dwa pierwsze chwyty nie funkcjonują. Tym istotniejsze staje się rozsądne i logicznewcinanie oraz struktura kolumnowa. Umówmy sie, że tak właśnie pisać będziemy nawet najprostszy program. Po co utrudniać to, co i tak jest samo z siebie dosyć skomplikowane. Próbki tzw. stylu wolnego zwanego też radosnym zostaną przedstawione nieco później, tak, by nie wyrabiać w Was negatywnych nawyków.
Moje refleksje po kilkuletnim nauczaniu Pascala są raczej smutne. Jeżeli po długich zmaganiach udaje się w końcu uruchomić program, to jest on napisany w zdecydowanie nieczytelny sposób. Najczęstsze grzechy to:
nagminne nadużywanie instrukcji skoku bezwarunkowego goto,
totalny brak wcięć,
unikanie komentarzy bardziej, niż diabeł święconej wody.