永发信息网

请教算术编码的算法?

答案:1  悬赏:60  手机版
解决时间 2021-01-22 20:14
请教算术编码的算法?
最佳答案
h = StartC + g* K;
l = Endc + g* K1;
其具体程序如下:

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;
end.
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
澄海羽毛球协会波力训练馆地址有知道的么?有
飞龙宾馆(恩施宣恩)地址好找么,我有些事要过
若两个连续整数的乘积比它们的和大29,其中较
It will make big difference if this experi
莜面极具风味怎么做好吃又简单,做法图解分享
佳缘客栈(恩施宣恩)地址在什么地方,我要处理
兰博士刹车片怎么样
双桶洗衣机,就甩干桶没有以前有劲了!请教师
如图所示的现象中能说明气体的压强跟流速有关
那都是很好很好的 可我偏不喜欢什么意思
青岛日报报业集团的简介
东山运动羽毛球馆地址在什么地方,我要处理点
雅轩商务宾馆(恩施宣恩)地址在哪,我要去那里
DNF 一共有几个初始角色和转职职业?
羽扬球馆地址在哪,我要去那里办事,
推荐资讯
视网膜黄斑病变和眼底黄斑病变有区别吗?
情之海度假酒店地址有知道的么?有点事想过去
单选题话说得比较得体的一项是:A.你知道吗?
庞家嘴村地址好找么,我有些事要过去,
已经有额度的花呗淘宝号被禁止购买
东城之歌KTV地址在什么地方,想过去办事,
陆风汽车地址在什么地方,想过去办事,
三草两木杨洋美妆微体验店地址有知道的么?有
千千寻纯美空间地址有知道的么?有点事想过去
爱普生230打印机不能开机是怎么回事啊
单选题需要对某种果树施用磷肥和氮肥,下列符
机动车在广州违法停车罚款可以在顺德交吗?哪
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?