|
Вопрос # 5 702/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Я хочу создать программу в Delphi, основной функцией которой будет подсчет частоты встречаемых символов в тексте. к примеру создаем тупо блокнот, в который грузим текст. тыкаем кнопку подсчета, и выводится в StingGrid частота встречаемости, которая расчитывается по формуле...
частота=количество символа(одного) в тексте / общее количество символов текста. вот... но пока что он считает у меня только кол-во слов в тексте и все((
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
Приложение: Переключить в обычный режим- procedure TForm1.Button1Click(Sender: TObject);
- const DelSym = ' .,!?';
- var Text,Word: string; i: integer;
- begin
- Text:=Memo1.Lines.Text;
- for i := 1 to Length(Text) do
- if Pos(Text[i],DelSym) > 0 then
- Text[i]:=',';
-
- if Text[1] = ',' then
- Delete(Text,1,1);
- while Pos(',,',Text) > 0 do
- Delete(Text,Pos(',,',Text),1);
-
- repeat
- Word:=Copy(Text,1,Pos(',',Text)-1);
- Delete(Text,1,Length(Word)+1);
- ListBox1.Items.Add(Word);
- until Length(Text) = 0;
-
- end;
-
-
- procedure TForm1.FormCreate(Sender: TObject);
- var
- i: Integer;
- begin
- StringGrid1.RowCount:=257;
-
-
- for i := 0 to 255 do
- begin
- StringGrid1.Cells[0,i+1]:=IntToStr(i);
- StringGrid1.Cells[1,i+1]:=Chr(i);
- end;
- end;
 |
Вопрос задал: Feniks257 (статус: Посетитель)
Вопрос отправлен: 29 октября 2011, 21:30
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Feniks257!
Припустим, что в мемо загружен интересующий текст, а в StringGrid нужно вывести таблицу встречаемости.
var
t:array[char] of integer; // таблица для кол-ва символов
i:integer; // счетчик по строке
c:char; // символьный счетчик
s:string; // собственно сама строка
total:ingeger; // общее кол-во символов.
begin
// занулим массив
for c := #0 to #255 do
t[c] := 0;
s := memo1.lines.text; // собственно наш текст
// подсчет
for i := 1 to length(s) do
inc(t[s[i]]);
total := length(s);
// теперь вывод
for c = #0 to #255 do begin
i := ord(c) + 1; // номер строки
// символы с кодом до 32 - непечатные. Но могут встречатся ( к примеру 10 и 13 - перевод строки + возврат каретки, 8
- табуляция)
if (c < 32) then
StringGrid1.cells[0, i] := '#'+inttostr(ord(c))
else
StringGrid1.cells[0, i] := c;
StringGrid1.cells[1, i] := Floattostr(t[c]/total);
end;
end;
Понятное дело, что я считаю частоту с учетом всех символов. Если же нужно будет считать только к примеру кириллицу и без пробелов, то просто нужно будет сосчитать их общее кол-во. А для этого не обязательно пробегать по всей строке, а можно просто подсмотреть в массиве t.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 29 октября 2011, 22:03
Оценка за ответ: 5
Комментарий к оценке: О_о как я раньше о массивах не подумал... Большое спасибо)))
|
Мини-форум вопроса
Всего сообщений: 3; последнее сообщение — 30 октября 2011, 21:13; участников в обсуждении: 2.
|
min@y™ (статус: Доктор наук), 30 октября 2011, 08:40 [#1]:
В качестве бонуса посмотри вот эту мою рукопись. Вдруг понадобится?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Feniks257 (статус: Посетитель), 30 октября 2011, 18:29 [#2]:
min@y™: Интересно, откуда такая рукопись))) Спасибо за модуль работы с кодировками.
|
|
min@y™ (статус: Доктор наук), 30 октября 2011, 21:13 [#3]:
Цитата (Feniks257):
Интересно, откуда такая рукопись
Было дело...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|