Разбиение на слова. Все способы. |
Разбиение на слова. Все способы. |
Altair |
16.11.2005 0:29
Сообщение
#1
|
Ищущий истину Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Предлагаю в теме собрать все способы разбиения строки на слова.
(рекурсивные, итерационные, с использованием массивов, без использования массивов, с ДСД, с чем-то еще... вобщем программы и алгоритмы преобразования предложения в набор слов ) СОБИРАЕМ! -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
volvo |
16.11.2005 1:02
Сообщение
#2
|
Гость |
Пожалуй, самый извращенный способ - используется реализация динамического массива (из FAQ) с ООП:
function pos(var p: byte; файл array.pas прилагается: ARRAY.PAS ( 6.35 килобайт ) Кол-во скачиваний: 1676 |
volvo |
16.11.2005 1:04
Сообщение
#3
|
Гость |
Этот - немного попроще, здесь реализован список слов:
type |
Altair |
16.11.2005 1:16
Сообщение
#4
|
Ищущий истину Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Функция с дополнительными возможностями.
function SepWord(s,Alf:string):tlist; Функция вовзращает указатель на структуру вида:
Проще говоря, на односвязный, динамический список: Параметры вызова функции s (string) - строка, подлежащая разбиению на слова. Alf (string) - пользовательский алфавит. описание Если первый символ $, то alf интерплитируется как алфавит. Пример alf='$1234567890'; тогда алфавит = {'1','2','3','4','5','6','7','8','9','0'} То есть таким образом можно легко распознавать например только числа в строке с мусором. Если первый символ # то далее идущие символы интерплитируются как разделители. Если первый символ другой, то alf - имя файла из которого считывается алфавит (символы - НЕ разделители). Код функции
Пример программы: test.pas ( 1.91 килобайт ) Кол-во скачиваний: 1687 Используемый алгоритм Просматриваем строку. Изначально полагаем что мы не просматриваем слово. Далее если встречаем НЕ разделитель , а признак просмотра слова ложь, меняем признак на ИСТИНУ. Далее если встречаем символ не разделитель и признак слова не ложь то прибавляем символ к временнйо строке. Если стретили символ разделитель и признак слова истина, то добавляем слово из временнйо строку в список слов. обнуляем временную строку. признак слова в ложь переходим к следующему символу. -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Altair |
16.11.2005 1:44
Сообщение
#5
|
Ищущий истину Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Эмулирование стандартных классов в Delphi
Еще один вариант с ООП и ДСД (односвязные списки). Процедура очень легко портируется на Delphi с использованием класса Tstrings
Функция разбивает строку S на слова, используя набор символов Delimiters в качестве разделителей и заносит их в список L. Результат функции - количество найденных слов. -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
volvo |
16.11.2005 9:06
Сообщение
#6
|
Гость |
Это - довольно простой способ (информация о найденных словах хранится в массиве, но НЕ в виде самих слов, а в виде <начало слова в строке, длина слова>):
const |
klem4 |
16.11.2005 15:11
Сообщение
#7
|
Perl. Just code it! Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
я вот это использую всегда :
const Сообщение отредактировано: klem4 - 18.11.2005 8:34 -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
kornet |
18.08.2007 17:42
Сообщение
#8
|
Новичок Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Юлиан Репутация: -1 |
Еще один способ разбивки строки на слова (похож на метод в сообщении № 3).
Алгоритм таков: 1) Заменяем все знаки пунктуации на пробелы (так же как и в методе в сообщении № 3).) 2) Удаляем все лишние пробелы (так же как и в методе сообщении № 3) и добавим последний пробел, если его нет. 3) Находим кол-во пробелов, в нашем случае оно будет равняться кол-ву слов, так как мы заранее добавили последний пробел. Заносим местоположение пробелов в байтовый массив 4) Ориентируясь на местоположение в строке пробелов, которое хранится в массиве, копируем слова в динамический список. В методе, представленном volvo в сообщении № 3, находится первый пробел во время цикла с помощью функции Pos, затем копируется часть строки с начала строки до первого пробела (слово) в динамический список, затем строка обрезается и поиск начинается сначала, и так до тех пор, пока в строке ничего не останется. В представленном мной методе сперва находятся все пробелы, а затем в соответствии с их местоположением копируются слова в динамический массив, строка при этом не обрезается (за начало каждого слова отвечает переменная start, которой перед циклом присваивается значение 1 (начало первого слова), затем её значение равно местоположению очередного пробела + 1: start := x[i3] + 1, длина слова определяется разностью между местоположением пробела и переменной start: x[i3] - start ) program cuxtstringpr; Сообщение отредактировано: kornet - 19.08.2007 11:01 |
Текстовая версия | 9.11.2024 21:26 |