Искусственный интеллект. Строки, контекст и волны на Паскале - страница 8



 – число копируемых символов.

Например, действие



присвоит переменной S значение «мыла». Если мы изменим числовые значения, например, на «11, 4» – в переменной S окажется слово «раму»; при «1, 4» – это будет «Мама»; а при «6, 2» в переменной окажется слово «мы».

Также, одним из ключевых элементов работы с фрагментами текста является функция Length (S), позволяющая определять длину строки, чтобы не выходить за ее рамки.

Например,



присвоит переменной n значение 14 – число символов, содержащихся в строке.25

Рассмотрим и возможности построения более сложных конструкций с символами.

Предположим, переменной S присвоено значение «Мама мыла раму»; но нам известно только, что в ней находится три слова (длина которых неизвестна) и необходимо получить первое слово из этой строки, отправив его в переменную S2. Это действие мы можем выполнить так:



– ведь мы помним, что функция Pos находит первое совпадение подстроки, а в начале строки пробела у нас нет. Так в S2 попадет слово «Мама».

Если же нам требуется скопировать текст, следующий за первым пробелом, эта процедура будет выглядеть несколько сложнее:



Здесь, в качестве позиции для отсчета мы берем место нахождения в строке первого пробела и копируем следующие за ним символы за минусом числа символов, следующих до пробела включительно. Проверить верность этой формулы можно в следующей программе:


Илл. 6. Копирование фрагмента строки с помощью функций Copy и Pos, с целью получения части текста, следующего за первым словом в строке.


Результат – можно увидеть на экране:


Илл. 7. Результат работы программы копирования фрагмента текста.


Также, предположим, что нам необходимо скопировать последнее слово из строки. В данном случае, поскольку функция «Pos» нам не поможет, придется воспользоваться циклом, чтобы «вручную» установить место нахождения последнего пробела.

Контролировать конкретный символ строки можно, используя числовое значение индекса символа в строке, при этом числовой индекс указывается в квадратных скобках S [n].

Так, в упомянутой строке S [1] =«М», S [2] =«а», s [3] =«м» и т. д. Зная общее число символов с помощью функции length (S) мы можем перебором достигнуть нужного нам символа в цикле и после произвести нужную операцию. В следующей программе мы получаем последнее слово, благодаря перебору символов с «хвоста», уменьшая значение, полученное из длины строки оператором Dec (i). Так же, на всякий случай мы уточняем условие выхода из цикла в случае, если пробел так и не будет достигнут (i <1).


Илл. 8. Копирование последнего слова из фрагмента текста с использованием цикла Repeat и строкового индекса.


Результат удовлетворяет ожиданиям.


Илл. 9. Итог работы программы (илл. 8).


Почему же в примерах мы использовали английскую транскрипцию? Очень просто, – поскольку по умолчанию в компиляторе TMT Pascal используется кодировка Win, и та же программа с русским предложением внутри даст непонятный итог:


Илл.10. Пример неудачного использования программы по работе с текстом, – из-за несовпадения кодировок ввода (Win) и вывода (DOS) удовлетворительный результат не может быть получен.


Так он будет выглядеть, несмотря на то, что формальных ошибок мы не допускали:


Илл. 11. Так выглядит фиаско при несовпадении кодировок.


И это ничто иное как слово «раму», не переведенное в Dos-кодировку.

Похожий, «никакой» результат мы получим, если, например, напишем символы «а» в строке в английской раскладке, а предложение – на русском; тогда функция Pos из поиска вернет значение отсутствия символа (0), хотя визуально нам кажется, что никакого различия в написании нет.