Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.075 c
15-1346775365
pasha_golub
2012-09-04 20:16
2013.03.22
Как привести TList<TField> к простому TList


2-1329158582
Hgd1
2012-02-13 22:43
2013.03.22
Delphi 2011 и русский текст


2-1346669848
Phoenix_
2012-09-03 14:57
2013.03.22
что будет быстрее


15-1342307267
Германн
2012-07-15 03:07
2013.03.22
Внешний USB-hard drive в качестве системного.


2-1340868561
начинающий41
2012-06-28 11:29
2013.03.22
формат даты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский