Definice datových typů
Jazyk TP vyžaduje, aby každá proměnná, kterou chceme v programu použít, měla předem určeno, zda se do ní bude ukládat celé číslo, desetinné číslo, text, logická hodnota apod. Za tímto účelem byla v programu zavedena deklarační část a byla zavedena určitá klíčová slova, která nám umožňují jednoznačně určit tzv. datový typ.
Datový typ proměnné pak určuje:
množinu hodnot, kterých může proměnná nabývat během programu
množinu operací, které lze s touto proměnnou provádět
Datové typy se dělí několika způsoby
standardní (celočíselný, reálný, char, string, boolean)
definované uživatelem (vyjmenovaný typ, typ interval, pole, záznam, množina, soubor, ukazatel)
ordinální (integer, word, char...)
neordinální (string, real, pointer...)
jednoduché - nemají vnitřní strukturu, s proměnnou lze pracovat jako s celkem (integer, char, real...)
strukturované - hodnoty mají vnitřní strukturu (členění na komponenty), s proměnnou strukt. typu lze pracovat buď jako s celkem nebo s jeho jednotl. komponenty (array, file, record...)
Standardní datové typy
Celočíselné datové typy
Hlavním reprezentantem celočíselných datových typů je typ integer. Turbo Pascal definuje rozsah -32768 až 32767. Proměnné typu integer jsou standardně uloženy na dvou byte. Turbo Pascal rozšiřuje základní celočíselný datový typ integer o další čtyři typy, které se liší rozsahem hodnot:
- shortint (-128...127 - 1 byte)
- longint (-2147483648...2147483647 - 4 byte)
- word (0...65535 -2 byte)
- byte (0...255 - 1 byte)
Dovolené operace (množina operací)
a) aritmetické: +, -, *, /, DIV, MOD (výsledkem po dělení "/" je typ real)
b) relační: =, <>, >, >=, <, <=
Standardní funkce
SQR (X) = X2
SQRT (X) = odmocnina (výsledek je typu real)
ABS (X) = absolutní hodnota
INC (X) - zvětší proměnnou o 1
DEC (X) - sníží proměnnou o 1
Předdefinované konstanty (není je třeba deklarovat v deklarační části)
MAXINT = 32767 - největší číslo, které můžeme uložit do proměnné typu integer
MAXLONGINT = 2147483647 - největší číslo, které můžeme uložit do proměnné typu longint
Desetinné číselné datové typy
Základním reprezentantem desetinných datových typů je typ real. Používá se pro vyjádření hodnot s pohyblivou řádovou čárkou. Rozsah hodnoty typu real závisí na překladači, v TP se definuje na šesti byte s jedenácti číslicemi mantisy a s rozsahem exponentu 10-38 až 10+38.
Další typy: single (4 byte), double (8 byte), extended (10 byte).
Zápis čísla typu real obsahuje:
- číslice 0..9
- znaménko + nebo -
- desetinnou čárku nebo znak "E"
Dovolené operace
a) aritmetické: +, -, *, / (operace DIV a MOD nelze použít)
b) relační: =, <>, >, >=, <, <=
Standardní funkce
SQR (X), SQRT (X), ABS (X), SIN (X), COS (X), LN (X), EXP (X)
ROUND (X) - převod z typu real na celočíselný (zaokrouhlování)
TRUNC (X) - převod z typu real na celočíselný (odseknurí desetinné části)
Předdefinovaná konstanta
PI (3,1412...)
Do proměnné typu real lze přiřadit proměnnou typu integer ne však naopak.
Logické datové typy
Stndardním logickým datovým typem je typ boolean, který se používá k vyjádření logických hodnot a má pouze dvě možné hodnoty:
True pro stav pravda,
False pro stav nepravda.
Datovému typu boolean v programu lze přiřadit buď konkrétní hodnotu True nebo False, případně výsledek vyhodnocení logického výrazu (nelze přiřadit hodnotu pomocí readln, read apod.). Logické výrazy najdou uplatnění zejména v podmíněných příkazech, příkazech cyklu apod. Logický výraz se skládá z operátorů relačních nebo logických (ne aritmetických):
Relační operátory: =, <>, >, >=, <, <=
Logické operátory: NOT, AND, OR, XOR
Datový typ znak - char
Jednotlivé znaky, datový typ char, se vyjadřují zobrazitelnou reprezentací ohraničenou apostrofy, například ´A´. Druhou variantou je vyjadřování znaků pomocí ASCII kódu znaku, kterému musí předcházet znak #. Při práci s typem znak si musíme uvědomit rozdíl mezi ASCII reprezentací malých a velkých písmen. Například:
#65 ´A´ je vyjádření písmene A
Znaky s kódy 0 až 31 (včetně) dekadicky se nazývají řídicí, protože se původně používaly k řízení dálnopisných operací; nyní se používají pro řízení některých funkcí výstupního zařízení. Řídící znaky nelze generovat z klávesnice počítače přímo, ale lze uvádět kódem ASCII s předponou #. Například znak s kódem ASCII 7 (bell) lze vyjádřit:
#7 nebo CHR(7)
Typ znak se v paměti ukládá na jednom byte.
Množina hodnot: do proměnné typu char můžeme uložit všechny znaky ASCII tabulky (256 znaků)
Množina operací: pouze relační operace - =, <>, >, >=, <, <=
Standardní funkce
ORD(X) - funkce vrací číslo (pořadí) znaku v ASCII tabulce (ORD(´A´) - vrátí hodnotu 65)
CHR(X) - opačná funkce k ORD - funkce vrátí znak. který odpovídá danému číslu v ASCII tabulce
UPCASE(X) - funkce převádí malé písmeno na velké, pokud je v argumentu jiné, než malé písmeno, zůstává beze změny - výraz X je typu char
Datový typ řetězec - string
Řetězec, datový typ string, je posloupnost znaků ohraničená apostrofy. Maximální délka řetězce je 255 znaků.
´ABCD123´ je řetězec délky 7
Délku řetězce zjistíme pomocí funkce LENGTH. V paměti je řetězec uložen na tolika byte, kolik znaků řetězec obsahuje, plus jeden. V nultém byte řetězce je uložena skutečná délka řetězce, která udává, kolik znaků řetězec obsahuje, počítáno od prvního (nikoli od nultého). Když deklarujeme proměnnou typu řetězec na určitou délku a skutečný obsah řetězce je menší, paměť je vyhrazena pro deklarovanou délku řetězce, ale platné jsou pouze naplněné znaky. Platí, že:
ORD(RETEZEC[0]) = LENGTH(RETEZEC) {délka řetězce je v nultém byte řetězce}
V programu můžeme provést obecnou deklaraci typu řetězec buď s uvedením maximální délky nebo bez uvedení délky, pak má řetězec délku 255. S řetězci lze v programech pracovat jako s poli znaků, nultý byte pole vždy obsahuje údaj, který vyjadřuje skutečnou délku řetězce.
Příklad
var
S1:string; {délka řetězce se předpokládá 255 znaků}
S2:string[10]; {délka řetězce je 10 znaků}
S proměnnou typu string lze pracovat jako s poli znaků:
S:=´Ahoj´; {S[1]=´A´, S[2]=´h´, S[3]=´o´...}
Velice často se v programech používá tzv. prázdný řetězec, který mezi apostrofy neobsahuje nic. Pokud chceme do řetězce vložit znak apostrof, musíme uvést dva bezprostředně následující apostrofy. Do řetězců se mohou vkládat i řídící znaky, vyjádřené jejich ASCII hodnotou, kterou předchází znak #.
Strukturovaný typ pole
Pro zpracování více hodnot stejného typu se v TP používá strukturovaná proměnná typu pole. Pole reprezentuje posloupnost hodnot stejného typu.
Celá struktura pole se jmenuje A a dělí se na části - prvky pole. Prvky pole označujeme názvem pole a indexem prvku v hranatých závorkách. V tomto případě jsou indexy přirozená čísla od 1 do 100 a platí:
A[1]=5 - první prvek pole A
A[2]=3 - druhý prvek pole A
. . .
A[100]= -1 - poslední prvek pole A
Typ pole, array, má pevně stanovený počet složek stejného typu. Při definici typu pole se určuje rozměr pole a typ složek. Rozměr pole určuje, kolik prvků se může do pole vložit, a uvádí se v hranatých závorkách. Typ složky pole se určuje identifikátorem typu za spojkou of, například:
var
pole:array[1..5,1..5] of byte;
V uvedeném příkladu se jedná o deklaraci dvourozměrného pole 5x5 prvků typu byte. Další příklad:
var
pole:array[1..100] of real;
deklarace jednorozměrného pole, do kterého se může vložit 100 prvků typu real.
Typem složky pole může být opět pole nebo libovolný jiný strukturovaný typ, kromě typu soubor. Velikost pole je omezena paměťovými nároky na 65 535 byte.
Ordinální datové typy
Ordinální datové typy patří do kategorie jednoduchých typů. Obecně jednoduché datové typy definují uspořádání množiny hodnot. Ordinální typy mají navíc následující vlastnosti:
Turbo Pascal má sedm předdefinovaných ordinálních typů:
integer - celá čísla od -32468 do 32767
char - jednotlivé znaky, symboly a číslice (ordinální hodnoty od 0 do 255)
boolean - logické hodnoty, které mohou nabývat jedné ze dvou možných hodnot (true, false)
longint - celá čísla v rozsahu -2147483648 do 2147483647
shortint - celá čísla, uložená na jednom byte (-128 až 127)
word - celá kladná čísla, uložená na dvou bytech (0 až 65535)
byte - celá kladná čísla, uložená na jednom byte (0 až 255)
Kromě toho lze použít další uživatelem definované ordinální typy, výčtový typ a typ interval.