Vymenovaný typ (enumerated type) je taký, kde určíme všetky možné hodnoty, aké môže premenná daného typu nadobudnúť. Táto premenná bude obsahovať vždy len jednu z určených hodnôt.
Jednoduchý príklad je obyčajný cestný semafor. Môže nadobúdať tri rôzne hodnoty - červená, oranžová, zelená. Najskôr si vytvoríme typ TSemafor
. Všetky prijateľné hodnoty vymenujeme v zátvorke, oddeľujeme ich čiarkami. Býva dobrým zvykom dať pred vymenované názvy 2-3 písmená, v našom prípade „sm“ ako semafor. Zabránime tým prípadnému opakovaniu názvov, ktoré by mohlo viesť k chybám.
program vym_typ; type TSemafor = (smCervena, smOranzova, smZelena);
Teraz môžeme vytvoriť premennú Semafor.
var Semafor: TSemafor;
Nakoniec môžeme s premennou pracovať.
begin Semafor := smCervena; if Semafor = smCervena then writeln('Este nemozete ist!'); end.
Ordinálny typ je taký, ktorý má presne určené možné hodnoty a tie sú usporiadané v poradí od najmenšieho po najväčší. Každá hodnota má svoj číselný index. Ordinálne sú napríklad celočíselné typy a znak (char
). Aj vymenovaný typ je ordinálny. Ukážeme si, ako sa dá s týmito typmi pracovať.
Funkcia Ord
vráti číselný index hodnoty, ktorú jej dáme ako parameter.
writeln(Ord(smCervena));
Index prvého prvku vymenovaného typu je nula. Príklad teda vypísal nulu.
Funkcia Pred
vráti hodnotu, ktorá sa nachádza v rade hneď pred zadaným prvkom. Succ
vráti nasledujúcu možnú hodnotu.
{vypise 0, co je index smCervena} writeln(Ord(Pred(smOranzova))); {vypise 2, co je index smZelena} writeln(Ord(Succ(smOranzova)));
Asi ste si všimli, že premennú vymenovaného typu nemôžeme vypísať. Tak sme aspoň vypísali jej index.
Funkcia Low
vráti prvok s najnižším indexom, High
zasa ten s najvyšším.
writeln(Ord(Low(smZelena))); // vypise 0 writeln(Ord(High(TSemafor))); // vypise 2
Ako vidíte, funguje to nielen s premennými, ale i s typmi.
Procedúra Inc
zvýši hodnotu premennej o 1, Dec
ju zníži.
Semafor := smOranzova; Inc(Semafor); if Semafor = smZelena then writeln('Mozete prejst!');
Všetky spomínané funkcie môžeme použiť na akýkoľvek ordinálny typ.
{premenna i je typu integer} i := 20; while i >= 15 do begin writeln(i); Dec(i); end;
Príklad postupne vypisoval hodnotu premennej i a znižoval ju o 1.
Vymenovaný typ môžeme porovnávať podobne ako čísla alebo znaky.
writeln(smOranzova < smZelena); // TRUE
Indexy môžeme určiť aj manuálne:
type TProza = (prPoviedka = 5, prNovela = 10, prRoman = 15, prIne = 20);
Pri určovaní nového vymenovaného typu nemusíme vždy vypisovať všetky možné hodnoty. Stačí určiť prvý prvok, napísať dve bodky a posledný prvok.
type TBeznaProza = prPoviedka..prRoman; TDvojciferne = 10..99;
Číslo typu TDvojciferne
bude môcť nadobúdať hodnoty od 10 po 99 (vrátane).
Premenným môžeme určiť typ aj priamo:
var MalePismeno: 'a'..'z';