Песни о Паскале
Шрифт:
Delete(S, 6, 7); { ’Free forever!’ }
Сравнение строк
Мы уже сравнивали строки на равенство (вспомните проверку пароля). Но строки сравнивают и на больше–меньше — лексикографически. При этом сравниваются слева направо коды символов двух строк в смысле их алфавитного порядка. Если длины строк разные и короткая совпадает с началом длинной, то большей считается длинная строка. Вот примеры:
Writeln (’Borland’ > ’Pascal’); { false }
Writeln (’ABC’ > ’AB’); { true }
Writeln (’ABC’ > ’abc’); { false }
Writeln (’45’ > ’1000’); { true, поскольку ’4’ > ’1’ }
В первом примере код буквы «B» меньше кода буквы «P», поэтому левая строка меньше правой. Во втором случае первые символы совпадают, но левая строка длиннее, а значит больше. В третьем примере левая строка меньше, — тоже в соответствии с таблицей кодировки. Обратите внимание на неожиданный результат сравнения строк, составленных из цифр, — это вам не числа!
Сравнивая строки, можно отсортировать их в лексикографическом порядке (как если бы они располагались в словаре). К сожалению, такое сравнение работает только для латинских букв, для русских оно не всегда верно, приходится изобретать свою функцию сравнения (в DELPHI этой проблемы нет).
Перевод символов в верхний регистр (UpСase)
Функция UpСase меняет код латинской буквы, переводя её из нижнего в верхний регистр. Иными словами, она превращает строчную (маленькую) латинскую букву в заглавную (большую). Объявление функции таково.
function UpCase(Ch: Char): Char;
Входной параметр – символ, а возвращается почти тот же символ, только «подросший», вот примеры.
c:= UpCase(’r’); { ’R’ }
c:= ’n’;
c:= UpCase( c ); { ’N’ }
Подсунув этой функции большую латинскую букву, цифру или знак препинания, вы получите назад свой символ неизменным. То же будет и с русскими буквами – они не обрабатываются функцией UpСase.
c:= UpCase(’R’); { ’R’ }
c:= UpCase(’8’); { ’8’ }
c:= UpCase(’ы’); { ’ы’ }
Функцией UpСase обычно приводят введенные строки к определенному виду. Ведь пользователь может ввести данные как заглавными, так и строчными буквами, а это иногда мешает правильной обработке строки.
Ознакомившись со строковой теорией, применим её, что называется, «в бою».
Подсчет слов в строке
Вот вам строка, посчитайте в ней количество слов «Pascal». Чуть подумав, вы остановитесь на функции Pos, – ведь она возвращает позицию искомого слова. Но функция обнаруживает лишь первое вхождение фрагмента, а как быть с остальными? Я предлагаю постепенно разрушать исходную строку. То есть, найдя искомый фрагмент, будем удалять его из строки и снова повторять поиск. На этом и построена программа «P_44_2».
{ P_44_2 - Подсчет слов «PASCAL» в строке }
var S : string; { исходная строка }
p : integer; { позиция в строке }
c : integer; { счетчик слов }
begin
S:='Лучший язык программирования – это PASCAL!'+
'Изучите PASCAL! PASCAL не подведет!';
c:=0;
repeat
p:= Pos('PASCAL', S); { ищем слово «PASCAL» }
if p>0 then begin { если нашли }
Inc(c); { то наращиваем счетчик }
{ и удаляем это слово из строки }
Delete(S, p, Length('PASCAL'));
end
until p=0; { выход, если слов «PASCAL» больше нет }
Writeln('Найдено слов PASCAL: ',c); Readln;
end.
Контекстная замена
Любой текстовый редактор умеет заменять одну подстроку на другую, – это называется контекстной заменой. Устроим такую замену в строковой переменной. Итак, дана строка, содержащая несколько слов «Pascal». Заменим все вхождения слова «Pascal» словом «Паскаль» (чем не англо-русский переводчик?).
Разобравшись с предыдущей задачей, вы легко одолеете и эту. Для проверки вашего решения сравните его с моим («P_44_3»).
{ P_44_3 - Замена слов «Pascal» на «Паскаль» }
var S : string; { исходная строка }
p : integer; { позиция в строке }
begin
S:='Лучший язык программирования – Pascal! '+
'Изучите Pascal! Pascal не подведет!';
Writeln(S); { исходная строка }
repeat
p:= Pos('Pascal', S); { ищем слово 'Pascal' }
if p>0 then begin { если нашли }
{ удаляем это слово из строки }
Delete(S, p, Length('Pascal'));
{ и вставляем в этом месте слово 'Паскаль'}
Insert('Паскаль', S, p);
end
until p=0; { выход, если слов 'Pascal' больше нет }
Writeln(S); { строка результата }
Readln;
end.
Итоги
• Строка родственна массиву символов. Дополнительный нулевой элемент этого массива содержит длину строки.
• Строка, объявленная без указания размера, по умолчанию занимает 256 байтов памяти и может содержать до 255 символов.
• Для экономии памяти используют строки меньшего размера. При объявлении таких строк размер указывают внутри квадратных скобок после слова STRING.
• В Паскале предусмотрен ряд встроенных процедур и функций, облегчающих обработку строк.
А слабо?
А) Напишите процедуру, переводящую все символы строки (латинские буквы) к верхнему регистру.