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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2014, 21:24   #1
Vesnushka_me
Новичок
Джуниор
 
Регистрация: 26.01.2014
Сообщений: 2
Печаль Реализовать процедуру вычисления энтропии для текстового файла на английском языке.

Задача: Реализовать процедуру вычисления энтропии для текстового файла на английском языке. В процедуре необходимо подсчитывать частоты появления символов (прописные и заглавные буквы не отличаются, знаки препинания рассматриваются как один символ, пробел является самостоятельным символом), которые можно использовать как оценки вероятностей появления символов. Затем вычислить величину энтропии Шеннона. Точность вычисления -- 4 знака после запятой. Обязательно предусмотреть возможность ввода имени файла, для которого будет вычисляться энтропия.

Начала решать с подсчета количества символов в файле.

Код:
var f:text;
buf, s: string;
m:integer;

begin
assign(f,'y:\pascal\lala.txt');
reset(f);
repeat
readln(f,buf);
s:=s+buf;
until eof(f);
m:=length(s);
writeln(m);
end.
Не могу сообразить, как подсчитать частоту появления. Вообще с помощью чего это сделать? С помощью массива?
Помогите и направьте, пожалуйста. Долго уже мучаюсь, не пойму никак(



________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 26.01.2014 в 22:56.
Vesnushka_me вне форума Ответить с цитированием
Старый 26.01.2014, 21:48   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Да, наверное надо массив частот. Лучше относительных частот. Это называется статистический ряд.
Ваша строка s - это тоже фактически массив символов, типа вариационного ряда. Ряд вариант - конкретных случайных символов.
Надо написать функцию, которая по строке s вычислит статистический ряд относительных частот.
Код:
type statR=array[1..28]of Real;
function fStat(s:string):statR;
// и т.д.
28 = 26 букв + пробел + любой из . , ; - ! ? ( )
Непонятно правда, как понимать многоточие в тексте, или излишнюю экспрессию, типа !!!

PS Код строчной буквы и прописной отличается на $20 (32 в десятичной). Например A - $41, a - $61

Последний раз редактировалось type_Oleg; 26.01.2014 в 21:53.
type_Oleg вне форума Ответить с цитированием
Старый 26.01.2014, 21:55   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Может так?
Описываем множество символов - знаки препинания.
Описываем массив с целыми элементами.
Читаем строку из файла. Просматриваем строку по символьно до конца строки.
Преобразуем символ в верхний регистр. Проверяем попадание символа в множество знаков препинания. Если это знак препинания, то +1 в первый элемент массива. Если это пробел, то +1 во второй элемент массива.
Если это буква или цифра, то определяем ее код: Типа: <Символ> - '0' + 2 (тут надо подумать) и +1 в соответствующий элемент массива.
Затем читаем и обрабатываем следующую строку и так до конца файла.
Теперь у нас есть кол-во символов и массив с частотой их появления в тексте.


Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 26.01.2014, 22:52   #4
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Вот так например - расчет относительных частот. Относительная частота = частота / объем выборки. Поэтому Real, см выше.
Код:
function fStat(s:string):statR;
const
 LETTER='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
 PUNCT='.,;-!?()';
var n,i,j:Integer;
  tmp:statR;
begin
 for i:=1 to 28 do tmp[i]:=0;
 n:=Length(s);
 for i:=1 to n do
  begin
   for j:=1 to 26 do
    if (s[i]=LETTER[j])or(s[i]=LETTER[j+26])
     then tmp[j]:=tmp[j]+1/n;
   if (s[i]=' ')then tmp[27]:=tmp[27]+1/n;
   for j:=1 to 8 do
    if (s[i]=PUNCT[j])then tmp[28]:=tmp[28]+1/n;
  end;
 fStat:=tmp;
end;
type_Oleg вне форума Ответить с цитированием
Старый 04.02.2014, 18:19   #5
Vesnushka_me
Новичок
Джуниор
 
Регистрация: 26.01.2014
Сообщений: 2
По умолчанию

Спасибо большое за участие!
Пока не смотрела. Как сделаю, напишу обязательно, как получилось)
Vesnushka_me вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Используя очередь, написать процедуру или функцию,для вычисления среднего геометрического элементов типизированного файла (Паскаль BumBum4ik Помощь студентам 0 04.01.2014 18:12
Для каждой введенной цифры (0–9) вывести соответствующее ей название на английском языке (0 — zero, 1 — one, 2 — two, ...) Delphi Ирина Анатольевна Помощь студентам 1 16.05.2012 08:34
Нужен Mobile Developer кто может писать статьи для сайта на английском языке KateTest Фриланс 0 22.02.2012 03:01
фильм на английском языке с субтитрами на русском и английском veter_s_morya Свободное общение 6 04.05.2011 13:29
HELP! Необходим скрипт на VB, автоматизирующий стандартную процедуру импорта из текстового файла Kerguru Microsoft Office Access 1 17.12.2009 20:33