Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сколько раз встречается каждое слово в предложении! [D7, XP]


Dyakon_Frost ©   (2006-04-04 12:04:00) 

Здравствуйте!

Мне необходимо написать программу подсчитывающую сколько раз встречается каждое слово в строке?
Например:
"Это пробное предложение! Пробное!"
"Это - 1
пробное - 2
предложение - 1"

Заранее спасибо.


Dyakon_Frost   (2006-04-04 16:11:00) [1]

Спасибо! А на счет моего кода - там просто надо кое-что было подправить, просто торопился!


Zeqfreed   (2006-04-04 14:26:00) [2]

Ясно :)


Palladin   (2006-04-04 14:24:00) [3]

проще, но это я выдрал из своего архива 6 летней давности... оно мне надо? чего то править :)


Zeqfreed   (2006-04-04 14:20:00) [4]

[9] Palladin ©   (04.04.06 12:32)

> Letters = [
>  'q','w','e','r','t','y','u','i','o','p',
>  'a','s','d','f','g','h','j','k','l','z',
>  'x','c','v','b','n','m','Q','W','E','R',
>  'T','Y','U','I','O','P','A','S','D','F',
>  'G','H','J','K','L','Z','X','C','V','B',
>  'N','M','й','ц','у','к','е','н','г','ш',
>  'щ','з','х','ъ','ф','ы','в','а','п','р',
>  'о','л','д','ж','э','я','ч','с','м','и',
>  'т','ь','б','ю','Й','У','К','Е','Н','Г',
>  'Ш','Щ','З','Х','Ъ','Ф','Ы','В','А','П',
>  'Р','О','Л','Д','Ж','Э','Я','Ч','С','М',
>  'И','Т','Ь','Б'];


А разве не проще написать

Letters = ['A'..'Z'] + ['a'..'z'] + ['а..я'] + ['А'..'Я']
?

Ну а Nums, соответственно — ['0'..'9']


Palladin   (2006-04-04 12:35:00) [5]


> Dyakon_Frost ©   (04.04.06 12:26) [8]


угу, если бы все у меня в офисе так проблемы решали, стояли бы в углу до второго пришествия, во первых она даже не откомпилируется, во вторых не правильно разбирает предложения


Palladin   (2006-04-04 12:32:00) [6]


Const
Nums = ['0','1','2','3','4','5','6','7','8','9'];

Letters = [
 'q','w','e','r','t','y','u','i','o','p',
 'a','s','d','f','g','h','j','k','l','z',
 'x','c','v','b','n','m','Q','W','E','R',
 'T','Y','U','I','O','P','A','S','D','F',
 'G','H','J','K','L','Z','X','C','V','B',
 'N','M','й','ц','у','к','е','н','г','ш',
 'щ','з','х','ъ','ф','ы','в','а','п','р',
 'о','л','д','ж','э','я','ч','с','м','и',
 'т','ь','б','ю','Й','У','К','Е','Н','Г',
 'Ш','Щ','З','Х','Ъ','Ф','Ы','В','А','П',
 'Р','О','Л','Д','Ж','Э','Я','Ч','С','М',
 'И','Т','Ь','Б'];

 NumsAndLetters = Nums + Letters;

 WordChars = NumsAndLetters+['-'];

Procedure ParseWords(const s:String;p_nMinWordLength:Integer);
Var
c,r:String;
cn,l,n,k:Integer;
wrds:TStringList;

Function _ReadWord:Boolean;
Label m;
Begin
 m: Result:=False;  c:='';
 If n>(l+1) Then Exit;
 While True Do
  Begin
   If s[n] In WordChars Then Break;
   If n=l Then Break;
   Inc(n);
  End;
 c:=s[n];  Inc(n);
 While True Do
  Begin
   If s[n] In WordChars Then c:=c+s[n] Else Break;
   If n=l Then Break;
   Inc(n);
  End;
 If Length(c)<=p_nMinWordLength Then GoTo m Else Result:=True;
End;

Begin
If Trim(s)='' Then Exit;
wrds:=TStringList.Create;
wrds.Sorted:=True;
l:=Length(s); n:=1;
While _ReadWord Do If c<>'' Then
 Begin
  r:=AnsiLowerCase(c);
  k:=wrds.IndexOf(r);
  If k=-1 Then wrds.AddObject(r,TObject(0)) Else wrds.Objects[k]:=TObject(Integer(wrds.Objects[k])+1);
 End;
Form1.Memo2.Lines.Add('Строка "'+s+'"');
For k:=0 to wrds.Count-1 Do
 Form1.Memo2.Lines.Add('  Количество слов "'+wrds[k]+'":'+IntToStr(Integer(wrds.Objects[k])+1));
Application.ProcessMessages;
wrds.Free;
End;

procedure TForm1.sButton1Click(Sender: TObject);
Var
i:Integer;
begin
For i:=0 to Memo1.Lines.Count-1 Do ParseWords(Memo1.Lines[i],2);
end;


и будет тебе счасте... если разберешся конечно...


Dyakon_Frost   (2006-04-04 12:26:00) [7]

Всем спасибо проблема решена:


procedure Slova(str:TEdit;M:TMemo);
var s,w:string;
 k,i,wc:byte;
begin
str.Text:=str.Text+' ';

k:=Pos(' ',str.Text);
while (k>0) do
 begin
 w:=copy(str.Text,1,k-1);
 s:=copy(str.Text,k+1,255);
 i:=Pos(' '+w+' ',' '+str.Text);
 wc:=1;
 while (i>0) do
   begin
   inc(wc);
   str.Text:=copy(str.Text,1,i-1)+copy(str.Text,i+length(w)+1,255);
   i:=Pos(' '+w+' ',' '+str.Text);
   end;
 M.Lines.add := 'слово: ''' + w + ''' встречается ' + inttostr(wc) + ' раз';
 k:=Pos(' ',str.Text);
 end;

end;


Bless   (2006-04-04 12:15:00) [8]

to Dyakon_Frost>

Приведи свой код для одного пробела, если не трудно.


Плохиш   (2006-04-04 12:14:00) [9]


> Dyakon_Frost ©   (04.04.06 12:11) [3]
> Проблема в том, что пробелов между словами может быть много!

И в чём проблема? Надо просто усвоить, что пробел - это не слово и считать их не надо.


Dyakon_Frost   (2006-04-04 12:14:00) [10]

и это тоже, хотя не такая большая проблема как пробелы


vovnuke   (2006-04-04 12:13:00) [11]

между словами могут быть еще и не пробелы, так что ...


Dyakon_Frost   (2006-04-04 12:11:00) [12]

Проблема в том, что пробелов между словами может быть много! И я немогу что-то представить себе алгоритм избавления от этой проблемы!


Bless   (2006-04-04 12:10:00) [13]

Судя по
Заранее спасибо.
затруднений нет :)


Ega23   (2006-04-04 12:07:00) [14]

Ну и в чём затруднение?


Наверх

Титульная страница Поиск, карта сайта Написать письмо