📄 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 + -