Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 702

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!

Я хочу создать программу в Delphi, основной функцией которой будет подсчет частоты встречаемых символов в тексте. к примеру создаем тупо блокнот, в который грузим текст. тыкаем кнопку подсчета, и выводится в StingGrid частота встречаемости, которая расчитывается по формуле...
частота=количество символа(одного) в тексте / общее количество символов текста. вот... но пока что он считает у меня только кол-во слов в тексте и все((

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. const DelSym = ' .,!?';
  3. var Text,Word: string; i: integer;
  4. begin
  5. Text:=Memo1.Lines.Text;
  6. for i := 1 to Length(Text) do
  7. if Pos(Text[i],DelSym) > 0 then
  8. Text[i]:=',';
  9.  
  10. if Text[1] = ',' then
  11. Delete(Text,1,1);
  12. while Pos(',,',Text) > 0 do
  13. Delete(Text,Pos(',,',Text),1);
  14.  
  15. repeat
  16. Word:=Copy(Text,1,Pos(',',Text)-1);
  17. Delete(Text,1,Length(Word)+1);
  18. ListBox1.Items.Add(Word);
  19. until Length(Text) = 0;
  20.  
  21. end;
  22.  
  23.  
  24. procedure TForm1.FormCreate(Sender: TObject);
  25. var
  26. i: Integer;
  27. begin
  28. StringGrid1.RowCount:=257;
  29.  
  30.  
  31. for i := 0 to 255 do
  32. begin
  33. StringGrid1.Cells[0,i+1]:=IntToStr(i);
  34. StringGrid1.Cells[1,i+1]:=Chr(i);
  35. end;
  36. end;


Feniks257 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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™

min@y™ (статус: Доктор наук), 30 октября 2011, 08:40 [#1]:

В качестве бонуса посмотри вот эту мою рукопись. Вдруг понадобится?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Feniks257

Feniks257 (статус: Посетитель), 30 октября 2011, 18:29 [#2]:

min@y™: Интересно, откуда такая рукопись))) Спасибо за модуль работы с кодировками. :)
min@y™

min@y™ (статус: Доктор наук), 30 октября 2011, 21:13 [#3]:

Цитата (Feniks257):

Интересно, откуда такая рукопись

Было дело...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:54
Выполнено за 0.03 сек.