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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2011, 01:19   #1
LoveCookies
Новичок
Джуниор
 
Регистрация: 05.11.2011
Сообщений: 1
Печаль Эффективное кодирование информации методами Шеннона-Фано и Хаффмана в Delphi

Доброго времени суток!
Может кто помочь в написании?В делфи почти не шарю( Проблема удалить из массива повторяющиеся элементы и записать их в стринггрид. Также почему то за 1 элемент массива принимается аж целое слово( возможно из за разделителя ' ', пыталась писать все символы через пробел :D эта проблема решается, но увеличивается длина строки и коды будут неверны, так что это не выход).
Может кто нибудь попроще объяснить как построить бинарное дерево для хаффмана, и разделение на подгруппы в шенноне-фано? Так просто посчитать просто, а вот как это написать не знаю(

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Grids;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    StringGrid1: TStringGrid;
    BitBtn1: TBitBtn;
    Button1: TButton;
    Memo1: TMemo;

    procedure Button1Click(Sender: TObject);
       function GetSubStr(st:string; expl:string; n:integer):string;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  A:array[0..100] of string;
  c:array[0..100] of string;
  count:array[0..100] of string;
  Form1: TForm1;

implementation

{$R *.dfm}


function TForm1.GetSubStr(st:string; expl:string ;n:integer):string;
Var p,i:integer;
Begin
for i:= 1 to n-1 do
begin
p:=pos(expl,st);
st:=copy(st,p+1,Length(st)-p);
while (pos(expl,st)=1) and (length(st)>0) do
delete(st,1,1);
end;
p:=pos(expl,st);
if p<>0 then result:=copy(st,1,p-1)
else result:=st;
End;

procedure TForm1.Button1Click(Sender: TObject);
var i,j,b,f:byte; k,st:string;   n,ch,l:integer;
begin
 l:=length(edit1.text);
  for i:=1 to l do
a[i]:=GetSubStr(Edit1.text,' ',i);
  for i:=1 to l do
st:=st+IntTostr(i)+' '+a[i]+#13;
  ShowMessage(st);
memo1.lines.add(floattostr(l));

with stringgrid1 do begin
Cells[1, 0] := 'Символ';
Cells[2, 0] := 'Число повторений';
Cells[3, 0] := 'Вероятность';
Cells[4, 0] := 'Сортировка вероятности';
Cells[5, 0] := 'Код Шеннона-Фано';
Cells[6, 0] := 'Код Хаффмана';

end;
 //Вычисляем количество повторений каждого символа
//тут наверно можно сразу исключить повторы
//и записать в stringgrid1
for i:=0 to l+1 do begin   ch:=1;
for j:=i+1 to l-1  do begin
if a[i]=a[j] then
inc (ch);
 end;
 count[i]:=floattostr(ch);
stringgrid1.cells[2,i+1]:=count[i]; end;
//Вычисление выроятностей
for i:=1 to l+1 do begin
stringgrid1.cells[3,i]:=format('%.5f',[strtofloat(count[i])/l]);

 end;
//Сортировка вероятностей по невозрастанию
for i:=0 to l do
c[i]:=stringgrid1.cells[3,i];
for i:=0 to l-1 do
for j:=i+1 to l do
if c[i]<c[j] then
begin
k:=c[i];
c[i]:=c[j];
c[j]:=k;
  end;
for i:=1 to l+1 do
stringgrid1.cells[4,i]:=c[i];
end;
end.
LoveCookies вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Теория информации. Метод сжатия Шеннона-Фано, Хаффмена и арифметический Fantazerishka Помощь студентам 0 15.02.2011 16:25
Сжатие информации методом Хаффмана на С++ BaSoff Общие вопросы C/C++ 3 18.11.2009 19:51
Архивация методом Шеннона-Фано Ketu Паскаль, Turbo Pascal, PascalABC.NET 2 13.10.2008 19:42
Кодирование информации!!!!! Girl Безопасность, Шифрование 0 04.03.2007 14:40
кодирование информации. Alar Общие вопросы Delphi 1 11.02.2007 19:26