Вниз
Скачать: CL | DM;

Как правильно запустить один цикл внутри другого?   Найти похожие ветки 

← →
Pcrepair ©   (2012-07-16 15:38) [0]

Добрый день. Есть следующие исходные данные:
- произвольный набор слов в переменной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), в общем Цикл сравнения проходит только один раз

Вопрос: где ошибка в передаче данных функции через параметры вовремя цикла? или может что то еще не так?


← →
Медвежонок Пятачок ©   (2012-07-16 15:45) [1]

а пошагово-то пройти и посмотреть не судьба?


← →
Медвежонок Пятачок ©   (2012-07-16 15:49) [2]

кроме того, не вижу никакой связи между словами и строками в мемо

WordRequest:=T1.Strings[0]; (*вводим первую строку - слово*)

Ты можешь видеть тридцать три строки в своем меме, и при этом стрингсов там будет ровно единица.


← →
RWolf ©   (2012-07-16 15:50) [3]

for i := 0 to T2.Count-1 do
...
 T2.Delete(0);


следующей проблемой будет Range check error.


← →
Pcrepair ©   (2012-07-16 15:51) [4]

пошагово? каким образом? там же нужно данные вводить из МЕМО
вообще вводил ShowMessage в разных местах, получается что после первого цикла сравнения(который проходит нормально кстати) не передается данные в ПЕРЕм WordRequest из за чего просто функция CompareWords выдает НЕТ и цикл1 просто заканчивается


← →
RWolf ©   (2012-07-16 15:52) [5]

впрочем, вру — не обязательно будет.


← →
Pcrepair ©   (2012-07-16 15:52) [6]


> Ты можешь видеть тридцать три строки в своем меме, и при
> этом стрингсов там будет ровно единица

ну тут только кусочек программы, вообще ввод слов идет через МЕМО1 и 2


← →
Медвежонок Пятачок ©   (2012-07-16 15:53) [7]

пошагово? каким образом?

Точку останова внутрь цикла и дальше F8


← →
Медвежонок Пятачок ©   (2012-07-16 15:57) [8]

и цикл1 просто заканчивается

тот цикл заканчивается по числу стрингсов мема, о чем я и говорил. видно десять, а реально одна.


← →
Pcrepair ©   (2012-07-16 16:02) [9]

да нет там до того специальная функция формирует в TStringList массив строк по одному слову в строке(слова беруться из МЕМО)


← →
Медвежонок Пятачок ©   (2012-07-16 16:04) [10]

Внешний цикл заканчивается только тогда, когда кончаются стрингсы первого мемо. Никакая компареворд на этот цикл не влияет.

Как бы она ни работала, она не влияет на прекращение первого цикла.


← →
Медвежонок Пятачок ©   (2012-07-16 16:09) [11]

не передается данные в ПЕРЕм WordRequest

Если в исходнике слева стоит переменная, справа - данные, а между ними оператор присваивания, то данные в переменную стопудово "передаются".


← →
Anatoly Podgoretsky ©   (2012-07-16 16:21) [12]

И как всегда в несколько форумов и везде бардак.


← →
Pcrepair ©   (2012-07-16 18:10) [13]

Бардак в головах критиканов, а у меня вот это

Вот так работает как было задумано:
    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
может кто сумеет объяснить? в букварях об этом ничего не нашел


← →
Медвежонок Пятачок ©   (2012-07-16 18:24) [14]

что объяснить? как происходит инкремент?
он происходит неумолимо неизбежно и бесшумно и на единицу.
в случае если CompareWords вернет true.


← →
Pcrepair ©   (2012-07-16 18:26) [15]

а в букваре пишут другое:

> В начале работы оператора переменная-счётчик получает значение
> выражения-1. Если при этом значение счётчика окажется меньше
> или равно значению выражения-2, то выполняются операторы,
>  входящие в действие. Это и есть один цикл. Затем переменная-
> счётчик принимает значение, следующее за текущим, и начинается
> новый цикл, то есть сравнение счётчика и выражения-2, выполнение
> действия, и так далее, до тех пор, пока значение переменной-
> счётчика не превысит значение выражения-2

.


← →
Медвежонок Пятачок ©   (2012-07-16 18:29) [16]

описание цикла. описание условий при которых он выполняется.
что не нравится?
что смутило?


← →
Pcrepair ©   (2012-07-16 18:37) [17]

уже все ясно и понятно



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.5 MB
Время: 0.046 c
10-1182370787
miks
2007-06-21 00:19
2013.03.22
Проблема открытия файла в MS Word


15-1347959351
DevilDevil
2012-09-18 13:09
2013.03.22
Методы компиляции и оптимизации машинных команд


2-1332009690
теркин
2012-03-17 22:41
2013.03.22
Использование полиморфных объектов


2-1338391814
Serge Petrov
2012-05-30 19:30
2013.03.22
TWebBrowser и обновление элемента веб-страницы


15-1346646304
AV
2012-09-03 08:25
2013.03.22
Когда окно максимизировано, оно меньше ресурсов ест?




   Наверх