Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.07.2012, 15:59
Pcrepair
 
Сообщения: n/a
По умолчанию Как правильно запустить один цикл внутри другого?

Добрый день. Есть следующие исходные данные:
- произвольный набор слов в переменной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  
Старый 16.07.2012, 16:20
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

надо было ShowMessage в функцию CompareWords засунуть и было бы видно
Ответить с цитированием
  #3  
Старый 16.07.2012, 18:08
Pcrepair
 
Сообщения: n/a
По умолчанию

там тоже было....
Вот так работает как было задумано:
Код:
     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  
Старый 16.07.2012, 18:30
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

там было:
Код:
T1.Delete(0); (*удаление первого слова для цикличности*)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:36.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter