Zadeklaruj sobie stałe przechowujące zbiory znaków – dzięki temu kod będzie czytelny, a i łatwiej będzie je określić:
const
CHARSET_DIGITS = ['0' .. '9'];
CHARSET_PUNCTUACIONS = ['.', ',', ':', ';', '!', '?', '-'];
CHARSET_VOWELS = ['a', 'e', 'i', 'o', 'u', 'y'];
CHARSET_CONSONANTS = ['a' .. 'z'] - CHARSET_VOWELS;
CHARSET_LETTERS = CHARSET_VOWELS + CHARSET_CONSONANTS;
Teraz wystarczy w pętli iterować po znakach wejściowego ciągu i sprawdzać czy bieżący znak znajduje się w danym zbiorze. Można to zrobić za pomocą operatora in
:
uses
SysUtils;
var
Text: String;
Character: Char;
begin
{..}
Text := Text.ToLower();
for Character in Text do
if Character in CHARSET_DIGITS then
// doliczamy cyferkę
else if Character in CHARSET_VOWELS then
// doliczamy samogłoskę
else if Character in CHARSET_CONSONANTS then
// doliczamy spółgłoskę
else if Character in CHARSET_PUNCTUACIONS then
// doliczamy znak interpunktyjny
;
end.
Masz jeszcze wyłonić literkę najczęściej występującą w ciągu znaków, więc przyda się tablica z licznikami dla każdej literki. Na końcu pętli sprawdzasz czy bieżący znak znajduje się w zbiorze znaków liter i inkrementujesz jej licznik. Przykład:
type
TLetters = array ['a' .. 'z'] of Integer;
var
Letters: TLetters;
begin
{..}
for Character in Text do
begin
if Character in CHARSET_DIGITS then
// tu reszta drabinki
if Character in CHARSET_LETTERS then
Letters[Character] += 1;
end;
end.
Na koniec wystarczy przeiterować po tablicy Letters
i znaleźć licznik o największej wartości.