|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Как правильно запустить один цикл внутри другого?
Добрый день. Есть следующие исходные данные:
- произвольный набор слов в переменной1:строка (ввод из МЕМО1) - слова образцы, их допустим 3 - произвольный набор слов в переменной2:строка (Ввод из МЕМО2) - ТЕКСТ, слова для сравнения, их десятки Необходимо каждое слово из переменной1 поочередно сравнить со всеми словами из Переменной2, и при выполненении порогового условия присвоить функции значение ДА или оставить НЕТ. Вот код: Код:
function TForm1.CompareWordWithText(const S1,S2:string;var N1,N2:integer):boolean; (*где S1-СЛОВО; S2- ТЕКСТ; N1,2 - уровень компараторов*) var T1,T2:TStringList; i,s,Count1,Count2,Count3:integer; (*Счет1 - число строк в Т1(СЛОВО); Счет2- число строк в Т2(ТЕКСТ); Счет3- число совпадений слов в тексте*) WordRequest,WordText:string; begin CompareWordWithText:=False; T1:=TStringList.Create; T2:=TStringList.Create; T1.Text:=SpliteText(S1); (*ввод СЛОВО поиска*) T2.Text:=DelUselessWords(SpliteText(S2)); (*ввод ТЕКСТ*) Count1:=T1.Count; (*число строк в СЛОВО*) Count2:=T2.Count; (*число строк в ТЕКСТ*) Count3:=0; (*обнулить нужно стетчик*) (*====================================================================*) for s := 0 to T1.Count-1 do (*Цикл1, подстановка для сравнения слов - образцов*) begin WordRequest:=T1.Strings[0]; (*вводим первую строку - слово*) ShowMessage('Слово = '+WordRequest); (*тут видно что по очереди перебераются все слова из МЕМО1)*) (*=============================================*) for i := 0 to T2.Count-1 do (*Цикл2, текущее слово-образец сравнивается с массивом строк состоящих из одного слова*) begin WordText:=T2.Strings[0]; (*ввод первого слова из ТЕКСТ*) if CompareWords(WordRequest,WordText,N2)= TRUE Then (*если слова тождественны тогда увеличить счетчик +1*) Inc(Count3); (*так вроде лучше*) T2.Delete(0); (*удаление первого слова для цикла для обеспечения цикла - может не самое правильное решение, но работать то должно?*) end; (*===========================================*) T1.Delete(0); (*удаление первого слова для цикличности*) end; (*========================================================================*) if Count2 > 0 then (*защита от сбоя, когда абзац пуст*) CompareWordWithText:= Count3*100 div Count2 >= N1; (*формула присвоения выходу функции значения ДА при выполнении условия, или остается вначале установленное значение*) T1.Free; T2.Free; end; SpliteText - функция, разделяет массив слов на массив строк по одному слову, удаляет знаки препинания и слова менее 3-х символов DelUselessWords - функция, удаляет предлоги и прочие ненужные-запрещенные слова CompareWords - функция, выдает ДА если WordRequest и WordText тождественны(это отдельная история и на стенде функция работает нормально) Вроде все должно работать, однако если в МЕМО1 и МЕМО2 ввести слова то функция обрабатывает только первое слово из МЕМО1 вот здесь ShowMessage('Слово = '+WordRequest); видно что остальные слова из МЕМО1 проходят Цикл(они там появляются) но почемуто не попадают далее в CompareWords(WordRequest,WordText,N2), в общем Цикл сравнения проходит только один раз Вопрос: где ошибка в передаче данных функции через параметры вовремя цикла? или может что то еще не так? |
#2
|
|||
|
|||
надо было ShowMessage в функцию CompareWords засунуть и было бы видно
|
#3
|
|||
|
|||
там тоже было....
Вот так работает как было задумано: Код:
for s := 0 to T1.Count-1 do begin WordRequest:=T1.Strings[s]; for i := 0 to T2.Count-1 do begin WordText:=T2.Strings[i]; (*ввод первого слова из ТЕКСТ*) if CompareWords(WordRequest,WordText,N2)= TRUE Then Inc(Count3); (*так вроде лучше*) end; end; Однако мне непонятно как происходит инкремент, к примеру, WordRequest:=T1.Strings[s]; ведь перед этим было s := 0 может кто сумеет объяснить? в букварях об этом ничего не нашел |
#4
|
|||
|
|||
там было:
Код:
T1.Delete(0); (*удаление первого слова для цикличности*) |