?? fei nuo.txt
字號:
#include<iostream.h>
#include<math.h>
#include<iomanip.h>
#include<stdlib.h>
class T
{
public:
T() {}
~T();
void Create();
void Coutpxj();
void Coutk();
void Coutz();
void Print();
protected:
int n;
double *p;
double *pxj;
int *k;
double *mz;
};
void T::Create()
{
cout<<"請輸入信源符號個數:";
cin>>n;
p=new double[n];
cout<<"請分別輸入這"<<n<<"個概率:\n";
for(int i=0;i<n;i++)
cin>>p[i];
pxj=new double[n];
k=new int[n];
mz=new double[n];
double sum=0.0;
for(i=0;i<n;i++)
sum+=p[i];
if(sum!=1.0)
throw 1;
else
{
for(i=0;i<n;i++)
{
int k=i;
for(int j=i+1;j<n;j++)
if(p[k]<p[j]) k=j;
double m=p[i];
p[i]=p[k];
p[k]=m;
}
}
}
T::~T()
{
delete p;
delete pxj;
delete k;
delete mz;
}
void T::Coutpxj()
{
pxj[0]=0;
for(int i=1;i<n;i++)
{
pxj[i]=0;
for(int j=0;j<i;j++)
pxj[i]+=p[j];
}
}
void T::Coutk()
{
for(int i=0;i<n;i++)
{
double d=(-1)*(log(p[i])/log(2));
if(d-(int)d>0) k[i]=(int)d+1;
else k[i]=(int)d;
}
}
void T::Print()
{
cout<<"Xi"<<setw(8)<<"P(xi)"
<<setw(8)<<"Pa(xj)"
<<setw(8)<<"Ki"
<<setw(8)<<"碼字"
<<endl;
for(int i=0;i<n;i++)
{ cout<<"X"<<i+1
<<setw(8)<<setprecision(2)<<p[i]
<<setw(8)<<setprecision(2)<<pxj[i]
<<setw(8)<<k[i]<<" ";
mz[i]=pxj[i];
for(int j=0;j<k[i];j++)
{
if(2*mz[i]-1>=0)
{
cout<<1;
mz[i]=2*mz[i]-1;
}
else
{
cout<<0;
mz[i]=2*mz[i];
}
}
cout<<endl;
}
double K=0.0,H=0.0,Y;
for(i=0;i<n;i++)
{
K+=(double)p[i]*k[i];
H+=(-1)*p[i]*(log10(p[i])/log10(2.0));
}
Y=H/K;
cout<<"平均碼長:"<<K<<endl;
cout<<"信源熵:"<<H<<endl;
cout<<"編碼效率:"<<Y<<endl;
}
void main()
{
T t;int e;
try
{
t.Create();
t.Coutpxj();
t.Coutk();
t.Print();
}
catch(int e)
{if(e==1) cout<<"輸入錯誤,請重新運行";}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -