📄 xiangnong.cpp
字号:
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
#define MAX 1000
struct
{
double x;//字符概率
double y;//字符概率类加
int k;//码字长度
int code; /*第i个消息符号的码字*/
}x[MAX];
void xi(double a[],int n)
{
int i,j,max;
double I=0,t,p=0;
for(i=0;i<n;i++){ x[i].x=a[i];}
cout<<"信源符号按概率从大到小排列:"<<endl;
for(i=0;i<n;i++)
{ max=i;
for(j=i+1;j<n;j++)
{
if(x[i].x<=x[j].x)
max=j;
t=x[i].x;
x[i].x=x[max].x;
x[max].x=t;
}
}
for(i=0;i<n;i++)
{ cout<<x[i].x<<"\t";}
cout<<endl;
cout<<"信源符号求累加和"<<endl;
for(i=0;i<n;i++)
{
if(i!=0){ p+=x[i-1].x;x[i].y=p;}
else x[i].y=0;
cout<<"Pa(x"<<i+1<<")="<<x[i].y<<endl;}
cout<<"码字长度:"<<endl;
for(i=0;i<n;i++)
{
I=-log(x[i].x)/log(2);
if(I-(int)I==0){x[i].k=(int)I;}
else x[i].k=(int)I+1;
cout<<"k"<<i+1<<"="<<x[i].k<<endl;
}
cout<<"码字:"<<endl;
for(i=0;i<n;i++)
{ double t=1;
for(j=0;j<x[i].k;j++)
{ t=t*0.5;
x[i].y=x[i].y-t;
if(x[i].y>=0) printf("1");
if(x[i].y<0) {x[i].y=-x[i].y;printf("0");}
}
cout<<endl;
}
}
void input()
{
int i,m;
double sum=0;
double a[MAX];
cout<<"输入信源个数:";
cin>>m;
cout<<"输入"<<m<<"个该信源概率:"<<endl;
for(i=0;i<m;i++){ cout<<"P(x"<<i+1<<"):";cin>>a[i]; sum=sum+a[i];}
if(sum!=1)
{ cout<<"输入概率和是"<<sum<<"不为1,请重输";
a[m]=NULL;
input();
}
else xi(a,m);
}
void main()
{ cout<<endl<<" \t\t\t \25 香农编码计算 \25"<<endl<<endl;
input();
cout<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -