資源簡介
分為encode.cpp和decode.cpp兩個文件,運行環境為VC++6.0

代碼片段和文件信息
#include
using?namespace?std;
#define?M?100?//最大消息長度
#define?N?4?//最大信源符號個數
class?decode
{
private:
char?symbol[N];?//?信源符號數組
char?s;?//用于接收信源符號的輸入
long?double?chance[N];?//信源符號對應概率
long?double?c;?//用于接收概率輸入
long?double?sum;?//概率和
long?double?code;?//待譯碼的字段
char?msg[M];?//消息內容
int?length;?//譯碼長度(譯碼停止標志)
int?count;?//實際信源符號個數
long?double?LowHigh;?//每次區間縮減后得到的新區間
long?double?lowhigh;
long?double?wid;?//信源符號概率寬度
public:
decode()?//構造函數
{
sum=0;
Low=0;High=0;
}
void?get_symbol();
void?get_code();
void?decoding();
~decode(){}?//析構函數
};
//獲取信源符號極其概率
void?decode::get_symbol()
{
cout<<“please?input?the?symbol?and?its?chance:“< for(int?i=0;i {
cin>>s>>c;
symbol[i]=s;
chance[i]=c;
sum+=c;
}
count=i;?//將實際信源符號個數賦給count
if(sum!=1)
{
cout<<“The?probability?you?input?has?mistakes!“< exit(-1);
}
}
//獲取譯碼字和譯碼長度
void?decode::get_code()
{
cout<<“Please?input?the?code?to?decode?it:“< cin>>code;
cout<<“Please?input?the?length?you?want?decode:“< cin>>length;
}
//算數譯碼過程
void?decode::decoding()
{
int?ij;
//判斷code落在第一個區間(首區間確定)
for(i=0;i {
if(code {
msg[0]=symbol[i-1];
break;
}
else
{
Low=High;
High+=chance[i];
wid=chance[i];
}
}
//區間縮減
for(i=1;i for(j=0;j {
low=Low;
high=low+wid*chance[j];
if(high>code)
{
msg[i]=symbol[j];
Low=low;?High=high;?wid=High-Low;
break;
}
else
Low=high;
}
//結果輸出
for(i=0;i cout< cout< }
int?main()
{
decode?d;
d.get_symbol();?//A?0.1?B?0.4?C?0.2?D?0.3
d.get_code();?//Java=0.5143876?C++=0.514388
d.decoding();
return?0;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2017-05-11?16:51??算術編碼C++簡單實現\
?????文件????????2050??2017-04-21?17:30??算術編碼C++簡單實現\decode.cpp
?????文件????????3122??2017-04-21?16:29??算術編碼C++簡單實現\encode.cpp
- 上一篇:進程調度算法(優先權)
- 下一篇:實現對任意格式文件壓縮 C++
評論
共有 條評論