📄 feiruocodedlg.cpp
字号:
sum[1]++;
if(m_strBeforeCode.GetAt(i)=='3')
sum[2]++;
if(m_strBeforeCode.GetAt(i)=='4')
sum[3]++;
if(m_strBeforeCode.GetAt(i)=='5')
sum[4]++;
if(m_strBeforeCode.GetAt(i)=='6')
sum[5]++;
if(m_strBeforeCode.GetAt(i)=='7')
sum[6]++;
if(m_strBeforeCode.GetAt(i)=='8')
sum[7]++;
}
//计算每个符号出现的概率
for(i=0;i<8;i++)
{
probablity[i]=sum[i]/100;
}
//对各概率进行排序,采用的是交换法
double tempProbablity;
int tempSymbol;
for(i=0;i<7;i++)
{
for(j=i+1;j<8;j++)
{
if(probablity[i]<probablity[j])
{
tempProbablity=probablity[i];
probablity[i]=probablity[j];
probablity[j]=tempProbablity;
tempSymbol=symbol[i];;
symbol[i]=symbol[j];
symbol[j]=tempSymbol;
}
}
}
//将排序好后的概率及符号重新赋给编辑框
m_dProbabilty1=probablity[0];
m_dProbabilty2=probablity[1];
m_dProbabilty3=probablity[2];
m_dProbabilty4=probablity[3];
m_dProbabilty5=probablity[4];
m_dProbabilty6=probablity[5];
m_dProbabilty7=probablity[6];
m_dProbabilty8=probablity[7];
m_symbol1=symbol[0];
m_symbol2=symbol[1];
m_symbol3=symbol[2];
m_symbol4=symbol[3];
m_symbol5=symbol[4];
m_symbol6=symbol[5];
m_symbol7=symbol[6];
m_symbol8=symbol[7];
//计算信源熵
for(i=0;i<8;i++)
m_dSorceShang+=-probablity[i] * log(probablity[i])/log(2);
//计算每个符号的概率熵
for(i=0;i<8;i++)
pshang[i]=-log(probablity[i])/log(2);
m_dPXinxiLiang1=pshang[0];
m_dPXinxiLiang2=pshang[1];
m_dPXinxiLiang3=pshang[2];
m_dPXinxiLiang4=pshang[3];
m_dPXinxiLiang5=pshang[4];
m_dPXinxiLiang6=pshang[5];
m_dPXinxiLiang7=pshang[6];
m_dPXinxiLiang8=pshang[7];
//费偌编码
for(i=0;i<8;i++)
{
feinuobinarycode[i]="";
feinuocodelen[i]=0;
}
feinuocode(0,7);
//将费诺编码各码组长度及所对应的二进制码返回给编辑框
m_strFeinuoBinaryCode1=feinuobinarycode[0];
m_strFeinuoBinaryCode2=feinuobinarycode[1];
m_strFeinuoBinaryCode3=feinuobinarycode[2];
m_strFeinuoBinaryCode4=feinuobinarycode[3];
m_strFeinuoBinaryCode5=feinuobinarycode[4];
m_strFeinuoBinaryCode6=feinuobinarycode[5];
m_strFeinuoBinaryCode7=feinuobinarycode[6];
m_strFeinuoBinaryCode8=feinuobinarycode[7];
m_FeinuoCodeLen1=feinuocodelen[0];
m_FeinuoCodeLen2=feinuocodelen[1];
m_FeinuoCodeLen3=feinuocodelen[2];
m_FeinuoCodeLen4=feinuocodelen[3];
m_FeinuoCodeLen5=feinuocodelen[4];
m_FeinuoCodeLen6=feinuocodelen[5];
m_FeinuoCodeLen7=feinuocodelen[6];
m_FeinuoCodeLen8=feinuocodelen[7];
//香农编码
//香农编码中各码组的长度并返回给相应的编辑框
for(i=0;i<8;i++)
Shanoocodelen[i]=(int)pshang[i]+1;
m_ShanooCodeLen1=Shanoocodelen[0];
m_ShanooCodeLen2=Shanoocodelen[1];
m_ShanooCodeLen3=Shanoocodelen[2];
m_ShanooCodeLen4=Shanoocodelen[3];
m_ShanooCodeLen5=Shanoocodelen[4];
m_ShanooCodeLen6=Shanoocodelen[5];
m_ShanooCodeLen7=Shanoocodelen[6];
m_ShanooCodeLen8=Shanoocodelen[7];
//香农编码中的累加概率的计算并返回给相应的编辑框
shanoopsum[0]=0;
for(i=0;i<8;i++)
shanoopsum[i+1]=shanoopsum[i]+probablity[i];
m_dShanooPSum1=shanoopsum[0];
m_dShanooPSum2=shanoopsum[1];
m_dShanooPSum3=shanoopsum[2];
m_dShanooPSum4=shanoopsum[3];
m_dShanooPSum5=shanoopsum[4];
m_dShanooPSum6=shanoopsum[5];
m_dShanooPSum7=shanoopsum[6];
m_dShanooPSum8=shanoopsum[7];
//将累加概率转换为二进制代码组并返回给相应的编辑框
double temp=0;
double tempSum[8];
for(i=0;i<8;i++)
{
tempSum[i]=shanoopsum[i];
Shanoobinarycode[i]="";
}
for(i=0;i<8;i++)
{
for(j=0;j<Shanoocodelen[i];j++)
{
temp=tempSum[i]*2;
if(temp>=1)
{
Shanoobinarycode[i]+="1";
tempSum[i]=temp-1;
}
else
{
Shanoobinarycode[i]+="0";
tempSum[i]=temp;
}
}
}
m_strShanooBinaryCode1=Shanoobinarycode[0];
m_strShanooBinaryCode2=Shanoobinarycode[1];
m_strShanooBinaryCode3=Shanoobinarycode[2];
m_strShanooBinaryCode4=Shanoobinarycode[3];
m_strShanooBinaryCode5=Shanoobinarycode[4];
m_strShanooBinaryCode6=Shanoobinarycode[5];
m_strShanooBinaryCode7=Shanoobinarycode[6];
m_strShanooBinaryCode8=Shanoobinarycode[7];
//哈夫曼编码
for(i=0;i<8;i++)
{
Hafubinarycode[i]="";
Hafucodelen[i]=0;
}
HafuCode();
m_strHafuBinaryCode1=Hafubinarycode[0];
m_strHafuBinaryCode2=Hafubinarycode[1];
m_strHafuBinaryCode3=Hafubinarycode[2];
m_strHafuBinaryCode4=Hafubinarycode[3];
m_strHafuBinaryCode5=Hafubinarycode[4];
m_strHafuBinaryCode6=Hafubinarycode[5];
m_strHafuBinaryCode7=Hafubinarycode[6];
m_strHafuBinaryCode8=Hafubinarycode[7];
m_HafuCodeLen1=Hafucodelen[0];
m_HafuCodeLen2=Hafucodelen[1];
m_HafuCodeLen3=Hafucodelen[2];
m_HafuCodeLen4=Hafucodelen[3];
m_HafuCodeLen5=Hafucodelen[4];
m_HafuCodeLen6=Hafucodelen[5];
m_HafuCodeLen7=Hafucodelen[6];
m_HafuCodeLen8=Hafucodelen[7];
//计算各种编码方法的平均码长
m_dFeinuoAvgCodeLen=m_dProbabilty1*m_FeinuoCodeLen1+m_dProbabilty2*m_FeinuoCodeLen2+
m_dProbabilty3*m_FeinuoCodeLen3+m_dProbabilty4*m_FeinuoCodeLen4+
m_dProbabilty5*m_FeinuoCodeLen5+m_dProbabilty6*m_FeinuoCodeLen6+
m_dProbabilty7*m_FeinuoCodeLen7+m_dProbabilty8*m_FeinuoCodeLen8;
for(i=0;i<8;i++)
{
//m_dFeinuoAvgCodeLen+=probablity[i]*feinuocodelen[i];
m_dShanooAvgCodeLen+=probablity[i]*Shanoocodelen[i];
m_dHafuAvgCodeLen+=probablity[i]*Hafucodelen[i];
}
//计算各种编码方法的编码效率
m_dFeinuoCodeEff=m_dSorceShang/m_dFeinuoAvgCodeLen;
m_dShanoocodeEff=m_dSorceShang/m_dShanooAvgCodeLen;
m_dHafuCodeEff=m_dSorceShang/m_dHafuAvgCodeLen;
//显示各种编码方法编码后的数据
//费诺编码后的数据
for(i=0;i<100;i++)
{
if(m_strBeforeCode.GetAt(i)=='1')
{
//因为数组binarycode中所对应的下表与消息序号不对应,所以用下列循环来实现代码组与符号的对应
for(int k=0;k<8;k++)
{
if(symbol[k]==1)
m_strAfterCode+=" "+feinuobinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='2')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==2)
m_strAfterCode+=" "+feinuobinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='3')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==3)
m_strAfterCode+=" "+feinuobinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='4')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==4)
m_strAfterCode+=" "+feinuobinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='5')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==5)
m_strAfterCode+=" "+feinuobinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='6')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==6)
m_strAfterCode+=" "+feinuobinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='7')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==7)
m_strAfterCode+=" "+feinuobinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='8')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==8)
m_strAfterCode+=" "+feinuobinarycode[k];
}
}
}
m_strAfterCode=m_strAfterCode+"以上是费诺编码后的结果\r\n";
//香农编码后的数据
for(i=0;i<100;i++)
{
if(m_strBeforeCode.GetAt(i)=='1')
{
//因为数组binarycode中所对应的下表与消息序号不对应,所以用下列循环来实现代码组与符号的对应
for(int k=0;k<8;k++)
{
if(symbol[k]==1)
m_strAfterCode+=" "+Shanoobinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='2')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==2)
m_strAfterCode+=" "+Shanoobinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='3')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==3)
m_strAfterCode+=" "+Shanoobinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='4')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==4)
m_strAfterCode+=" "+Shanoobinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='5')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==5)
m_strAfterCode+=" "+Shanoobinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='6')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==6)
m_strAfterCode+=" "+Shanoobinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='7')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==7)
m_strAfterCode+=" "+Shanoobinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='8')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==8)
m_strAfterCode+=" "+Shanoobinarycode[k];
}
}
}
m_strAfterCode=m_strAfterCode+"以上是香农编码后的结果\r\n";
//哈夫曼编码后的数据
for(i=0;i<100;i++)
{
if(m_strBeforeCode.GetAt(i)=='1')
{
//因为数组binarycode中所对应的下表与消息序号不对应,所以用下列循环来实现代码组与符号的对应
for(int k=0;k<8;k++)
{
if(symbol[k]==1)
m_strAfterCode+=" "+Hafubinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='2')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==2)
m_strAfterCode+=" "+Hafubinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='3')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==3)
m_strAfterCode+=" "+Hafubinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='4')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==4)
m_strAfterCode+=" "+Hafubinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='5')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==5)
m_strAfterCode+=" "+Hafubinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='6')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==6)
m_strAfterCode+=" "+Hafubinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='7')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==7)
m_strAfterCode+=" "+Hafubinarycode[k];
}
}
if(m_strBeforeCode.GetAt(i)=='8')
{
for(int k=0;k<8;k++)
{
if(symbol[k]==8)
m_strAfterCode+=" "+Hafubinarycode[k];
}
}
}
m_strAfterCode=m_strAfterCode+"以上是哈夫曼编码的结果\r\n";
UpdateData(false);
}
void CFeiruoCodeDlg::OnBhelp()
{
// TODO: Add your control notification handler code here
AfxMessageBox("先按自动分配按钮,\n即会随机的分配100个0—8之间的数,\n然后按开始编码,\n即开始进行费偌编码",MB_ICONINFORMATION);
}
void CFeiruoCodeDlg::OnBclear()
{
// TODO: Add your control notification handler code here
m_symbol1 = 1;
m_symbol2 = 2;
m_symbol3 = 3;
m_symbol4 = 4;
m_symbol5 = 5;
m_symbol8 = 8;
m_symbol7 = 7;
m_symbol6 = 6;
m_dPXinxiLiang1 = 0.0;
m_dPXinxiLiang2 = 0.0;
m_dPXinxiLiang3 = 0.0;
m_dPXinxiLiang4 = 0.0;
m_dPXinxiLiang5 = 0.0;
m_dPXinxiLiang6 = 0.0;
m_dPXinxiLiang7 = 0.0;
m_dPXinxiLiang8 = 0.0;
m_dProbabilty1 = 0.0;
m_dProbabilty2 = 0.0;
m_dProbabilty3 = 0.0;
m_dProbabilty4 = 0.0;
m_dProbabilty5 = 0.0;
m_dProbabilty6 = 0.0;
m_dProbabilty7 = 0.0;
m_dProbabilty8 = 0.0;
m_strAfterCode = _T("");
m_strBeforeCode = _T("");
m_dFeinuoAvgCodeLen = 0.0;
m_strFeinuoBinaryCode1 = _T("");
m_strFeinuoBinaryCode2 = _T("");
m_strFeinuoBinaryCode3 = _T("");
m_strFeinuoBinaryCode4 = _T("");
m_strFeinuoBinaryCode5 = _T("");
m_strFeinuoBinaryCode6 = _T("");
m_strFeinuoBinaryCode7 = _T("");
m_strFeinuoBinaryCode8 = _T("");
m_dFeinuoCodeEff = 0.0;
m_FeinuoCodeLen1 = 0;
m_FeinuoCodeLen2 = 0;
m_FeinuoCodeLen3 = 0;
m_FeinuoCodeLen4 = 0;
m_FeinuoCodeLen5 = 0;
m_FeinuoCodeLen6 = 0;
m_FeinuoCodeLen7 = 0;
m_FeinuoCodeLen8 = 0;
m_dHafuAvgCodeLen = 0.0;
m_strHafuBinaryCode1 = _T("");
m_strHafuBinaryCode2 = _T("");
m_strHafuBinaryCode3 = _T("");
m_strHafuBinaryCode4 = _T("");
m_strHafuBinaryCode5 = _T("");
m_strHafuBinaryCode6 = _T("");
m_strHafuBinaryCode7 = _T("");
m_strHafuBinaryCode8 = _T("");
m_dHafuCodeEff = 0.0;
m_HafuCodeLen1 = 0;
m_HafuCodeLen2 = 0;
m_HafuCodeLen3 = 0;
m_HafuCodeLen4 = 0;
m_HafuCodeLen5 = 0;
m_HafuCodeLen6 = 0;
m_HafuCodeLen7 = 0;
m_HafuCodeLen8 = 0;
m_dShanooAvgCodeLen = 0.0;
m_strShanooBinaryCode1 = _T("");
m_strShanooBinaryCode2 = _T("");
m_strShanooBinaryCode3 = _T("");
m_strShanooBinaryCode4 = _T("");
m_strShanooBinaryCode5 = _T("");
m_strShanooBinaryCode6 = _T("");
m_strShanooBinaryCode7 = _T("");
m_strShanooBinaryCode8 = _T("");
m_dShanoocodeEff = 0.0;
m_ShanooCodeLen1 = 0;
m_ShanooCodeLen2 = 0;
m_ShanooCodeLen3 = 0;
m_ShanooCodeLen4 = 0;
m_ShanooCodeLen5 = 0;
m_ShanooCodeLen6 = 0;
m_ShanooCodeLen7 = 0;
m_ShanooCodeLen8 = 0;
m_dShanooPSum1 = 0.0;
m_dShanooPSum2 = 0.0;
m_dShanooPSum3 = 0.0;
m_dShanooPSum4 = 0.0;
m_dShanooPSum5 = 0.0;
m_dShanooPSum6 = 0.0;
m_dShanooPSum7 = 0.0;
m_dShanooPSum8 = 0.0;
m_dSorceShang = 0.0;
UpdateData(false);
}
void CFeiruoCodeDlg::OnBabout()
{
// TODO: Add your control notification handler code here
AfxMessageBox("制作者:张晶",MB_ICONINFORMATION);
}
void CFeiruoCodeDlg::OnBexit()
{
// TODO: Add your control notification handler code here
CDialog::OnCancel();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -