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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2008, 19:37   #1
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию Подсчет слов

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

Задача собствено такая:

Предположем имеется файл с текстом мне нужно посчитать сколько раз встречается слово например форум.

Можно загнать весь текст в массив а затем сравнивать кол-во совпадений, но ведь запятые точки пишут слитно с предшествующем текстом, а тогда это работать не будет.

Подскажите пожалуйсто (советом, кодом) как бы это осуществить?

Заранее благодарен.
Я часть той силы, что вечно хочет зла, но вечно совершает благо..
Stanislav вне форума Ответить с цитированием
Старый 26.08.2008, 20:46   #2
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Создай массив с знакоми припинания, и проверь, сначало просто слово, а потом с массивом
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 26.08.2008, 21:08   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Если чисто по Паскалевски, то так:
Код:
k:=0;
for i:=1 to length(text) do
   if i=pos('форум',text) then
      begin
       k:=k+1;
       delete(s,i,5));
   end;
Хотя в Делфи наверное есть специальная процедура поиска.
puporev вне форума Ответить с цитированием
Старый 26.08.2008, 22:19   #4
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию

Цитата:
Сообщение от puporev Посмотреть сообщение
Если чисто по Паскалевски, то так:
Код:
k:=0;
for i:=1 to length(text) do
   if i=pos('форум',text) then
      begin
       k:=k+1;
       delete(s,i,5));
   end;
Хотя в Делфи наверное есть специальная процедура поиска.
Хотелось бы надеется на это.. есть еще вариант в дельфиворд есть описание функции: поиск по ричедиту, можно эту функцию в цикл поместить и так до конца файла... да вариантов куча... просто хотелось бы понять как попроще что-ли и правильнее..
Я часть той силы, что вечно хочет зла, но вечно совершает благо..
Stanislav вне форума Ответить с цитированием
Старый 26.08.2008, 22:38   #5
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Pos - самое удобное.
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 26.08.2008, 22:57   #6
Gorychev
Участник клуба
 
Аватар для Gorychev
 
Регистрация: 08.03.2008
Сообщений: 1,537
По умолчанию

Создай обьект класса TStringList, загрузи в него файл с помощью LoadFromFile, пройдись по всем записям циклом for, поставь условие внутри цикла - если функция Pos возвратила не нулевое значение, то значит слово найдено - счетчик +1.
Роs возвращает позицию вхождения последовательности символов в заданной строке, если ничего не найдено возвращает 0.
О классе TStringList почитайте тут
Gorychev вне форума Ответить с цитированием
Старый 27.08.2008, 02:03   #7
dr.Chas
***
Участник клуба
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию

Цитата:
Сообщение от Stanislav Посмотреть сообщение
Хотелось бы надеется на это.. есть еще вариант в дельфиворд есть описание функции: поиск по ричедиту, можно эту функцию в цикл поместить и так до конца файла... да вариантов куча... просто хотелось бы понять как попроще что-ли и правильнее..
а зачем тебе так всё усложнять, это тебе подходит.

Последний раз редактировалось dr.Chas; 27.08.2008 в 02:06.
dr.Chas вне форума Ответить с цитированием
Старый 27.08.2008, 04:41   #8
KORN
Банхаммер
Участник клуба
 
Аватар для KORN
 
Регистрация: 17.02.2007
Сообщений: 1,754
По умолчанию

а мне кажется этот пример работать не будет...

на вскидку я могу предложить 2 варианта это если пробежаться циклом по всему тексту:

for i:=1 to length(text) do
if ansilowercase(copy(text, i, 5))='форум' then
inc(j);

либо через pos, но там надо будет удалять все слова после каждого раза... т.е. если к примеру есть текст: "я пришел на форум? а форум был поломан" то при первом проходе он наткнется на первое слово, а при втором проходе и последующих он так же будет натыкаться на первое слово форум т.к. эта функция ищет от начала текста...

следовательно нашли слово и удалили и увеличили результат...
Перед тем как спросить ищи на форуме и в GOOGLE
KORN вне форума Ответить с цитированием
Старый 27.08.2008, 08:06   #9
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
а мне кажется этот пример работать не будет...
Если кажется, креститься надо.
Вы невнимательно прочитали код. Там же написано
Цитата:
delete(s,i,5));
Этот пример нормально работает, а задача настолько примитивная, что устраивать дебаты по этому поводу просто несерьезно.

Последний раз редактировалось puporev; 27.08.2008 в 08:12.
puporev вне форума Ответить с цитированием
Старый 27.08.2008, 18:44   #10
Gorychev
Участник клуба
 
Аватар для Gorychev
 
Регистрация: 08.03.2008
Сообщений: 1,537
По умолчанию

Цитата:
просто хотелось бы понять как попроще что-ли и правильнее..
Алгоритм:
Цитата:
Создай обьект класса TStringList, загрузи в него файл с помощью LoadFromFile, пройдись по всем записям циклом for, поставь условие внутри цикла - если функция Pos возвратила не нулевое значение, то значит слово найдено - счетчик +1.
плюс то что сказал KORN
Цитата:
следовательно нашли слово и удалили и увеличили результат...
Реализация:
Код:
function GetCountWordInFile(const Text_file: string; Find_word: string; const Case_flag: integer): integer;
var str: TstringList; i, word_count: integer; s: string;
begin
word_count:= 0;
if FileExists(ExtractFilePath(application.ExeName) + Text_file) then
begin
 try
  str:= TStringList.Create;
  str.LoadFromFile(Text_file);
   if Case_flag = 1 then Find_word:= AnsiUpperCase(Find_word);

    for i:=0 to str.Count - 1 do
    begin
        s:= str[i];
        if Case_flag = 1 then   s:= AnsiUpperCase(s);
         while (pos(Find_word, s) <> 0) do
           begin
             delete(s, pos(Find_word, s), length(Find_word));
             inc(word_count);
           end;
    end;
  finally
   Str.Free;
 end;
end
else
  showmessage('Файл ' + ExtractFilePath(application.ExeName) + Text_file + ' не найден');
  result:= word_count;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // описание параметров GetCountWordInFile
  // первый параметр - имя текстового файла (файл должен находится в одной папке с проектом)
  //второй - искомая строка
  // третий: 0 - поиск с учетом регистра, 1 - без учета регистра
  caption:= inttostr(GetCountWordInFile('load.txt', 'forum', 1));
end;
Когдато писал подобное, вот решил выложить... Автору должно помочь, главное чтоб не тупо скопировал, а разобрался
Gorychev вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дана строка, состоящая из нескольких слов. Найти количество слов, которые содержат хотя бы одну букву "А" Mashaa Помощь студентам 13 09.12.2009 13:28
подсчет md5 Noor Компоненты Delphi 8 18.11.2009 08:22
Статистический подсчет. Reecon Microsoft Office Excel 8 23.04.2009 13:53
Подсчет траффика joker Win Api 9 11.01.2009 13:29
Подсчет r2n Общие вопросы Delphi 4 01.05.2007 05:48