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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2009, 21:00   #1
hydrogen
Пользователь
 
Регистрация: 27.10.2009
Сообщений: 19
По умолчанию Счётчик слов

Добрый вечер. Я пишу процедуру, которая в строке s считает слова, причём берёт каждое слово и считает его количество в строке. Всё вроде бы нормально написано, но где-то процедура зацикливается (зависает). Помогите разобраться с проблемой.
Код:
procedure TForm3.Button1Click(Sender: TObject);
var
  a:array[32..128] of char;
  n:array[192..255] of integer;
  c:array[32..128] of integer;
  summa,k,i,counter,g,p1,p2:integer;
  word,b2:string;
  m,b1:char;
  s2,s1:widestring;
begin
  if length(s)=0 then showmessage('Не выбран файл для редактирования!')
  else
begin
  for k:=32 to 127 do a[k]:=chr(k);
  a[128]:=chr(9);
  s1:=s;
  i:=0;
  repeat
   p1:=0;
   p2:=0;
   repeat
     p1:=p1+1;
     b2:=copy(s1,p1,1);
     b1:=b2[1];
     m:='a';
     for k:=192 to 255 do if pos(chr(k),s1)>0 then m:='b';
   until (b1 in ['а'..'я']) or (b1 in ['А'..'Я']) or (m in ['a'..'a']);
   for k:=192 to 255 do n[k]:=pos(chr(k),s1);
   k:=192;summa:=0;
   repeat
     summa:=summa+n[k];
     k:=k+1;
   until k=256;
   if summa=0 then p1:=0;
   p2:=p2+p1;
   repeat
     p2:=p2+1;
     b2:=copy(s1,p2,1);
     b1:=b2[1];
     m:='a';
     for k:=32 to 128 do if pos(a[k],s1)>0 then m:='b';
   until (b1 in [a[32]..a[128]]) or (m in ['a'..'a']);
   for k:=32 to 128 do c[k]:=pos(a[k],s1);
   k:=32;summa:=0;
   repeat
     summa:=summa+c[k];
     k:=k+1;
   until k=129;
   if summa=0 then p2:=length(s1);
   if (p1<>0) and (p1<=p2) then
   begin
     word:=copy(s1,p1,p2-p1);
     counter:=0;s2:=s1;
     repeat
       g:=pos(word,s2);
       counter:=counter+1;
       delete(s2,g,length(word));
     until g=0;
     i:=i+1;
     delete(s1,p1,length(word));
     form3.RichEdit1.Lines[i]:=word+'  '+inttostr(counter-1);
   end;
  until p1=0;
end;
end;
после удаления цик
Код:
repeat
until p1=0;
процедура всё равно виснет, значит это не она виновата.
hydrogen вне форума Ответить с цитированием
Старый 18.12.2009, 01:03   #2
.Phoenix
Форумчанин
 
Регистрация: 02.04.2009
Сообщений: 235
По умолчанию

Код:
var
  a:array[32..128] of char;
  n:array[192..255] of integer;
  c:array[32..128] of integer;
  summa,k,i,counter,g,p1,p2:integer;
  word,b2:string;
  m,b1:char;
  s2,s1:widestring;
begin
  if length(s)=0 then showmessage('Не выбран файл для редактирования!')
Переменная s не описана.
Всё гениальное - просто!
.Phoenix вне форума Ответить с цитированием
Старый 18.12.2009, 03:06   #3
Voody
Форумчанин
 
Регистрация: 22.06.2009
Сообщений: 310
По умолчанию

Цитата:
Сообщение от .Phoenix Посмотреть сообщение
Переменная s не описана.
думаю это из-за того, что:

Цитата:
которая в строке s считает слова
видимо S задается раньше.

И то, что:

Цитата:
где-то процедура зацикливается
вряд ли бы возникло, если бы переменная не была бы описана))

Разбираться в этом коде я не решился, поэтому решил написать свой.
Алгоритм: идем по строке S и выделяем слова, которые разделены пробелами. Каждое слово заносим в лист (Slova:TStringList;), а в A: array [1..100] of integer; ведем счетчик слов в соответствии с индексом слова в листе. И каждый раз сравниваем выделенное слово, есть ли оно в нашем списке. Если есть, то увеличиваем счетчик (А), если нет, то записываем слово в лист и счетчик устанавливаем единице.

В конце выводим в Мемо слова и их количество.

Код:
procedure TForm1.Button1Click(Sender: TObject);
var s0 :string;
    i:integer;
    Slova:TStringList;
    A: array [1..100] of integer;
begin 
 s0:='';
 Slova:=TStringList.Create;
 i:=1;
 while i <= length(s)+1 do
  begin
   if (s[i]<>' ') and (i<=length(s)) then
     s0:=s0+s[i]
   else
   if length(s0)>0 then
    begin
     if Slova.IndexOf(s0)=-1 then
      begin
       Slova.Add(s0);
       A[Slova.IndexOf(s0)+1]:=1;
      end
     else A[Slova.IndexOf(s0)+1]:=A[Slova.IndexOf(s0)+1]+1;
     s0:='';
    end;
    inc(i);
  end;
 for  i:= 1 to Slova.Count do
   Memo1.Lines.Add(Slova[i-1]+':'+IntToStr(A[i]));
 Slova.Free;
Voody вне форума Ответить с цитированием
Старый 18.12.2009, 13:20   #4
hydrogen
Пользователь
 
Регистрация: 27.10.2009
Сообщений: 19
По умолчанию

Voody, очень интересны Вы придумали, я учту этот вариант, но тут вот какая проблема: текст настоящий, поэтому в нём слова ограничены не только пробелами, но и знаками препинания, цифрами и прочими символами не являющимися русскими буквами. Поэтому я в своём алгоритме определял слова с помощью всех символов не являющимися русскими буквами, по коду от 32 до 127, а русские от 192 до 255.
.Phoenix, переменная S описана глобально, поэтому её нет в процедуре. А если бы она не была описана, то процедура у меня бы не зависала, так как она бы не компилировалась.
hydrogen вне форума Ответить с цитированием
Старый 18.12.2009, 14:08   #5
Voody
Форумчанин
 
Регистрация: 22.06.2009
Сообщений: 310
По умолчанию

Цитата:
Сообщение от hydrogen Посмотреть сообщение
Voody, очень интересны Вы придумали, я учту этот вариант, но тут вот какая проблема: текст настоящий, поэтому в нём слова ограничены не только пробелами, но и знаками препинания, цифрами и прочими символами не являющимися русскими буквами. Поэтому я в своём алгоритме определял слова с помощью всех символов не являющимися русскими буквами, по коду от 32 до 127, а русские от 192 до 255.
нет проблем) чуть модифицируем

добавляем

Код:
const nealf=',.?!%$ ';
в этой строке пишем все символы, которые не входят в понятие "слово" (знаки препинания, пробел, прочие символы, если хотите и цифры, хотя числа тоже считаются словами по правилам)

и в коде одно изменение:

Код:
if (Pos(s[i],nealf)=0) and (i<=length(s)) then
Voody вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дана строка, состоящая из нескольких слов. Найти количество слов, которые содержат хотя бы одну букву "А" Mashaa Помощь студентам 13 09.12.2009 13:28
по вводу слов в массив и подсчёт введённых слов -ushёl- Общие вопросы C/C++ 4 16.11.2009 00:45
счётчик Артур Иваныч Microsoft Office Excel 2 03.11.2009 11:52
Составить в алфавитном порядке список всех слов, встречающихся в тексте, и количество этих слов. KAPAHDAW Паскаль, Turbo Pascal, PascalABC.NET 2 17.02.2009 01:19
счётчик ZYRGiX HTML и CSS 7 26.12.2007 16:12