www.pudn.com > shannon.rar > shannoncode.cpp


#include  
#include  
#include  
using namespace std; 
 
#define MAX 100  /*定义信源最大个数*/ 
 
struct source{ 
	string name; 
	int    length; 
    float  prob; 
	float  sumprob; 
	string code; 
}; 
 
 
 
 
int main() 
{ int M , i , j , k ; 
  float sum , temp; 
  cout<<"请输入信源的个数:"; 
  cin>>M; 
   
  source info[MAX]; 
 
loop: 
  for(i = 0 ; i < M ; i++)  /*信息的录入*/ 
  {cout<<"请输入信源符号:"; 
   cin>>info[i].name; 
   cout<<"请输入符号概率:"; 
   cin>>info[i].prob;   
  }   
  sum = 0; 
  for(i = 0 ; i < M ; i++) 
  {sum = sum+info[i].prob; 
  } 
  if(1 != sum)  
  {cout<<"输入有误!请重新输入!"; 
   goto loop; 
  } 
 
/*排序*/ 
  j = 1; 
  k = 1; 
  source x; 
 while((j0)) 
 {k = 0; 
   for(i = 0;i <= M-j;i++) 
   {if(info[i+1].prob > info[i].prob) 
   {k++; 
    x = info[i]; 
	info[i] = info[i+1]; 
	info[i+1] = x; 
   } 
   } 
   j++; 
 } 
 
/*计算编码的长度Lk*/ 
  for(i = 0 ; i < M ; i++) 
  {info[i].length = log10(1/info[i].prob)/log10(2) + 1; 
   
  } 
 
 
/*计算Pk*/ 
  for(i = 0 ; i < M ; i++) 
  {if(0 == i) {info[i].sumprob = 0;} 
  else {info[i].sumprob = info[i-1].sumprob + info[i-1].prob;} 
  } 
   
 
 
//二进制表示 
  for(i = 0 ; i < M ; i++) 
  {   temp = info[i].sumprob; 
	  for(j = 0 ; j < info[i].length ; j++) 
	  {  temp = temp * 2; 
	     if (temp >= 1)  
		 {info[i].code = info[i].code + '1';   
		  temp = temp - 1; 
		 } 
		 else {info[i].code = info[i].code + '0';} 
	  } 
   
   
  } 
 
 
  //输出    
  for(i = 0 ; i < M ; i++) 
  {cout<