VII.  

TYPY  VÝČET,  INTERVAL  A  MNOŽINA


Výčtové typy se používají pro prezentaci dat, nabývajících pouze malého počtu hodnot. Intervaly zužují obor hodnot svého hostitelského typu. Hodnotami množinových typů jsou množiny prvků bázového ordinálního typu.

Výčty a intervaly patří mezi jednoduché typy, množiny pak mezi typy strukturované.

VII.1. 

Typy výčet

Výčtem lze prezentovat data, která mohou nabývat malého počtu různých hodnot. Popis výčtového typu obsahuje seznam identifikátorů, přidělených deklarací jednotlivým hodnotám — konstantám typu.

Obrázek 31: Popis typu výčet

Data s malým počtem diskrétních hodnot by samozřejmě bylo možné kódovat i jinými způsoby než konstantami výčtových typů, například číselně. Deklarace výčtového typu však umožňuje typovou kontrolu operací nad jeho hodnotami (umožňuje odlišit hodnoty výčtu od čísel) a dovoluje zakomponovat do identifikátorů hodnot jejich reálný význam, což je z hlediska srozumitelnosti zdrojového textu velkým přínosem:

type Stav   = (Svobodny, Zenaty, Rozvedeny, Vdovec);
     Barva  = (Srdce, Kary, Piky, Krize);
     Rozmer = (Delka, Sirka, Hloubka);
Speciálním výčtovým typem je i standardní typ Boolean, jehož dvě hodnoty jsou reprezentovány konstantami FalseTrue:
type Boolean = (False, True);
Při malém počtu deklarovaných konstant (do 256) je velikost výčtového typu jeden byte, při větším počtu dva byty (prakticky však není účelné zavádět výčty s více než několika různými hodnotami). Každý výčtový typ je typem ordinálním, přičemž ordinální číslo uvažované hodnoty odpovídá pořadí příslušné konstanty v deklaraci výčtu — první konstanta má ordinální číslo 0, druhá 1 atd.

Operace   Ke zpracování hodnot výčtových typů lze používat pouze relační operace a ze standardních podprogramů pouze podprogramy společné všem ordinálním typům — funkce Ord, Pred, Succ a procedury DecInc. Blíže viz Ordinální typy.

Proměnné výčtového typu lze přiřadit hodnotu přiřazovacím příkazem. Výraz pak musí být typu kompatibilního vzhledem k přiřazení s typem proměnné, čili oba typy musí být identické nebo jeden musí být podintervalem druhého nebo musí být oba intervaly téhož výčtového typu (intervaly jsou popsány níže).

var Barva1, Barva2: Barva;
...
Barva1 := Srdce;
Barva2 := Succ(Barva1);
...
Standardní procedury vstupu a výstupu neobsahují konverze pro výčtové typy. Pokud mají hodnoty výčtového typu vystupovat na displej či vstupovat z klávesnice, je nutno pro ně definovat příslušné konverze vlastními silami. Například:
procedure WriteBarva (B: Barva);
{------------------------------}
begin { WriteBarva }
 case B of
  Srdce : Write('srdce');
  Kary  : Write('káry');
  Piky  : Write('piky');
  Krize : Write('kříže')
 end
end; { WriteBarva }

VII.2. 

Typy interval

Množina hodnot typu interval je neprázdnou a souvislou podmnožinou množiny hodnot zvoleného ordinálního typu — hostitelského typu intervalu — vymezenou v popisu intervalu (obrázek 32) jeho horní a dolní mezí.

Obrázek 32: Popis typu interval

Meze jsou konstantními výrazy kompatibilních ordinálních typů. Hodnota dolní meze (první výraz) musí být menší nebo rovna hodnotě horní meze. Do množiny hodnot intervalu pak náleží ty hodnoty hostitelského typu, které jsou větší nebo rovny dolní mezi a současně menší nebo rovny horní mezi.

const Pocet        = 10;
type  Index        = 1 .. 3 * Pocet;
      VelkaPismena = 'A' .. 'Z';

POZNÁMKA: Konstantní výraz, odpovídající v popisu typu interval jeho dolní mezi, nesmí začínat levou kulatou závorkou. Podle úvodní závorky totiž překladač rozpoznává popis výčtového typu.

Hostitelský typ je určen hodnotami mezí v popisu intervalu. Je-li hodnotou obou mezí znak, hostitelským typem je Char. Pokud jsou mezemi logické hodnoty, hostitelským typem je Boolean. Pro celočíselné hodnoty mezí je hostitelským typem první z typů Byte, ShortInt, Word, Integer, LongInt, jehož obor hodnot obě meze obsahuje. Jsou-li meze výčtového typu, je hostitelským typem intervalu tento výčtový typ.

Až na rozsah přípustných hodnot mají proměnné typu interval naprosto stejné vlastnosti (včetně velikosti) jako proměnné hostitelského typu intervalu a jsou pro ně definovány stejné operace — při vypnuté kontrole rozsahu (direktiva {$R–}) jsou od nich nerozlišitelné. Používají se především k indexování polí.

VII.3. 

Typy množina

Pro práci s datovými objekty množinového charakteru implementuje Turbo Pascal třídu množinových typů. Typ, uvedený v popisu typu množina (obrázek 33) — tzv. bázový typ množiny — specifikuje typ prvků množiny. Bázovým typem smí být pouze ordinální typ, jehož všechny hodnoty mají ordinální čísla z intervalu <0, 255> (maximálně tedy 256 různých hodnot). Například typy Word či ShortInt proto nemohou být bázovými typy množin, i když jsou typy ordinálními. Hodnotami deklarovaného typu jsou pak všechny množiny prvků bázového typu a prázdná množina (neobsahující žádný prvek).

Obrázek 33: Popis typu množina

V následujících příkladech je výčtový typ ZakladniBarva bázovým typem množinového typu Odstin a standardní znakový typ Char bázovým typem nepojmenovaného množinového typu proměnné Pismena:

type ZakladniBarva = (Cervena, Zelena, Modra);
     Odstin        = set of ZakladniBarva;
var  O             : Odstin;
     Pismena       : set of Char;
Hodnotami proměnné O mohou být množiny, obsahující jako prvky některé z hodnot Cervena, ZelenaModra, hodnotami proměnné Pismena mohou být množiny, jejichž prvky jsou znaky.

Konstruktor množiny   Pro přímý zápis množinových hodnot ve zdrojovém textu je jazykem definován konstruktor množiny. Z hlediska syntaktických pravidel je konstruktor množiny výrazem — smí být uveden všude tam, kde je povolen výskyt výrazu (odpovídajícího množinového typu).

Obrázek 34: Konstruktor množiny

Hodnoty v konstruktoru obsažených výrazů jsou chápány jako výčet prvků konstruované množiny. Musí být proto vzájemně kompatibilních typů, vyhovujících (i v souhrnu) požadavkům na bázový typ množiny. Pokud je konstruktor uveden v deklaraci typové konstanty, musí být výrazy konstantními.

Konstruktor [] označuje hodnotu prázdná množina, kompatibilní se všemi množinovými typy. Konstruktor [X .. Y] označuje množinu, jejímiž prvky jsou všechny hodnoty z intervalu X .. Y (pro X > Y je tedy množina [X .. Y] prázdná).

Příklady:

[Zelena, Cervena]
['A'..'Z', 'Á', 'Č', 'Ď', 'É', 'Ě', 'Í', 'Ň',
 'Ó', 'Ř', 'Š', 'Ť', 'Ú', 'Ů', 'Ý', 'Ž']
Přiřazení hodnoty   Při přiřazování hodnoty proměnné množinového typu je nutno dodržet pravidla kompatibility vzhledem k přiřazení. Ta je pro množinové typy dána kompatibilitou jejich bázových typů. Například za předpokladu platnosti deklarací
type Cislice = '0' .. '9';
var  X       : set of Cislice;
     L       : set of Char;
je přípustná i sekvence příkazů
L := ['A', '5'];
X := L
Přiřazovaná hodnota množiny je ovšem automaticky zúžena tak, aby obsahovala jen přípustné prvky, tj. hodnoty bázového typu množiny X.

Struktura množinových typů   Vnitřním tvarem množiny je posloupnost bitů, příslušejících jednotlivým hodnotám bázového typu (potenciálním prvkům množiny), v pořadí daném uspořádáním hodnot bázového typu. Hodnota 1 resp. 0 uvažovaného bitu pak označuje přítomnost resp. nepřítomnost příslušného prvku v množině.

var M: set of 'p'..'w';
...
M := ['p', 'r', 'u']
Například osmice bitů proměnné M v uvedeném fragmentu programu bude mít po provedení přiřazovacího příkazu hodnotu 10100100 — 'p' je prvkem, 'q' není, 'r' je, 's' není, 't' není, 'u' je, 'v' není a 'w' není.

Programy v Turbo Pascalu pracují vždy s celými byty, proto musí být některé množiny „zaokrouhleny“ připojením dodatečných bitů:

Například bázovým typem množiny set of 'K' .. 'Q' pak ve skutečnosti není deklarovaný interval od 'K' (ordinální číslo 75) do 'Q' (81), nýbrž jeho rozšíření podle uvedených pravidel — interval od 'H' (72) do 'W' (87). Velikost uvedeného množinového typu je tedy přesně 2 byty, nikoliv pouze 7 bitů.

Za předpokladu, že minmax jsou ordinální čísla nejmenší a největší hodnoty bázového typu množiny resp. že prv je ordinální číslo uvažovaného potenciálního prvku množiny, lze k výpočtu velikosti množiny (počtu bytů) resp. pořadí bitu prvku v množině (číslováno od nuly) použít vzorce

velikost  =  max div 8 – min div 8 + 1
pořadí bitu  =  8 . (prv div 8 – min div 8) + prv mod 8

Maximální velikost množinové proměnné vyplývá z požadavků na bázový typ. Ten musí být ordinální, s ordinálními čísly svých hodnot v rozsahu intervalu <0, 255>, takže maximální velikost množinové proměnné je 32 bytů.

Množinové operace   Turbo Pascal implementuje pro všechny množinové typy obvyklé matematické operace sjednocení, průnikrozdíl množin. Jejich operandy však mohou být pouze množiny s kompatibilními bázovými typy. Je-li ve výsledku množinové operace nejmenším prvkem X a největším prvkem Y, pak typ výsledku je set of X .. Y.

Tabulka 12: Množinové operace
operace operátor
sjednocení +
průnik *
rozdíl -
Tabulka 13: Relační operace pro množiny
operace operátor
býti rovno =
býti různo <>
býti podmnožinou <=
býti nadmnožinou >=
býti prvkem in

Relační operace   Typy množina náleží do třídy strukturovaných typů, takže pro ně nejsou definovány relace uspořádání. Jsou však definovány relace býti rovno, býti různo, býti podmnožinoubýti nadmnožinou pro operandy množinových typů s kompatibilními bázovými typy resp. relace býti prvkem, v níž levý operand je typu kompatibilního s bázovým typem množiny, která je pravým operandem relace. Typ výsledku je ve všech případech Boolean.