Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.12.2008, 17:47
sokol sokol вне форума
Прохожий
 
Регистрация: 04.12.2008
Сообщения: 3
Репутация: 10
Восклицание никак не могу посчитать :(

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

подскажите пожалуйста и если можно с примером решения.

заранее благодарен
Ответить с цитированием
  #2  
Старый 21.12.2008, 01:06
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

ничего сложного в этом нет. если считать словами любые символы, не считая пробелов, то задача решается итерационным использованием функции Pos, пока она не станет равной -1. если слова могут разделяться некоторыми символами, то лучше анализировать текст посимвольно, используя 3 счетчика-для количества слов, для пробелов и для длины слова, обнуляющийся при достижении символа-разделителя. например
Код:
var c, i, j, k : integer;
str:string;
const del: set of char = [',', '.']; // символы-разделители
...
begin
  i:=0; // пробелы
  j:=0; // слова
  k:=0; // длина слова
  for c:=1 to length(str)do // в str лежит нужный текст
  begin
    if (str[c] in del)then // если символ - разделитель
      if k>0 then // если перед символом было слово
        begin
          inc(j); // добавляем слово
          k:=0; // и обнуляем счетчик его длины
        end
      else
    else // если другой символ
      begin
        if (str[c]=' ')then // если пробел
        begin
          if k>0 then // если перед пробелом было слово
            inc(j); // добавляем слово
          inc(i); // добавляем пробел
          k:=0; // обнуляем счетчик длины слова
        end
        else // если обычная буква
        inc(k); // увеличиваем счетчик длины слова
      end;
  end;
// дальше надо просто вывести содержимое i и j
end;
__________________
РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت
Ответить с цитированием
  #3  
Старый 21.12.2008, 01:23
sokol sokol вне форума
Прохожий
 
Регистрация: 04.12.2008
Сообщения: 3
Репутация: 10
По умолчанию

ага, т.е. мы сначала удалили ненужные знаки.....ясненько

а так можно вывести?? правда выводит ответы 0 и 0
Edit1.Text:=inttostr(i);
Edit2.Text:=inttostr(j);


спасибо огромное!!!!

Последний раз редактировалось sokol, 21.12.2008 в 01:37.
Ответить с цитированием
  #4  
Старый 21.12.2008, 13:19
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

вообще-то мы ничего не удаляем.
выводить ответы как раз так и надо. а переменной str присвоено значение? и еще: если текст в несколько строчек, то в набор del надо добавить символы #13 и #10. а если текст лежит в memo, то код будет как этот
Код:
var c,l, i, j, k : integer;
const del: set of char = [',', '.', '<', '>', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '+', '=', '`', '~', '/', '?', '''', '"', ':', ';', '\', '|', '№', '[', ']', '{', '}']; // разнообразные символы-разделители
...
begin
  i:=0; // пробелы
  j:=0; // слова
  k:=0; // длина слова
  for l:= 0 to Memo1.Lines.Count-1 do // обрабатываем построчно
  for c:=1 to length(Memo1.Lines.Strings[l]) do // считаем в l-той строке
  begin
    if (Memo1.Lines.Strings[l][c] in del)then // если символ - разделитель
      if k>0 then // если перед символом было слово
        begin
          inc(j); // добавляем слово
          k:=0; // и обнуляем счетчик его длины
        end
      else
    else // если другой символ
      begin
        if (Memo1.Lines.Strings[l][c]=' ')then // если пробел
        begin
          if k>0 then // если перед пробелом было слово
            inc(j); // добавляем слово
          inc(i); // добавляем пробел
          k:=0; // обнуляем счетчик длины слова
        end
        else // если обычная буква
        inc(k); // увеличиваем счетчик длины слова
      end;
  end;
Edit1.text:=inttostr(i);
Edit2.text:=inttostr(j);
end;
код работает. проверено.
еще можно проверять принадлежность символа не к разделителю, а к обычной букве.
__________________
РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت
Ответить с цитированием
  #5  
Старый 21.12.2008, 13:44
sokol sokol вне форума
Прохожий
 
Регистрация: 04.12.2008
Сообщения: 3
Репутация: 10
Хорошо

теперь всё работает
спасибо еще раз, очень выручил!!
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:23.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter