Помогите начинающему программисту!

  • Автор темы SSSS
  • Дата начала
S

SSSS

Здравствуйте! Не могли бы вы подсказать начинающему программисту как выполнить следующую операцию в Delphi.

Мне необходимо чтобы при вводе определенного слова в строку Edit производился поиск в текстовом файле этого слова и выводилось в Memo после определенного символа т.е. приведу пример.

Допустим в текстовом файле имеется запись:

«Цвет 1. Красный 2. Черный 3. Белый»

После ввода в строку Edit слова «Цвет», в Мемо1 выведется строка после этого слова:
1. Красный
2. Черный
3. Белый
Получается он выводит значения после первого пробела и переносит слово вниз встречая цифру. И если не затруднит, чтоб при этом еще в Мемо2 выводились все слова которые совпадают по вбитым буквам пока не будет 100% совпадения т.е.

В файле есть строки: Цвет 1. Красный …
Цветок 1. Роза…
Если написать в Edit "Цвет", то будут отображаться оба слова в Мемо2, а если "Цветок", то "Цвет" сразу скроется и останется только "Цветок" (это чтоб был выбор если человек точно не знает что ищет). Программа очень похожа на переводчик или глоссарий.

Заранее спасибо!!!
 
S

Silver Wind

А что конкретно не понятно?
В обработчике OnChange Edit`a проводишь поиск по заранее загруженному файлу и готовишь информацию, которую затем выводишь в Memo.
Единственный момент, который надо продумать как следует это как быстро такой поиск будет работать с файлом хотябы в пару мегабайт, наверное заранее отсортировать информацию, чтобы пользователь затем не плевался от того факта что после ввода очередной буквы надо ждать полчаса отображения информации.
 
V

Vadik(R)

Мне кажется ему нужна сама реализация программы. То есть, он хочет дождаться самого кода поиска типа:
Код:
While NOT EoF(F) Do
Begin
ReadLn(f,st);
While Pos(Edit1.Text, st) Do
...
End.
Честно говоря написал бы, но лень, ведь код программы-то получится не маленький.
 
S

SSSS

Ладно с поиском еще можно что-то придумать, а как быть чтоб он в Мемо1 вставлял строчку которая после пробела, причем именно строчку а не весь дальше идущий текст! Суть я понимаю какая но как это реализовать? Необходимо чтобы он при совпадении слова на 100% проверял какой сисвол после него и если там пробел а не очередной символ то он вставляет в Мемо последующий текст который идет до конца строки, а не до конца всего документа.
 
S

Silver Wind

Все еще не понимаю в чем проблема.
Копировать часть строки - функция Copy(), обратиться к символу строки str по индексу так - str[index], найти подстроку в строке - функция Pos().
Этих инструментов вполне достаточно.
 
S

SSSS

Видимо я не догоняю или ты меня не так понял. Насчет поиска тоже я щас подумал и понял что он не сработает т.к. он будет искать по всему файлу и это словоможет встретиться и далее но уже не как искомое а просто по тексту. Я еще раз приведу пример и если твое мнение не изменится, значиту меня туго с этим :)

Есть допустим файл со следующей информацией:

Роза 1. Цвет 2. Запах
Цвет 1. Красный 2. Синий
и т.д.

Мне необходимо чтоб производился поиск именно по первым словам т.е. по Розе и Цвету, а если искать везде то он найдет и слово Цвет в Розе, а мне нужны только слова до пробела чтоб сравнивалось, а то что после пробела выводилось в Мемо.
 
S

Silver Wind

Ну и замечательно что в файле много строк, еще замечательнее будет, если они по алфавиту отсортированы, тогда двоичный поиск можно использовать, чтобы найти нужную строку.
А так в общем виде - грузим наш файл в TStringList и работаем с отдельными строками.
 
A

astronom

Эту программу лучше сразу на Ассемблере писать ... хотя бы есть шанс, что она хоть когда-нибудь закончится в случае работы с файликом в пару мегабайт. :D
Если я правильно понял, то файл можно описать так:
метка_1 1 элемент1 2 элемент2 3 элемент3 ...
метка_2 1 элемент1 2 элемент2 3 элемент3 ...
метка_3 1 элемент1 2 элемент2 3 элемент3 ...

Очевидно, поиск будет вестись по метка_1, метка_2 и т.д. (поиск совпадений с вводимым пользователем словом). Тогда лучше всего сначала считать метки всех строк файла и соорудить из них дерево, отсортировав метки по алфавиту (по бинарным деревьям литературы, как говорится "ВО!!!" или "дофига"), в каждом элементе дерева запомнить номер строки, из которой он был взят.
Поиск осуществлять по этому самому дереву (гемор, но, к сожалению, процессор работает гораздо быстрее с оперативной памятью, чем с дисками :p). Найдя подходящий элемент, определяете номер нужной строки и начинаете ее разбивать.
Как разбить?
Определяете первый пробел в строке (при условии, что поиск велся по одному слову), после этого начиная с той же позиции указателя, ищете первую попавшуюся цифру, и считываете все до следующего пробела (вернее, через 1 пробел.) в строковую переменную. Как только дошли до пробела, добавляете к строковой переменной перевод каретки и переход на новую строку. Продолжаете поиск в исследуемой строке до следующего пробела ... и т.д., пока не встретите символ Eoln. Как только попался Eoln, строка прочитана.
p.s. в принципе, жизнь будет гораздо проще, а программа "красивше и продвинутистей", если метки отделить от перечислимых элементов каким-нибудь заковыристым символом, типа двоеточия, решетки и т.п. Тогда можно вести поиск хоть по целым абзацам. :)
p.p.s. Как только встретите символ EoF, можно закрывать программу и идти курить. :D
 
S

SSSS

Всем большое спасибо за помощь, но если еще кто надумает написать то пишите, я думаю заинтересованных людей хватает...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!