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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2016, 23:33   #1
Mik92
Пользователь
 
Регистрация: 25.08.2014
Сообщений: 87
По умолчанию Поиск и подсчет слов в memo

Здравствуйте, пытаюсь организовать поиск слов в memo но что то неудачно.

Код:
for i:= 0 to Length(Memo1.Text) do begin
    if (Memo1.Text[i]= 'ct') then inc(ctn);
  end;
Такой вариант вообще не ищет, стоит только чуть изменить сравниваемую строку допустим на 'c' то есть оставить только один символ, тогда работает. Функция Pos вытваряет тоже самое -ищет только одну букву а целые слова нет. Почему оно не ищет полные слова?
Mik92 вне форума Ответить с цитированием
Старый 24.02.2016, 00:28   #2
vlad1389
Форумчанин
 
Регистрация: 02.02.2016
Сообщений: 290
По умолчанию

Код:
ShowMessage(IntToStr(Length(Memo1.Text[1])));
ShowMessage(IntToStr(Length('ct')));
vlad1389 вне форума Ответить с цитированием
Старый 24.02.2016, 04:25   #3
zdus2757
vk.com/replog
Пользователь
 
Регистрация: 04.05.2012
Сообщений: 87
По умолчанию

Цитата:
Сообщение от Mik92 Посмотреть сообщение
Здравствуйте, пытаюсь организовать поиск слов в memo но что то неудачно.

Код:
for i:= 0 to Length(Memo1.Text) do begin
    if (Memo1.Text[i]= 'ct') then inc(ctn);
  end;
Такой вариант вообще не ищет, стоит только чуть изменить сравниваемую строку допустим на 'c' то есть оставить только один символ, тогда работает. Функция Pos вытваряет тоже самое -ищет только одну букву а целые слова нет. Почему оно не ищет полные слова?

судя по твоему коду ты "пытаешься" найти в Memo1 строку 'ct'

или мб ты хочешь вот это?
Код:
var I,N:integer;
begin
N:=0;
For I:=0 to Memo1.Lines.Count do
Begin
if Pos('ct',Memo1.Lines[I])>0 then
Begin N:=N+1;
Label1.Caption:='Количество строк со словом "ct" =' + IntToStr(N); End;
End;
end;
zdus2757 вне форума Ответить с цитированием
Старый 24.02.2016, 05:33   #4
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

Код:
uses
  StrUtils;

function WordCount(AStrings: TStrings; const AWord: string): Integer;
var
  I, J: Integer;
begin
  Result := 0;
  for I := 0 to AStrings.Count - 1 do
  begin
    J := PosEx(AWord, AStrings[I]);
    while J > 0 do
    begin
      Inc(Result);
      J := PosEx(AWord, AStrings[I], J + Length(AWord));
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(WordCount(Memo1.Lines, Edit1.Text)));
end;
Или:
Код:
uses
  StrUtils;

function WordCount(const S, AWord: string): Integer; overload;
var
  I: Integer;
begin
  Result := 0;
  I := PosEx(AWord, S);
  while I > 0 do
  begin
    Inc(Result);
    I := PosEx(AWord, S, I + Length(AWord));
  end;
end;

function WordCount(AStrings: TStrings; const AWord: string): Integer; overload;
var
  I: Integer;
begin
  Result := 0;
  for I := 0 to AStrings.Count - 1 do
    Inc(Result, WordCount(AStrings[I], AWord));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(WordCount(Edit2.Text, Edit1.Text)));
  ShowMessage(IntToStr(WordCount(Memo1.Lines, Edit1.Text)));
end;

Последний раз редактировалось Filka; 24.02.2016 в 06:53.
Filka вне форума Ответить с цитированием
Старый 24.02.2016, 09:44   #5
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Основная ошибка:
Код:
if (Memo1.Text[i]= 'ct') then inc(ctn);
При обращении к конкретному символу строки (Memo1.Text[i]) будет возвращаться символ, но не строка. ct является строкой, причём с двумя символами. В этом случае у вас равенство никогда не выполнится. Если вы хотите посчитать количество слов ct в memo, то делайте так:

Код:
if memo1.text[length(memo1.text)] <> ' ' then begin // если последний символ не пробел
	wordsAmount:=1;
end else begin
	wordsAmount:=0;
end;

for i:=1 to length(memo1.text)-2 do begin
	if (memo1.text[i] = 'c') AND
		 (memo1.text[i+1] = 't') and
		 (memo1.text[i+2] = ' ')  then begin
		    inc(wordsAmount);
	end;
end;

// wordsAmount - искомая величина

Последний раз редактировалось Вадим Мошев; 24.02.2016 в 09:55.
Вадим Мошев вне форума Ответить с цитированием
Старый 24.02.2016, 09:50   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
пытаюсь организовать поиск слов в memo
Все выше приведенные примеры это не поиск слов, а поиск вхождений подстроки. Поиск слов это еще анализ разделителей
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.02.2016, 09:55   #7
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Переписал свой код выше
Вадим Мошев вне форума Ответить с цитированием
Старый 24.02.2016, 14:03   #8
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

Код:
function WordCount(const S, AWord: string; const Delims: TSysCharSet;
  IgnoreCase: Boolean): Integer; overload;
var
  I, L, Pos1, Pos2: Integer;

  function CmpStr(P1, P2: PChar; Len: Integer; IgnoreCase: Boolean): Boolean;
  var
    I: Integer;
    IsNotEqual: Boolean;
  begin
    Result := False;
    for I := 0 to Len - 1 do
    begin
      case IgnoreCase of
        True:  IsNotEqual := AnsiUpperCase(P1[I]) <> AnsiUpperCase(P2[I]);
        False: IsNotEqual := P1[I] <> P2[I];
      end;
      if IsNotEqual then
        Exit;
    end;
    Result := True;
  end;

begin
  Result := 0;
  Pos1 := 0;
  I := 1;
  L := Length(S);
  while I <= L do
  begin
    while (I <= L) and (S[I] in Delims) do
      Inc(I);

    if I <= L then
      Pos1 := I;

    while (I <= L) and not (S[I] in Delims) do
      Inc(I);
      
    Pos2 := I;
    
    if (Pos2 - Pos1) = Length(AWord) then
      Inc(Result, Integer(CmpStr(@S[Pos1], PChar(AWord), Length(AWord), IgnoreCase)));
  end;
end;

function WordCount(AStrings: TStrings; const AWord: string; const Delims: TSysCharSet;
  IgnoreCase: Boolean): Integer; overload;
var
  I: Integer;
begin
  Result := 0;
  for I := 0 to AStrings.Count - 1 do
    Inc(Result, WordCount(AStrings[I], AWord, Delims, IgnoreCase));
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  Delims: TSysCharSet = [#32, #13, #10, #9];
begin
  ShowMessage(IntToStr(WordCount(Edit2.Text, Edit1.Text, Delims, CheckBox1.Checked)));
  ShowMessage(IntToStr(WordCount(Memo1.Lines, Edit1.Text, Delims, CheckBox1.Checked)));
end;

Последний раз редактировалось Filka; 24.02.2016 в 14:31.
Filka вне форума Ответить с цитированием
Старый 24.02.2016, 14:07   #9
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию

Вариант решения с учетом разных разделителей между словами:
Код:
uses
  StrUtils;

function CountWords(substr,str: string): Integer;
const
  Delims: set of Char=[#10,#13,' ',',','.']; // разделители
var
  p: Integer;
begin
  Result:=0;
  str:=' '+str+' ';
  substr:=trim(substr);
  p:=1;
  repeat
    p:=PosEx(substr,str,p);
    if (p>0) and (str[p-1] in Delims) and (str[p+Length(substr)] in Delims)
      then Inc(Result);
    Inc(p);
  until p=1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(CountWords('ct',Memo1.Text)));
end;

Последний раз редактировалось Arigato; 24.02.2016 в 14:14.
Arigato вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск слов в Txt или в Memo по вводу в Edit и тогда действие JINC C++ Builder 7 30.04.2015 06:45
Поиск слов в Memo Ol'KA Помощь студентам 4 30.11.2012 01:06
Пользовательские функции. Подсчет количества слов, поиск самого короткого слова if_else Общие вопросы C/C++ 1 09.04.2012 22:53
Подсчет слов(Си) Bl@st Помощь студентам 18 21.12.2009 23:45
Подсчет слов Stanislav Общие вопросы Delphi 11 28.08.2008 10:37