📄 算术编码.cpp
字号:
#include <stdio.h>
#include <math.h>
#include <string.h>
int n,num; //要输入的信源符号个数n及消数息序列个num
char s[50]; //信源符号集
double p[50]; //信源符号概率分布
char c[1000]; //消息序列
double decimal; //编码后得到的十进制小数
double b[50][2]; //存放上下限的数组
void input();
void bound();
void coding();
void decoding();
void menu();
void main();
void input()
{
int i,j;
printf("\n输入信源符号个数:");
scanf("%d",&n);
printf("\n输入信源符号集及其概率分布:\n");
for(i=0;i<n;i++)
{
printf("\n输入%d个信源符号:",i+1);
scanf("%s",&s[i]);
printf("\n输入第%d个符号的概率:",i+1);
scanf("%lf",&p[i]);
}
}
void bound(int k) //求每个信源符号初始编码间隔
{
int i,j;
double t;
for(i=0;i<k;i++)
{
t=0;
for(j=0;j<i;j++)t=t+p[j];
b[i][0]=t; //下限
b[i][1]=b[i][0]+p[i]; //上限
}
/*for(i=0;i<k;i++)
{
printf("\nb[%d][0]=%lf",i,b[i][0]);
printf("\nb[%d][1]=%lf",i,b[i][1]);
}*/
}
void coding()
{
double Low=0,High; //当前编码的下限和上限 ,Low初始为0
double low,high; //中间变量,用来计算下一个编码符号的当前间隔的上限和下限
double d=1; //当前间隔之间的距离,初始为1
int i,j;
bound(n); //调用bound()函数,求每个信源符号初始概率区间的上下限
printf("\n★★★★★编码过程★★★★★\n");
printf("\n输入消息序列:\n");
scanf("%s",c);
num=strlen(c);
for(i=0;i<num;i++)
for(j=0;j<n;j++) //循环计算 Low 、High
{
if(c[i]==s[j])
{
low=Low+d*b[j][0];
high=Low+d*b[j][1];
Low=low;
High=high;
d=d*p[j];
}
}
decimal=Low;
printf("编码结果: %lf\n",decimal);
menu();
}
void decoding()
{
int i,j,k,q=0;
char infor[1000]; //存放译码后的消息序列
double Low=0,High=0; //当前编码的下限和上限
double low,high; //中间变量,用来计算下一个编码符号的当前间隔的上限和下限
double code; //要译码的小数
double d=1; //当前间隔之间的距离,初始为1
bound(n); //调用bound()函数,求每个信源符号初始概率区间的上下限
printf("\n★★★★★译码过程★★★★★\n");
printf("\n输入要译码的小数:");
scanf("%lf",&code);
for(k=0;k<num;k++)
{
for(i=0;i<n;i++)
{
if(code>=(Low+d*b[i][0])&&code<(Low+d*b[i][1]))
{
low=Low+d*b[i][0];
high=Low+d*b[i][1];
Low=low;
High=high;
d=d*p[i];
infor[q]=s[i];
q++;
}
}
}
printf("\n译码结果: ");
for(j=0;j<num;j++)
{
printf("%c",infor[j]);
}
menu();
}
void menu()
{
int m;
printf("\n\n★1 *****编码*****\n");
printf("\n★2 *****译码*****\n");
printf("\n请选择:");
scanf("%d",&m);
if(m==1)coding();
else
if(m==2)decoding();
}
void main()
{
input();
menu();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -