回 帖 发 新 帖 刷新版面

主题:C++出血者请教Delphi的一例程序。。。大哥受教来。。。。

下面是一段用Delphi编写的算术编码程序
[b][color=800000]哪位大哥   有时间给耐心做个指点。。[/color][/b]
[b]也熟悉C语言最好,能对源代码做个注释拨。。。[/b]
受教。。。

  算术编码是把一个信源表示为实轴上0和1之间的一个区间,信源集合中的每一个元素都用来缩短这个区间。



   算术编码的过程如下:



(1)       设定编码区间的高段为h,编码区间的长度为g,endc为编码字符分配的高段,startc



为字符分配区间的低端。



(2)       根据有限的信源估算出各元素的概率。



(3)       杜宇编码的元素a1,根据(2)估算的概率和区间,计算出该元素编码后的新的l,和h。其公式如下:



         h = startc + g* k;



         l = endc + g* k1;




[em8][em17][em17][em17]

回复列表 (共1个回复)

沙发

其具体程序如下:            
 
const  ca = 0.2;  ce = 0.3;

ci = 0.2;  co = 0.2;

      cu = 0.1;
var

  form1: tform1;

   s: string;

   startc, endc: extended;

implementation

{$r *.dfm}

procedure convertto(s: string; var startc, endc: extended);{将字符串变为数值}

var n, i: integer;

    c: char;

    g: extended;

begin

    startc := 0;

    endc := 1;

    n := strlen(pchar(s));

    for i := 1 to n do

    begin

       c := s[i];

       g := endc - startc;

       case c of

       'a':

         begin

            endc :=startc  + g * ca;

            startc := startc + g * 0;

         end;

       'e':

          begin

            endc := startc + g * (ca + ce);

            startc := startc + g * ca;

         end;

       'i':

          begin
            endc := startc + g * (ca + ce + ci);

            startc := startc + g * (ca + ce);

         end;

'o':

          begin

            endc := startc + g * (ca + ce + ci + co);

            startc := startc + g * (ca + ce + ci);
         end;

       'u':

          begin
            endc := startc + g * (ca + ce + ci + co + cu);

            startc := startc + g * (ca + ce + ci + co);

         end;


       else

           begin
            showmessage(' 输入的字符串有误 ');

            exit;

           end;

      end;

    end;
end;

procedure nemuricaltostr(var s: string; var startc, endc: extended);

{将数值转换为字符串}

const eps = -1e-5;

begin

  if startc-0.2 < -eps  then

    if (endc- 0.2<= -eps) and (endc > startc) then

    begin

       startc := startc / 0.2;

       endc := endc / 0.2;

       s := s + 'a';

       if (startc <>0) or (endc <> 1) then
          nemuricaltostr(s,startc,endc);

   end;

  if (startc- 0.2 >= eps) and (startc-0.5 < -eps) then

 if (endc-0.5<= -eps) and (endc>startc) then

    begin

       startc := startc - 0.2;

       endc := endc - 0.2;

       startc := startc / 0.3;

       endc := endc / 0.3;

       s := s + 'e';
       if (startc <>0) or (endc <> 1) then

          nemuricaltostr(s,startc,endc);

  end ;

  if (startc- 0.5>= eps) and (startc- 0.7< -eps) then

    if (endc-0.7<= -eps) and (endc>startc) then

    begin

       startc := startc - 0.5;

       endc := endc - 0.5;

       startc := startc / 0.2;

       endc := endc / 0.2;

       s := s + 'i';

       if (startc <>0) or (endc <> 1) then

          nemuricaltostr(s,startc,endc);

  end ;
  if (startc-0.7 >= eps) and (startc-0.9 < -eps) then

    if (endc-0.9<=-eps) and (endc>startc) then

    begin
       startc := startc - 0.7;

       endc := endc - 0.7;
       startc := startc / 0.2;
       endc := endc / 0.2;

       s := s + 'o';

       if (startc <>0) or (endc <> 1) then

          nemuricaltostr(s,startc,endc);

  end ;
  if (startc -0.9>=eps) and (startc-1 < -eps) then

if (endc-1<= -eps) and (endc>startc) then

    begin
       startc := startc - 0.9;

       endc := endc - 0.9;
       startc := startc / 0.1;
       endc := endc / 0.1;
       s := s + 'u';
       if (startc <>0) or (endc <> 1) then

          nemuricaltostr(s,startc,endc);

    end;


end;

procedure tform1.button1click(sender: tobject);
begin
   s := edit1.text;

   convertto(s,startc,endc);

   edit2.text := floattostr(startc);
   edit3.text := floattostr(endc);

end;

procedure tform1.button2click(sender: tobject);

begin

    s := '';
    startc := strtofloat(edit2.text);
    endc := strtofloat(edit3.text);

    nemuricaltostr(s,startc,endc);
    edit1.text := s;

end;

我来回复

您尚未登录,请登录后再回复。点此登录或注册