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

📄 feiruocodedlg.cpp

📁 实现费偌
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			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 + -