8.1. Поиск в строке Современные компьютерные устройства позволяют достаточно быстро осуществлять поиск в тексте, используя для этого различные алгоритмы. Языки программирования предоставляют широкий набор функций для работы с текстом. Некоторые функции языка программирования Pascal для поиска подстроки (части строки) в другой строке представлены в таблице.
Подробное описание функций и процедур для работы со строками можно найти в справочной системе PascalABC.NET (пример 8.1), а также в Приложении 2 (см. с. 161—162). В примере 8.2. показано, как применять указанные функции. Пример 8.3. Написать программу, которая вводит слово, а затем выводит его по одному символу в строке. Этапы выполнения задания I. Исходные данные: переменная s — исходное слово. 1. Вводим исходные данные. IV. Описание переменных: s —string, n — integer. Пример 8.4. Написать программу, которая выводит на экран последний символ введенного слова и определяет, встречается ли этот символ в слове еще раз. Если встречается, то программа выводит индекс символа. Этапы выполнения задания I. Исходные данные: переменная s — введенное слово. 1. Вводим исходные данные. 4. Определяем позицию последнего символа в слове. Переменной k присваиваем значение функции pos для последнего символа. Если оно равно длине строки, то символ в слове единственный, иначе в слове есть другой такой же символ. IV. Описание переменных: s — string, n, k — integer. Поиск текстовой информации во всемирной паутине заключается в том, чтобы по запросу пользователя найти документы, содержащие указанные ключевые слова. Для этого различные поисковые системы используют разные алгоритмы. Запрос, который вводит пользователь, может содержать строчные и заглавные буквы. Для осуществления поиска буквы в слове обычно приводят к одному регистру: либо все строчные, либо все заглавные. В Pascal также есть функции преобразования.
В примере 8.5 показано применение этих функций. 8.2. Копирование, вставка и удаление символовПри работе с текстом в текстовом редакторе часто приходится пользоваться буфером обмена. Часть текста (подстрока) копируется (вырезается) в буфер обмена, а затем вставляется в другое место в тексте. В языке Pascal реализованы команды для работы с фрагментом текста, которые представлены в таблице.
Во всех командах переменная s обозначает исходную строку, над которой производится операция. Переменная index обозначает позицию символа, начиная с которого выполняют операцию, а переменная count — количество символов. Разберем команды подробнее (пример 8.6). Команда copy является функцией, и результат ее работы присваивается другой переменной. Строка s при этом не изменяется. s1 := сopy(s, index, count);
Команды delete и insert являются процедурами, они изменяют строку s. В примере 8.7 показано, как применяются указанные команды. Пример 8.8. Написать программу, Этапы выполнения задания I. Исходные данные: переменная s — 1. Вводим исходные данные. 4.1. Выделяем из строки s подстроку t такой же длины, что и длина p, начиная с текущего символа. 5. Выводим результат. IV. Описание переменных: s, p, t — string, n1, n2, k — integer. Пример 8.9. Написать программу, которая из слова ТЕСТИРОВАНИЕ получит слово РИСОВАНИЕ, используя процедуры и функции преобразования строк. Этапы выполнения задания I. Исходные данные: слово ТЕСТИРОВАНИЕ будем хранить как константу 1. Результат не зависит от вводимых данных. IV. Описание переменных: s1 — string. |
Пример 8.1. В справке среды программирования PascalABC.NET в разделе Системный модуль PascalABCSystem → Подпрограммы для работы со строками можно найти описание функций и процедур: Пример 8.2. Примеры использования функций.
Пример 8.3.
Пример 8.4.
Пример 8.5. Примеры использования функций. Пример 8.6. Команды для преобразования строк. 1. Запись s1 := Copy(s, index,count); Пример 8.7. Примеры использования команд.
Пример 8.8.
Если для той же строки ввести подстроку «хозяйка», то результат будет таким:
Пример 8.9.
Для копирования последних 8 символов из строки s можно использовать функцию RightStr: s1 := s1 +RightStr(s,8). |
1. Что такое длина строки?
2. С помощью какой функции можно найти длину строки?
3. Какие функции используются для определения позиции подстроки в строке?
4. Как скопировать символы из одной строки в другую?
5. Какая процедура используется для удаления символов из строки?
6. Какая процедура предназначена для вставки символов в строку?
7*. Сопоставьте команды преобразования строк с операциями, выполняемыми с помощью буфера обмена.
Упражнения
1. В программу из примера 8.3 внесли следующие изменения:
for var i := 1 to n do
begin
write(s[i]);
if i mod 2 = 0 then
writeln;
end;
Как теперь выводится слово? Объясните почему.
2. Измените программу из примера 8.3 так, как указано ниже.
- Каждая буква должна выводиться своим цветом (можно использовать случайное задание цветов).
- Буквы, стоящие на четных местах, должны выводиться одним цветом, а на нечетных — другим.
3. Измените программу из примера 8.4 так, чтобы на экран выводился символ введенного слова, стоящий посередине (для слов с четным количеством букв — символ справа от середины).
1. Проверьте правильность работы своей программы на предложенных
примерах. Откройте файл с таблицей и запишите результаты.
2. Допишите в таблицу два своих примера.
3. Что будет выведено, если ничего не вводить, просто нажать Enter?
4. Проверьте, встречается ли выведенный символ в слове еще раз.
5. Выведите позиции всех символов, совпадающих с символом слова, находящимся посередине.
4. Измените программу из примера 8.4 так, чтобы строчные и заглавные буквы анализировались программой одинаково (например, для слова «Анна» ответ должен быть следующим: «Последний символ — а, символ встретился на месте 1»).
5. Даны два слова. Верно ли, что одно из слов начинается на ту же букву, на которую заканчивается другое? (Первая буква одного из слов может быть заглавной.) Если да, то вывести букву, иначе — соответствующее сообщение.
1. Проверьте правильность работы своей программы на предложенных
примерах. Откройте файл с таблицей и запишите результаты.
2. Допишите в таблицу два своих значения.
3*. Если ответ «верно», указать, принадлежат ли буквы одному регистру.
6. Измените программу из примера 8.8 так, чтобы при k = 0 выводилось сообщение ‘Подстрока в строке не встречается’.
7. Программу из примера 8.8 записали следующим образом:
var s, p, t: string;
k, i: integer;
begin
writeln(‘Строка s’);
readln(s);
writeln(‘Подстрока p’);
readln(p);
k := 0; i := 1;
while PosEx(p, s, i) <> 0 do
begin
i := PosEx(p, s, i) + 1; k := k + 1;
end;
writeln(‘Встречается’, k, ‘раз(-а)’);
end.
Сравните эту программу и программу из примера 8.8, определив, сколько раз выполнится команда цикла в каждой из программ для перечисленных случаев.
1. Строка s := «Не слово хозяин хозяину, а хозяин слову хозяин», подстрока p := «хозяин».
2. Строка s := «Не слово хозяин хозяину, а хозяин слову хозяин», подстрока p := «хозяйка».
*Можно ли подобрать тест, для которого количество выполнений цикла
будет одинаковым для обеих программ? Если да, то какой?
8. Получите из слова «ТЕСТИРОВАНИЕ» указанные слова. Для этого используйте команды: copy, delete, insert и операцию сложения строк.