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

📄 shannoncode.cpp

📁 自己编写的一个用于信源的二元shannon编码
💻 CPP
字号:
#include <iostream>
#include <cmath>
#include <string>
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((j<M) && (k>0))
 {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<<info[i].name<<"     "<<info[i].prob<<"       "<<info[i].sumprob
  <<"   "<<info[i].length<<"      "<<info[i].code<<endl;
  
  }
  return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -