Иллюстрированный самоучитель по Turbo Pascal

Длинные строки

Четыре функции модуля Strings (StrLower, StrUpper, StrlComp и StrLIComp) используют преобразование высоты букв и работают корректно только для букв латинского алфавита (латиницы). Для русских букв эти функции можно изменить следующим образом:

{Этот модуль содержит модификацию функций стандартного
модуля Strings для работы с кириллицей (альтернативный вариант кодировки}
{$Х+}
Unit StringsR;
INTERFACE
Function LoCase(Ch: Char): Char;
Function UpCase(Ch: Char): Char;
Function StrLower(Str: PChar): PChar;
Function StrUpper(Str: PChar): PChar;
Function StrlComp(Strl, Str2: PChar): Integer;
Function StrLIComp(Strl, Str2: PChar; MaxLen: Word): Integer;
IMPLEMENTATION
Uses Strings;
Function LoCase(Ch: Char): Char;
{Преобразует латинскую или русскую букву Ch к строчной}
begin
case Ch of
'A'..'Z':LoCase: = Chr(ord('a')+ord(Ch)-ord('A'));
'A'..'П':LoCase: = Chr(ord('a')+ord(Ch)-ord('A'));
'P'..'Я':LoCase: = Chr(ord('p')+ord(Ch)-ord('P'));
else
LoCase: = Ch
end
end;
{-------------------}
Function UpCase(Ch: Char): Char;
{Преобразует латинскую или русскую букву Ch к заглавной}
begin
case Ch of
'a'..'z': UpCase: = Chr(ord('A')+ord(Ch)-ord('a'));
'a'..'n': UpCase: = Chr(ord('A')+ord(Ch)-ord('a'));
'p'..'я': UpCase: = Chr(ord('P')+ord(Ch)-ord('p'));
else
UpCase: = Ch
end
end;
{-------------}
Function StrLower(Str: PChar): PChar;
{Преобразует латинские и русские буквы строки Str к строчным}
var
k: Word;
begin
for k: = 0 to StrLen(Str)-1 do
Str[k]: = LoCase(Str[k]);
StrLower: = Str
end;
{-----------}
Function StrUpper(Str: PChar): PChar;
{Преобразует латинские и русские буквы строки Str к заглавным}
var
k: Word;
begin
for k: = 0 to StrLen(Str)-1 do
Str[k]: = UpCase(Str[k]);
StrUpper: = Str
end;
{------------}
Function StrlComp (Str1, Str2: PChar): Integer;
{Сравнивает две строки, игнорируя возможную разницу в высоте латинских или русских букв}
var
k: Word;
Max: Word;
begin
{Определяем максимальное количество сравниваемых символов как минимум длин строк}
Мах: = StrLen(Str1);
if StrLen (Str2).<Max then
Max: = StrLen(Str2);
{Проверяем символы до первого несовпадения.Буквы преобразуем к заглавным}
for k: = 0 to Max-1 do
if UpCase(Strl[k])<>UpCase(Str2[k]) then
begin
{Строки не равны}
StrIComp: = ord(UpCase(StrlCk]))-ord(UpCase(Str2[k]));
Exit
end;
{Разницы нет – результат зависит от совпадения длин}
StrIComp: = StrLen(Str1)-StrLen(Str2)
end;
{--------------}
Function StrLIComp(Str1, Str2: PChar; MaxLen: Word): Integer;
{Сравнивает не более MaxLen символов строк, проверяя точное соответствие высоты букв}
var
k. Max: Word;
begin
{Определяем максимальное количество сравниваемых символов как минимум длин строк и MaxLen}
Мах: = MaxLen;
if StrLen(Strl)<Max then Max: = StrLen(Strl);
if StrLen(Str2)<Max then Max: = StrLen(Str2);
{Проверяем символы до первого несовпадения.Буквы преобразуем к заглавным}
for k: = 0 to Max do
if UpCase(Str1 [k])<>UpCase(Str2[k]) then
begin
StrLIComp: = ord(UpCase(Str1[k]))-ord(UpCase(Str2[k]));
Exit
end;
{Разницы нет. Если проверено MaxLen символов, строки считаются равными,
в противном случае результат зависит от совпадения длин строк}
if Max=MaxLen then
StrLIComp: = 0
else
StrLIComp: = StrLen(Str1)-StrLen(Str2)
end;
end.
Если Вы будете использовать этот модуль, ссылайтесь на него
в предложении Uses после ссылки на стандартный модуль Strings:
Uses Strings, StringsR,…
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.