📄 shannoncode.cpp
字号:
#include <iostream>//输入输出
#include <cmath>//用log计算
#include <string>//以后要用标准命名空间的std::string
int MAX_SOURCE=6 ;
//定义p(x),你可以改成用户交互式输入
static double *px=new double[MAX_SOURCE];//={0.25,0.25,0.20,0.15,0.10,0.05};
//pa(x)
static double *pax=new double[MAX_SOURCE];
//对double型数组排序
void sort(double*,int );
//保存编码后的结果
std::string *code;//=new std::string[MAX_SOURCE];
//将小数的小数点后n位转化为二进制,没必要全部转化哦
std::string dtob(double,int n);
void main()
{
int i,j,k;
std::cout<<"请输入概率的总个数:";
std::cin>>MAX_SOURCE;
std::cout<<std::endl;
double temp=0;
do
{
std::cout<<"请输入概率(总和为 1):";
for(i=0;i<MAX_SOURCE;i++)
{
std::cin>>px[i];
temp+=px[i];
}
}
while(temp!=1);
sort(px,6);//排序
for(i=0;i<MAX_SOURCE;i++)
for(j=0;j<i;j++)
pax[i]+=px[j];//累加
//
std::cout<<"概率为:"<<std::endl;
for(i=0;i<MAX_SOURCE;i++)
std::cout<<"px"<<i<<"= "<<px[i]<<" ";
std::cout<<"\n"<<std::endl;
std::cout<<"累加后:"<<std::endl;
for(i=0;i<MAX_SOURCE;i++)
std::cout<<"pax"<<i<<"= "<<pax[i]<<" ";
std::cout<<"\n"<<std::endl;
//
for(i=0;i<MAX_SOURCE;i++)
{
std::cout<<"概率 px"<<i<<"= "<<px[i]<<"\t";
double t=-(log(px[i])/log(2));
k=(t-(int)t)?(int)t+1:(int)t;//求码长
std::cout<<"码长k= "<<k<<" 编码:";
code[i]=dtob(pax[i],k);//编码过程
std::cout<<code[i]<<std::endl;
}
std::cout<<std::endl;
}
//冒泡排序,简单,注释略
void sort(double* p,int l )
{
int i,j;
for(i=0;i<l;i++)
for(j=i;j<l;j++)
if (p[i]<p[j])
std::swap(p[i],p[j]);
}
std::string dtob(double d,int n)
{
std::string c;
c.resize(20);//分配足够空间
for (int i=0;i<=n;i++)
{
d*=2;
if((int)d)//个位数为1
{
d-=1;
c[i]='1';
}
else//个位数为0
c[i]='0';
}
c.at(n)='\0';
return c;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -