![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
нужна помощь по вот какому элементарному вопросу: посчитать количество слов и пробелов в тексте.
Прочитал пример в котором необходимо было подсчитать количество наиболее встречаемых слов в тексте и вывести их в %-ном соотношении, но так и не понял как это переделать под свою задачу. подскажите пожалуйста и если можно с примером решения. заранее благодарен |
|
#2
|
||||
|
||||
|
ничего сложного в этом нет. если считать словами любые символы, не считая пробелов, то задача решается итерационным использованием функции 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
|
|||
|
|||
|
ага, т.е. мы сначала удалили ненужные знаки.....ясненько
а так можно вывести?? правда выводит ответы 0 и 0 Edit1.Text:=inttostr(i); Edit2.Text:=inttostr(j); спасибо огромное!!!! Последний раз редактировалось sokol, 21.12.2008 в 01:37. |
|
#4
|
||||
|
||||
|
вообще-то мы ничего не удаляем.
выводить ответы как раз так и надо. а переменной 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
|
|||
|
|||
|
теперь всё работает
спасибо еще раз, очень выручил!! |