Rozdział 4. • Zagadnienia trudniejsze 115
program cw4_23;
{ Program pokazujący działanie funkcji obliczającej }
{ liczbę elementów w zbiorze liter. }
{ Katalog r4_05 : 4_23.pas }
uses
Crt;
TLitery - set of Char; var
Litery, Samogłoski, Spółgłoski : TLitery;
function Moc (S : TLitery) : Byte;
{ Funkcja oblicza liczbę elementów zbioru typu }
{ TLitery. }
var
Znak : Char;
I : Byte;
begin
I 0;
for Znak Low(Char) to High(Char) do if (Znak in S) then I 1+1;
Moc I;
end; {----------------------------------- Moc -}
begin
ClrScr;
Litery ['a'..'z', 'A'..'Z'];
Samogłoski ['a', 'e', 'i', ’o', 'u', 'y' ,
'A', -E', 'I', '0’, 'U', 'Y'];
Spółgłoski Litery - Samogłoski;
Writeln ('Liczba elementów w zbiorze Litery: ',
Moc (Litery));
Writeln ('Liczba elementów w zbiorze Samogłoski: ',
Moc (Samogłoski));
Writeln ('Liczba elementów w zbiorze Spółgłoski: ',
Moc (Spółgłoski));
Writeln ('Liczba elementów w zbiorze przykładowym: ',
Moc (['a'..'e', 'z']));
Readln; end.
Wyjaśnienia wymagają dwie nowe funkcje: Low i High. Podają odpowiednio najmniejszą i największą wartość typu porządkowego, który stanowi ich argument. Pętla for I := Low (Typ) to High (Typ) do zostanie wykonana zatem dla wszystkich wartości, które może przyjmować zmienna typu Typ. Dla każdej takiej wartości sprawdzamy, czy jest elementem zbioru i jeżeli jest, zwiększamy licznik. Oto cała tajemnica. Nie muszę chyba dodawać, że funkcja nie jest bardzo uniwersalna — oblicza jedynie liczebność elementów zbioru typu TLitery. Dla zbiorów innego typu musimy napisać kolejne funkcje, nie zapominając o zmianie typu w wywołaniach funkcji Low i High.
Często będziemy wykorzystywać typ zbiorowy dla sprawdzenia, czy wczytany znak należy do zbioru wartości akceptowalnych. Załóżmy, że chcemy wczytać wartość dla typu wyliczeniowego. Każdej możliwej wartości przypisujemy literę, wypisujemy użytkownikowi menu i czekamy na wciśnięcie odpowiedniego znaku. Dużo łatwiej będzie nam sprawdzić, czy litera należy do zbioru liter dopuszczalnych, niż kolejno porównywać z dopuszczalnymi literami.