Typy danych
W j臋zyku Turbo Pascal ka偶da sta艂a, zmienna, funkcja itp. musi by膰 艣ci艣le okre艣lonego typu. Na podstawie tego typu kompilator rezerwuje odpowiedni膮 ilo艣膰 pami臋ci na dany element. Typ ten charakteryzuje zbi贸r warto艣ci przyjmowanych przez niego. W Pascalu istnieje bardzo wiele r贸偶nych typ贸w. Programista ma mo偶liwo艣膰 r贸wnie偶 tworzenia w艂asnych. Mo偶emy wyr贸偶ni膰 cztery standardowe typy:
Typ liczb ca艂kowitych
Typ liczb rzeczywistych
Typ znakowy
Typ logiczny
Dodatkowo typy definiowane przez u偶ytkownika mo偶na podzieli膰 na:
Typ okrojony
Typ wyliczeniowy
Typ 艂a艅cuchowy
Typ wska藕nikowy
Typ tablicowy
Typ rekordowy
Typ obiektowy
Typ zbiorowy
Typ plikowy
Typ proceduralny
Struktury danych to temat bardzo rozleg艂y. Na tej stronie opisane zosta艂y standardowe - statyczne typy danych. Zach臋cam jednak po przestudiowaniu tego dzia艂u do zajrzenia na podstrony Algorytm贸w, gdzie znajdziesz dok艂adne opisy struktur takich jak: stos, lista, kolejka, graf.
Typy ca艂kowite
Wszystkie elementy tego typu stanowi膮 zbi贸r liczb ca艂kowitych. R贸偶ni膮 si臋 one tylko przedzia艂em, a co za tym idzie ilo艣ci膮 pami臋ci potrzebnej na zapisanie danej liczby. Istniej膮 nast臋puj膮ce typy ca艂kowite:
TYP ZAKRES ROZMIAR
--------------------------------------------
Shortint -128..127 1
Byte 0..255 1
Integer -32768..32767 2
Word 0..65635 2
Longint -2147483648..2147483647 4
Typ rzeczywisty
Dane tego typu stanowi膮 zbi贸r liczb rzeczywistych. Poszczeg贸lne podtypy r贸偶ni膮 si臋 mi臋dzy sob膮 zakresem oraz ilo艣ci膮 zajmowanej przez nie pami臋ci. Mamy wi臋c nast臋puj膮ce podtypy:
TYP ZAKRES CYFR ZNACZ膭CYCH ROZMIAR
---------------------------------------------------------
Single 1.5e-45..1.7e38 7-8 4
Real 2.9e-39..1.7e38 11-12 6
Comp -2.63+1..2e63-1 19-20 8
Double 5.0e-324..1.7e308 15-16 8
Extended 3.4e-4932..1.1e4932 19-20 10
Je艣li przy deklaracji elementu typu Comp lub Extended poka偶e si臋 komunikat: Must be in 8087 mode to compile this., to znaczy, 偶e musisz w menu OPTIONS/COMPILER w dziale Numeric processing wybra膰 opcj臋 8087/80287.
Typ 艂a艅cuchowy
Dane typu 艂a艅cuchowego sk艂adaj膮 si臋 z ci膮gu znak贸w. Ci膮g ten poprzedzony jest jednym bajtem, w kt贸rym zapisana jest jego d艂ugo艣膰. Z tego te偶 wzgl臋du maksymalna d艂ugo艣膰 ci膮gu wynosi 255 znak贸w. (Je艣li potrzebujesz zmiennej typu 艂a艅cuchowego d艂u偶szej ni偶 255 znak贸w, to zajrzyj do rozdzia艂u Dyrektywy). Typ 艂a艅cuchowy deklarujemy za pomoc膮 s艂owa kluczowego STRING. Zadeklarowany element domy艣lnie przyjmuje d艂ugo艣膰 255 bajt贸w. Zalecane jest, aby okre艣la膰 jego d艂ugo艣膰 samemu. W tym celu po s艂owie STRING w nawiasach kwadratowych wpisujemy liczb臋 okre艣laj膮c膮 d艂ugo艣膰 naszego elementu, a co za tym idzie ilo艣膰 pami臋ci potrzebnej na jego zapami臋tanie.
Zmienne i sta艂e typu 艂a艅cuchowego mog膮 by膰 traktowane przez u偶ytkownika jako tablica, np. aby zmieni膰 trzeci膮 liter臋 zmiennej na K napiszemy:
VAR Nazwa_zmiennej : STRING[10]; {maksymalnie 10 znak贸w}
Nazwa_zmiennej[3]:='K';
Je艣li chcemy dowiedzie膰 si臋 o d艂ugo艣ci naszej zmiennej pos艂u偶ymy si臋 funkcj膮 Length b膮d藕 odczytamy zerowy bajt naszej zmiennej za pomoc膮 polecenia Ord np.:
d艂ugo艣膰_艂a艅cucha:=Ord(Nazwa_zmiennej[0]);
Gdyby艣my chcieli zmieni膰 wszystkie litery z ma艂ych na wielkie mogliby艣my pos艂u偶y膰 si臋 funkcj膮 Upcase. Jednak pozwala ona zmienia膰 tylko jedn膮 liter臋. Przyk艂adowy ci膮g instrukcji zmienia wielko艣膰 wszystkich liter w zmiennej NAPIS na wielkie:
VAR NAPIS : STRING[10];
{deklarowanie zmiennej NAPIS typu string o d艂ugo艣ci 10 znak贸w}
BEGIN
FOR I:=1 TO LENGTH(NAPIS) DO
NAPIS[I]:=UPCASE(NAPIS[I]);
END;
Typ wyliczeniowy
Typ wyliczeniowy definiuje zbi贸r identyfikator贸w oznaczaj膮cych poszczeg贸lne warto艣ci przez ich wyliczenie. Pierwszy identyfikator ma warto艣膰 0, kolejny 1 itd. Przyk艂ad:
TYPE TTydzien=(Niedziela, Poniedzialek, Wtorek, Sroda, Czwartek, Piatek, Sobota);
Typ znakowy
Typ znakowy okre艣la zbi贸r znak贸w. W zmiennej tego typu mo偶na zatem zapami臋ta膰 kod ASCII jednego znaku.
TYPE TZnak=CHAR;
Typ logiczny
Typ logiczny jest typem wyliczeniowym, kt贸ry mo偶e przyj膮膰 tylko dwie warto艣ci: FALSE, wtedy warto艣膰 porz膮dkowa wynosi 0 (fa艂sz) i TRUE warto艣膰 porz膮dkowa jest wi臋ksza ni偶 0 (prawda). Istniej膮 cztery podtypy:
TYP ROZMIAR W BAJTACH
---------------------------
Boolean 1
ByteBool 1
WordBool 2
LongBool 4
Typ proceduralny
J臋zyk Turbo Pascal traktuje procedury i funkcje jako elementy j臋zyka, kt贸re mo偶na przywi膮zywa膰 do zmiennych i przesy艂a膰 jako parametry. Przyk艂adowa deklaracja typu proceduralnego mo偶e wygl膮da膰 tak:
TYPE
A=Procedure;
B=Procedure(a:Byte);
C=Function(A:Byte):CHAR;
Zmienne typu proceduralnego nie mog膮 by膰 zwracane przez funkcj臋.
Typ okrojony
Typ okrojony okre艣la podzbi贸r dowolnego typu porz膮dkowego lub wyliczeniowego. Jest on ograniczony pewnym zakresem. Wykorzystywany jest do okre艣lania typu zmiennych, kt贸re mog膮 przyj膮膰 warto艣ci ze 艣ci艣le okre艣lonego przedzia艂u, np.
TYPE TRok=1990..1999;
VAR a : TRok;
Teraz zmienna "a" mo偶e przyj膮膰 warto艣ci od 1990 do 1999.
Typ wska藕nikowy
Typ wska藕nikowy pozwala na okre艣lenie zmiennych, za pomoc膮 kt贸rych b臋dziemy mogli odwo艂ywa膰 si臋 od pewnych obszar贸w pami臋ci operacyjnej. Istniej膮 nast臋puj膮ce deklaracje typu wska藕nikowego:
TYPE
Wsk_1 = ^Typ_podstawowy;
Wsk_2 = Pointer;
Wsk_3 = PChar;
Wi臋cej informacji znajdziesz w oddzielnym artykule Zmienne dynamiczne.
Typ tablicowy
Typ ten okre艣la tablic臋 sk艂adaj膮c膮 si臋 ze sta艂ej liczby element贸w. Wszystkie elementy tablicy musz膮 by膰 r贸wnie偶 okre艣lonego typu. Do ka偶dego elementu odwo艂ujemy si臋 poprzez indeks podawany w nawiasach kwadratowych i okre艣laj膮cy pozycj臋 danego elementu. Ka偶da tablica mo偶e by膰 wielowymiarowa. Przyk艂adowa deklaracja tablicy 100 znak贸w mo偶e wygl膮da膰 nast臋puj膮co:
Nazwa_tablicy : ARRAY[1..100] of Char;
S艂owo kluczowe ARRAY, s艂u偶y w艂a艣nie do definiowania tablic. Na ko艅cu tej definicji, typ Char oznacza, 偶e ka偶dy element tej tablicy jest typu Char, czyli jest to znak. By zmieni膰 trzeci element tablicy mo偶emy napisa膰 tak:
Nazwa_tablicy[3]:='K';
Ka偶d膮 tablic臋 mo偶na przedstawi膰 w postaci tabeli. By stworzy tablic臋, w kt贸rej zapami臋taliby艣my tabliczk臋 mno偶enia do 10, mogliby艣my napisa膰:
Mnozenie : Array[1..10,1..10] of Word;
Powy偶sza deklaracja tworzy tablic臋, kt贸r膮 graficznie mo偶na przedstawi膰 jako tabel臋 o 10 wierszach i 10 kolumnach.
Pami臋膰 potrzebna na utworzenie danej tablicy mo偶na obliczy膰 mno偶膮c ilo艣膰 jeje element贸w i sum臋 bajt贸w zajmowanych przez jeden z nich. Cz臋sto nie s膮 to liczby ma艂e. Trzeba wi臋c pami臋ta膰 o pewnych ograniczeniach. Ko偶ystaj膮c z kompilatora Turbo Pascal mo偶emy zadeklarowa膰 tablic臋 zajmuj膮c膮 nie wi臋cej ni偶 64 KB! Chc膮c utworzy膰 struktur臋 wi臋ksz膮 od tej nale偶y albo u偶y膰 innego kompilatora (np. TMT), albo skorzysta膰 ze sztuczki opisanej w FAQ.
Typ rekordowy
Opisuje z艂o偶on膮 struktur臋 danych. Taka struktura sk艂ada si臋 z pewnej liczby p贸l. Ka偶de z nich jest 艣ci艣le okre艣lonego typu. Definicj臋 rekordu zamieszcza si臋 mi臋dzy s艂owami kluczowymi RECORD i END;.
Przyk艂adowo by zapami臋ta膰 dane o pracownikach w jakiej艣 firmie, u偶ywaj膮c samej definicji tablicy by艂oby to bardzo trudne, lub nawet niemo偶liwe. U偶ywaj膮c tablicy typu X, gdzie X jest typem rekordowym, wykonanie powy偶szego zadania jest bardzo proste:
TYPE
Osoba = RECORD
Imie : String[10];
Nazwisko : String [20];
Wiek : Byte;
END;
VAR Ludzie : Array[1..1000] of Osoba;
Do odczytania informacji zapisanych w danym polu rekordu u偶ywa si臋 kropki ("."). np.:
Writeln(Ludzie[10].imie);
Ludzie[11].nazwisko:='Nowak';
Je艣li chcemy np. poda膰 wszystkie dane osoby nr. 2 mo偶na napisa膰:
WITH Ludzie[2] DO
BEGIN
Imie:='Jan';
Nazwisko:='Nowak';
Wiek:=20;
END;
Mo偶na r贸wnie偶 deklarowa膰 rekordy z wariantami o zmiennej strukturze. Rekord taki zawiera specjalne pole, kt贸rego warto艣膰 decyduje o wyborze wariantu uk艂adu p贸l w zmiennej cz臋艣ci rekordu. Pole to nazywa si臋 wyr贸偶nikowym. Rekord wariantowy zajmuje obszar pami臋ci potrzebny do zapami臋tania rekordu o najd艂u偶szej cz臋艣ci wariantowej. Jednak odmiennie interpretuje dane r贸偶nych wariant贸w. Przyk艂adowy rekord z wariantem:
TYPE Osoba = RECORD
Imie : String[10];
Nazwisko : String[20];
Case Stan_cywilny OF
samotny : ();
zonaty : (Data_slubu : String[10]);
rozwiedziony : (Data_slubu : String[10];
Data_rozw : String[10]);
Pole wariantowe musi by膰 ostatnim polem rekordu.
Typ obiektowy
Typ obiektowy opisuje z艂o偶on膮 struktur臋 danych. Sk艂ada si臋 ona z p贸l, podobnie jak struktura rekordu, oraz tzw. metod, czyli operacji wykonywanych na obiekcie. Definicja obiektu rozpoczyna si臋 s艂owem OBJECT, i ko艅czy END;. Ma nast臋puj膮c膮 budow臋:p/p]
OBJECT (dziedziczno艣膰)
Pole : Typ;
Pole : Typ;
..
..
Metoda;
Metoda;
END;
[p]Obiekty i ca艂e programowanie OOP - to bardzo rozleg艂a dziedzina, dlatego po wi臋cej informacji na ten temat zajrzyj do artyku艂u zatytuowanego Object Pascal.
Typ zbiorowy
Typ ten okre艣la zbi贸r pot臋gowy, kt贸rego elementy s膮 typu porz膮dkowego. Przez zbi贸r pot臋gowy nale偶y rozumie膰 zbi贸r wszystkich mo偶liwych podzbior贸w warto艣ci typu porz膮dkowego, w艂膮czaj膮c w to zbi贸r pusty. Definicja tego typu jest nast臋puj膮ca:
Typ_zbiorowy = SET OF Typ;
np.:
TYPE
Litery = SET OF 'a'..'z';
Cyfry=SET OF '0'..'9';
Teraz zmienne typu Cyfry mog膮 przyjmowa膰 tylko warto艣ci od '0' do '9'.
Na zbiorach mo偶na wykonywa膰 nast臋puj膮ce operacje:
+ - dodawanie
- - odejmowanie
* - mno偶enie (iloczyn zbior贸w)
IN - sprawdzanie przynale偶no艣ci
= - sprawdzanie r贸wno艣ci
<=,>= - sprawdzanie relacji inkluzji zbior贸w
Typ plikowy
Typ ten okre艣la zbi贸r danych sekwencyjnych o zmiennej liczbie element贸w tego samego typu. Elementy sk艂adowe nie mog膮 by膰 typu plikowego oraz typu, kt贸ry zawiera w sobie deklaracje typu plikowego.
Og贸lna posta膰 definicji typu plikowego jest nast臋puj膮ca:
Plik_1 : FILE OF Typ_podstawowy;
Plik_2 : FILE;
Plik_3 : Text;
np.:
VAR Plik : FILE OF Byte;