⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 算术编码.cpp

📁 算术编码是将累积分布函数的区间(0
💻 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 + -