Údajové typy
Údajový typ špecifikuje určitú množinu, ktorej prvky sa nazývajú hodnotami daného typu a vymedzuje množinu operácií s týmito hodnotami. Jednotlivé údajové typy sa od seba odlišujú, no zároveň tvoria istú hierarchiu (viď obr. 33).
Údajový typ priraďujeme premenným v deklaračnej časti (var) a vyberáme ho podľa toho, akého druhu je premenná (celé číslo, reálne číslo, znak, text,...) a aký povolený rozsah hodnôt premenná nadobúda.
Jednoduché údajové typy sú charakteristické usporiadanou množinou hodnôt, ktoré sú z hľadiska prípustných operácií nedeliteľné. Možno ich ešte ďalej rozdeliť na:
ordinálne - integer, boolean a char, interval, typ definovaný vymenovaním hodnôt
neordinálne - real.
Ak je údajový typ ordinálny vždy vieme, aká hodnota nasleduje alebo predchádza súčasnej hodnote. Napríklad majme celé čísla a hodnotu 5. S istotou vieme, že predchádzajúca hodnota je 4 a nasledujúca je 6. To isté platí napríklad aj v abecede, kde sú znaky vždy usporiadané v rovnakom poradí.
Neordinálne typy sú presný opak, pretože pre žiadnu hodnotu takéhoto typu nevieme povedať, čo jej predchádza a čo po nej nasleduje. Príkladom takýchto čísel sú práve reálne čísla, napríklad 5,5 - nevieme s istotou určiť, či za ním nasleduje číslo 5,51 alebo 5,511, či 5,5111, atď.
Spoločnou vlastnosťou ordinálnych údajových typov je, že sú pre ne definované funkcie (obr. 34)
Ord - poradové číslo v množine hodnôt
Succ - nasledovník
Pred
- predchodca
Jednoduché údajové typy
Celočíselný údajový typ
Identifikátorom celočíselných typov je integer, pričom špecifikuje konečnú súvislú podmnožinu celých čísel. Pretože jednotlivé slová pamäte (ale aj pamäť celá) obsahujú konečný počet bitov možno v nich zobraziť iba konečný počet rôznych hodnôt. Typ integer je množina hodnôt daná intervalom [maxint, maxint], pričom maxint závisí od počítača, napr. pre staršie počítače s dĺžkou slova 16 bitov je maxint = 215 - 1 = 32767, teda interval je [-32767, 32767]. Ďalšie celočíselné typy sú:
- byte - [0, 255]
word - [0, 65535]
shortint - [-128, 127]
longint - [-2147438346, 2147438346]
Operácie
+ sčítanie < menší
- odčítanie > väčší
* násobenie = rovný
div celočíselný podiel <= menší alebo rovný
mod zvyšok po >= väčší alebo rovný celočíselnom delení <> nerovná sa
Štandardné funkcie
succ nasledovník
pred predchodca
ord poradové číslo
abs absolútna hodnota
sqr druhá mocnina
Reálne typy čísel
Identifikátorom pre reálne čísla je real a je konečnou podmnožinou reálnych čísel závislou na prekladači s rozsahom [10-38, 1038]. Reálne čísla zapisujeme buď v desatinnom, alebo semilogaritmickom tvare. Zápis čísla v semilogaritmickom tvare pozostáva z mantisy (desatinná časť logaritmu) a exponentu (mocniteľ alebo odmocniteľ), ktoré sú navzájom oddelené písmenom E s významom "krát 10 na".
Zápis má teda tvar: mantisaEexponent s významom "mantisa*10exponent". Mantisa môže byť celé alebo reálne číslo v desiatkovom tvare, exponent môže byť celé alebo reálne číslo v desiatkovom tvare
Rozšírené podtypy typu real
- single - [1.5*10-45,
3.4*10+38]
- double - [5.0*10-324, 1.7*10]
- comp - [-2-63+1, 2+63- 1]
Operácie
+ sčítanie < menší
- odčítanie > väčší
* násobenie = rovný
/ delenie <= menší alebo rovný
>= väčší alebo rovný
<> nerovná sa
Štandardné funkcie
abs absolútna hodnota
trunc celá časť reálneho čísla
sqrt druhá odmocnina
sqr druhá mocnina
round zaokrúhlenie
ln prirodzený logaritmus
exp exp(x) = ex
Logický typ
Identifikátorom pre logický typ je boolean špecifikujúci množinu logických hodnôt, ktoré sa označujú preddefinovanými identifikátormi true a false (true a false sú teda štandardnými identifikátormi konštánt typu boolean). Ako každá množina hodnôt jednoduchých typov, aj množina logických hodnôt je usporiadaná, a to tak, že platí false < true.
Údajovému type boolean môžeme priradiť buď konkrétnu hodnotu (true alebo false), alebo výsledok nejakého logického výrazu (výraz sa vyhodnotí a ak je pravdivý nadobudne hodnotu true, v opačnom prípade false).
Operácie
and logický súčin < menší
or logický súčet > väčší
not logická negácia = rovný
<= menší alebo rovný
>= väčší alebo rovný
<> nerovná sa
Štandardné funkcie
succ nasledovník
pred predchodca
ord poradové číslo
Pre správne používanie operácií treba vysvetliť, čo je ich výsledkom (obr. 35):
Znakový údajový typ
Identifikátorom typu znak je char, označujúci množinu typografických znakov, ako sú písmená, číslice, interpunkčné znamienka a pod., ktoré sa vyjadrujú zobraziteľnou reprezentáciou ohraničenou apostrofmi (napr. 'a', 'A', '?',...). Druhým, menej častým, variantom je vyjadrenie znaku pomocou ASCII (American Standard Code for Information Interchange) kódu, ktorému predchádza znak mriežky # a tieto znaky sú uložené v ASCII tabuľke. Pôvodne obsahovala 128 znakov anglickej abecedy, no po pridaní národných symbolov má 255 znakov.
Operácie
< menší
> väčší
= rovný
<= menší alebo rovný
>= väčší alebo rovný
<> nerovná sa
Štandardné funkcie
succ nasledovník
pred predchodca
ord poradové číslo
upcase zmena malého písmena na veľké písmeno, ak je písmeno veľké, nič sa nemení
Typ interval
Identifikátor typu interval určuje programátor. Interval je typ, ktorý špecifikuje neprázdnu súvislú podmnožinu hodnôt nejakého ordinálneho typu. Dolnú a hornú hranicu podmnožiny udávajú dve konštanty daného ordinálneho typu (zadávame v definícií), ktoré sa v tomto poradí uvádzajú v popise typu interval.
Výhodou definovania
vlastných údajových typov je použitie hodnôt typu,
ktoré objekt nadobúda v reálnom prostredí.
Tiež získavame výhody spojené s kontrolou, či objekt nadobúda hodnoty
daného typu, teda prípustné hodnoty, napríklad v slovných úlohách
Operácie
< menší
> väčší
= rovný
<= menší alebo rovný
>= väčší alebo rovný
<> nerovná sa
Štandardné funkcie
succ nasledovník
pred predchodca
ord poradové číslo
chr hodnotou chr(i) je
znak, ktorého hodnota ordinálneho čísla je i
Typ definovaný vymenovaním hodnôt
Identifikátor vymenovaného typu definuje programátor. Vymedzenie definície údajového typu definovaného vymenovaním hodnôt .vychádza z jednoznačného určenia hodnôt tohto údajového typu. Programátor môže definovať lineárne zoskupenie hodnôt, ktoré sú usporiadané pomocou identifikátorov.
Použité identifikátory sú pre daný program chápané ako konštanty vymenovaného typu, do ktorého patria. Každá použitá konštanta má v identifikácii priradené číslo, ktoré zodpovedá jej poradiu pri definícii typu. Prvý identifikátor má hodnotu 0, druhý 1, atď. Pri deklarácii premenných vymenovaného typu je nutné použiť klauzulu (dodatok) type, napr.:
type tyzden = (pon, ut, str, stv, pia, so, ne);
Premenné tohto typu budú môcť nadobúdať hodnotu len z tohto zoznamu konštánt.
I keď tento údajový typ patrí medzi štandardné jednoduché údajové typy, nevyužíva sa tak často v programovaní samostatne. Väčšinou ho môžeme použiť v spojení s údajovým typom množina (viď nižšie). Aj napriek tomu ho môžeme zaradiť medzi jednoduché údajové typy.
Operácie
< menší
> väčší
= rovný
<= menší alebo rovný
>= väčší alebo rovný
<> nerovná sa
Štandardné funkcie
succ nasledovník
pred predchodca
ord poradové číslo
chr hodnotou chr(i) je
znak, ktorého hodnota ordinálneho čísla je i
Štruktúrované údajové typy
Typ množina
Osobitné miesto medzi údajovými typmi má typ množina, ktorá môže obsahovať také hodnoty, ktorými sú zase množiny. (umožňuje pracovať s niektorými typmi množín podobným spôsobom, ako je to obvyklé v matematike). V Lazaruse, resp. v Pascale, je povolené vytvárať množiny zložené len z prvkov rovnakého ordinálneho typu - hovoríme mu bázový (základný) typ.
Môžeme vytvoriť množinu znakov, čísel, dní v týždni,
ale. nemôžeme vytvoriť takú množinu, ktorá by obsahovala napr. čísla a znaky
súčasne. Definícia údajového typu množina je vždy tvorená aj z definíciou jej
bázového typu, napr.:
type
Mnozina = set of 1...100;
var
a, b: Mnozina;
Do premenných a, b môžeme priraďovať iba množiny, môžeme s nimi manipulovať pomocou množinových operácií a relácií - nemôžeme ich priamo vypísať alebo prečítať do/zo súboru, musíme si to naprogramovať.
Operácie
+ zjednotenie < menší
- rozdiel > väčší
* prienik = rovný
in existencia prvku v množine <= menší alebo rovný
>= väčší alebo rovný
<> nerovná sa
Typ Pole
Pole patrí medzi štruktúrované údajové typy, pričom každý jeden prvok poľa pozostáva z pevného počtu zložiek rovnakého typu, teda hovoríme o homogénnom údajovom type). Prvky poľa môžu byť ľubovoľného štandardného alebo vopred definovaného typu.
Každú zložku možno presne pomenovať pomocou indexu. Indexy ("pozícia" daného prvku v poli) nadobúdajú hodnoty určitého typu, ktorý musí byť ordinálny. Nazývame ho typom indexu. Cez tento index máme priamy prístup k jednotlivým prvkom poľa. Typ pole definujeme nasledovne:
type
Pole = array [typ indexu] of typ_prvkov;
Polia môžu byť jedno- a viacrozmerné.
- Jednorozmerné pole je rad rovnakých vlastností, ktoré sú popísané
jedným identifikátorom (názvom poľa). Niekedy ich nazývame aj vektory.
- Dvojrozmerné pole sa
dá inak nazvať aj tabuľka, či matica. Hovoríme, že
dvojrozmerné pole je aj vektor vektorov alebo pole jednorozmerných polí.
Keď zadeklarujeme (vytvoríme) pole, neobsahuje
žiadne prvky. Tie musíme najskôr pridať, teda pole musíme "naplniť". Realizuje
sa to pomocou príkazu priradenia (napr. a[20] := 10). Ak nejakú časť v poli, ktorá .už hodnotu má priradenú, naplníme opätovne, tak jeho pôvodná hodnota sa zmení na novú, t.
j. pôvodná hodnota sa prepíše.
Typ Reťazec znakov
Reťazec znakov je postupnosť znakov (uzavretá v apostrofoch), ktorého identifikátorom je string. Tento údajový typ je zavedený špeciálne v jazyku Pascal, ktorý poskytuje procedúry a funkcie pre prácu s týmto údajovým typom. Maximálna dĺžka reťazca je 255 znakov. V pamäti počítača je reťazec uložený v toľkých bajtoch, koľko je jeho dĺžka, plus jeden. V nultom bajte reťazca je uložená skutočná dĺžka reťazca - koľko znakov reťazec obsahuje (nultý sa neráta). Pri deklarácii typu string môžeme uviesť aj maximálnu dĺžku slova v (hranatých) zátvorkách [ ].
Operácie
< menší
> väčší
= rovný
<= menší alebo rovný
>= väčší alebo rovný
<> nerovná sa
Štandardné funkcie
Lenght(S) zistí aktuálnu dĺžku reťazca (S je reťazec)
Concat(S1, S2) spojí dva reťazce
Copy(S, I, Maxint) vyberie podreťazec z reťazca (I je pozícia, z ktorej začíname vyberať a Maxint určuje, koľko znakov vyberáme)
Delete(S, I, Maxint) zruší podreťazec v reťazci (v tomto prípade Maxint určuje, koľko znakov rušíme)
Insert(S, S1, I) vloží podreťazec do reťazca (S je reťazec, ktorý vkladáme, S1 je reťazec, do ktorého vkladáme, I určuje, od ktorého znaku chceme vkladať)
Pos(S) zistí
pozíciu podreťazca v reťazci
Typ Záznam
Jednou zo základných metód vytvárania štruktúrovaných údajov je spojenie niekoľkých zložiek rôzneho typu do komplexného celku. V matematike sú takto vytvárané štruktúry nazývané n-ticami. Takýmto celkom je napr. dátum (trojica čísel s významom deň, mesiac, rok) alebo občiansky preukaz (obsahuje položky meno, priezvisko, dátum narodenia, číslo občianskeho preukazu,...)
Identifikátorom typu záznam je record, pričom táto údajová štruktúra je nehomogénna a skladá sa z určitého počtu pomenovaných zložiek, ktoré môžu byť rôzneho typu a nazývame ich položkami záznamu. Mená a typy položiek záznamu sa špecifikujú popisom typu záznam, ktorý má tvar
record
položka 1 : tp;
položka 2 : tp;
end
kde položka i je názov i-tej položky a tp je typ položky. Položky záznamu sa definujú klasicky ako premenné, pričom k jednotlivým údajom premenných .typu záznam môžeme pristupovať pomocou selektora záznamu, ktorým je znak bodka ".". Jednotlivým položkám priraďujeme hodnoty zase pomocou príkazu priradenia
Typ Súbor
Pri práci s počítačom a údajmi je dôležité ich uchovávanie po vypnutí počítača resp. po ukončení programu. Spracované údaje musíme uložiť na externé .pamäťové médium - disk. Zápis a čítanie potrebných údajov z externých pamäťových médií nám sprostredkováva údajový typ súbor, ktorého identifikátorom je file. Ide o štruktúrovaný údajový typ, ktorý sa skladá z teoreticky neobmedzeného počtu zložiek rovnakého typu. Počet zložiek súboru je obmedzený kapacitou vonkajšej pamäte.
Od toho, akého typu je súbor závisia aj jeho vlastnosti. Súbor môže byť znakovým súborom, teda bude tvorený len znakmi, alebo celočíselným súborom, teda bude obsahovať len celé čísla. V každom okamihu spracovávania súboru je prístupná iba jedna zložka. To nám určuje ukazovateľ. Môžeme si ho predstaviť ako nejakú šípku, ktorá sa pohybuje po jednotlivých bunkách a prístupná je len tá bunka, na ktorú ukazuje.
Veľmi dôležitý je koniec súboru - end of file.
Poznáme tri typy súborov:
- Súbory bez udania typu - nie je určené,
akého údajového typu budú jeho zložky
Súbory s udaním typu - vopred je určené, akého údajového typu budú jeho zložky
Textové súbory - ide o špeciálny typ - postupnosť, ktorej zložkami sú znaky a oddeľovače riadkov