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

📄 shanon.cpp

📁 shanon编码程序
💻 CPP
字号:
#include "stdio.h"
#include "math.h"
#include "string.h"
#define N 7 
double p[N],padd[N];                    /*定义数组分别存放消息概率、累加概率*/
int code_l[N];                             /*存放码长*/
//long ercode[N];                          /*存放二进制代码组*/  
 
void sort_code_l()                       /*定义函数进行排序*/
{ double temp;
  int i,j,k;
	 for(i=0;i<N-1;i++)        
	 { k=i;
		 for(j=i+1;j<N;j++)
		  if(p[j]>p[i]) k=j;            /*降序排列*/
		  if(k!=i)
		  { temp=p[k];
		    p[k]=p[i];
			p[i]=temp;
		  }
	 }
	for(i=0;i<N;i++)
	  printf("%-3.2lf ",p[i]);        /*输出排序后的消息概率*/
	    printf("\n");
   for(i=0;i<N;i++)
   { double m=log(1/p[i])/log(2);
        if(m-int(m)==0.0)  
         code_l[i]=m;
     else 
       code_l[i]=int(m)+1;
	printf("%3d",code_l[i]);           /*输出码长*/
   }
       printf("\n"); 
}
void Ercode()                         /*求消息序号的二进制代码*/               
{  double n,m; int i,j,t;
   padd[0]=0;
  for(i=1;i<N;i++)
         padd[i]=p[i-1]+padd[i-1];      /*求累加概率*/
      for(i=0;i<N;i++)
       printf("%-3.2lf ",padd[i]);   
       printf("\n");
     for(i=0;i<N;i++)
	 {n=padd[i]*2;
		 for(j=0;j<code_l[i];j++)   /*求二进制代码组*/
		 {   m=n;
			 t=int(m);
			 if(n>1.0) n-=1.0;
		    n*=2;
			printf("%d",t);
		 }
		printf(" "); 
	 }
}


void main()
{ double total=0;
K:{printf("Please input %d probilities:\n",N);
   for(int i=0;i<N;i++)
	 { scanf("%lf",&p[i]);
    total+=p[i];
   }
  
  }
  if(total!=1.0)                         
  { printf("try again\n ");
    goto K;                            /*概率和不等于1,重新输入*/
  }
  sort_code_l();                        /*调用函数对消息概率排序及求码长*/
  Ercode();                             /*调用函数求二进制代码组*/
 //for(int i=0;i<N;i++)
  //printf("%s ",ercode);
}


  
  

⌨️ 快捷键说明

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