Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 14.05.2014, 08:49   #1
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
Вопрос Подсчитать кол-во одинаковых слов в Memo и вывести результат в переменную integer?

Вобщем нужно подсчитать кол-во одинаковых слов в Memo и вывести результат в переменную integer? Слышал про функцию FindNext (или типа того), но как ее использовать? Или есть другой способ?

Пробовал

Код:
for i:=0 to Memo1.Lines.Count-1
и дальше проверка if Pos ,но, если в строке два одинаковых слова - if Pos не покатит...
FleXik вне форума
Старый 14.05.2014, 09:02   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Кроме Pos есть еще PosEx
И просто такой способ в лоб не прокатит - в строке незабудка есть слово будка? В строке Дерево есть слово дерево?
Если разделитель слов только пробел можно просто обыкновенным TStringList разбить на слова и простенько искать. Если и другие разделители, то задача усложняется на порядок.
И есть еще куча подобных тем на форуме
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 14.05.2014 в 09:05.
Аватар вне форума
Старый 14.05.2014, 09:08   #3
blackstrip
Форумчанин
 
Аватар для blackstrip
 
Регистрация: 21.01.2012
Сообщений: 240
По умолчанию

Сначала из строки s надо сделать uppercase(' '+Trim(s)+' '), тогда все слова гарантированно будут иметь слева и справа от себя минимум 1 пробел. И искать не слово "дерево", а " ДЕРЕВО ". Тогда задача немного упростится.
blackstrip вне форума
Старый 14.05.2014, 09:50   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

тоже же мне, бином Ньютона...

CountWordsInMemo.rar

CountWordsInMemo_EXE.rar

Код:
implementation

{$R *.dfm}
procedure FindWordInString(S:string; var TS : TStringList);
const
  D = ['.', ',', ':', ';', '!', '?', '-', ' ', #9, #10, #13];
var i:integer;
    S2:string;
begin
//  Result := TStringList.Create;
  S2 := '';
  For i:=1 to Length(S) do
  begin
     if (s[i] in D) then begin
        if (Length(S2)>0) then begin
          TS.Append(S2);
          S2:='';
        end;
     end
    else
        S2:=S2+s[i];
  end;
  if (Length(S2)>0) then TS.Append(S2);
end;

procedure TForm6.Button1Click(Sender: TObject);
var TS : TStringList;
  OneWord : string;
  i, cnt : integer;
begin
   TS := TStringList.Create;
   Memo2.Lines.Clear;
   try
     FindWordInString( Memo1.Lines.Text, TS );
     if TS.Count = 0 {список пуст - слов нет - Выходим} then begin
       Memo2.Lines.Append('Не найдено ни одного слова!');
     end;
     TS.Sort;
     // А вот собственно  и подсчёт
     OneWord := TS.Strings[0];
     Cnt := 1;
     for i := 1 to TS.Count - 1 do
       if AnsiUpperCase(TS.Strings[i]) = AnsiUpperCase(OneWord) then inc(Cnt)
       else begin
         Memo2.Lines.Append(OneWord+' '+InttoStr(Cnt));
         OneWord := TS.Strings[i];
         Cnt := 1;
       end;

     // для последнего слова в списке вывод результата
     Memo2.Lines.Append(OneWord+' '+InttoStr(Cnt));

   finally
     TS.Free;
   end;
end;
Serge_Bliznykov вне форума
Старый 14.05.2014, 09:58   #5
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Цитата:
Если разделитель слов только пробел можно просто обыкновенным TStringList разбить на слова и простенько искать.
так-то можно, вот только если опять же потом через if Pos делать то если ищем слово будка и в списке попадется слово незабудка то оно его засчитает

я конечно же нашел уже ответ, работает отлично, но, хотелось бы функцию...
FleXik вне форума
Старый 14.05.2014, 10:18   #6
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

на сонную голову надумалось что решить проблему можно используя регулярку))) сколько не гуглил никто до этого не додумался...

Вобщем имеем это:
Код:
procedure TForm1.sButton1Click(Sender: TObject);
var
  RegExp:TRegExpr;
  i:integer;
begin
  i:=0;
  RegExp:=TRegExpr.Create;
  RegExp.Expression:='тест';

    if RegExp.Exec(Form1.sMemo.Text) then
    repeat
      i:=i+1;
    until not RegExp.ExecNext;

  ShowMessage(IntToStr(i));
  RegExp.Free;
end;
в отличии от цикла (описывал в предыдущих сообщениях в этой теме) даже если в строке два слова или больше - их засчитывает, но, если в Memo присутствуют слова "тестер", "тестинг" и им подобные - их тоже засчитывает, можно ли как-то настроить шаблон регулярки или переделать код чтобы искало суто слово "тест" ?

Последний раз редактировалось FleXik; 14.05.2014 в 10:25.
FleXik вне форума
Старый 14.05.2014, 10:45   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

надо косячок исправить в коде:

Код:
if TS.Count = 0 {список пуст - слов нет - Выходим} then begin
       Memo2.Lines.Append('Не найдено ни одного слова!');
       Exit;
     end;
а то в комментах написал "выходим", а команду на выход забыл написать...

p.s. это я к коду из поста #4
Serge_Bliznykov вне форума
Старый 14.05.2014, 11:38   #8
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

решил траблу с помощью цикла к коду в сообщении #6, как именно решил - додумывайте сами, но, еще протестирую немного и отпишусь идеально ли все работает...
FleXik вне форума
Старый 14.05.2014, 12:55   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

если лежит душа к регулярке, то можно попробовать так:
Код:
 RegExp:=TRegExpr.Create;
  RegExp.Expression:='\Wтест\W';

    if RegExp.Exec(' '+Form1.sMemo.Text+' ') then
...
Serge_Bliznykov вне форума
Старый 14.05.2014, 13:13   #10
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Код:
if RegExp.Exec(' '+Form1.sMemo.Text+' ') then
я так и сделал, только в шаблоне тоже пробелы...
FleXik вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кол-во одинаковых слов в предложении rafffkaaa Microsoft Office Excel 1 17.04.2014 21:13
Подсчитать количество одинаковых слов в строке Chainik! Общие вопросы C/C++ 34 03.09.2013 00:44
Дан целочисленный массив размера N, содержащий ровно два одинаковых элемента. Найти номера одинаковых элементов и вывести эти номе Alexar Makken Паскаль, Turbo Pascal, PascalABC.NET 1 23.12.2011 22:07
Удаление одинаковых слов в Memo. sxcine Общие вопросы Delphi 7 03.01.2011 12:56