主题:香农编码的代码
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
typedef struct
{
char a[15];
float b;
}mynode1;
typedef struct
{ char a[15];
float p;
int geshu;
}mynode2;
void sort(mynode1 a[],int n)
{
int i,j,flag=1;
mynode1 temp;
for(i=1;i<=n&&flag==1;i++)
{
flag=0;
for(j=0;j<n-i;j++)
{
if(a[j].b<a[j+1].b)
{
flag=1;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
void main()
{
int n,i;
float sum=0,c,t;
mynode1 *shanon;
mynode2 *sorted;
printf("请输入消息序列的个数:");
scanf("%d",&n);
if((shanon=new mynode1[n])==NULL)
{
printf("申请堆内存失败!\n");
exit(1);
}
if((sorted=new mynode2[n])==NULL)
{
printf("申请堆内存失败!\n");
exit(1);
}
printf(" 名称 概率 \n");
for(i=0;i<n;i++)
{
printf("请输入第%d个消息名称和概率\n",i+1);
scanf("%s",shanon[i].a);
scanf("%f",&shanon[i].b);
printf(" %8s %f\n",shanon[i].a,shanon[i].b);
}
printf("\n\n\n");
//对消息序列进行排队
printf(" 概率按照从大到小的顺序排列后\n");
sort(shanon,n);
for(i=0;i<n;i++)
{
printf(" %8s %f\n",shanon[i].a,shanon[i].b);
}
for(i=0;i<n;i++)
{ sorted[i].p=sum;
sorted[i].geshu=int(log10(1/(double)shanon[i].b)/log10((double)(2))+1);
strcpy(sorted[i].a,shanon[i].a);
sum=shanon[i].b+sum;
}
for(i=0;i<n;i++)
{
printf(" %s %f %d\n",sorted[i].a,sorted[i].p,sorted[i].geshu);
}
for(i=0;i<n;i++)
{ int j;
c=sorted[i].p;
printf("%s的香农编码:",sorted[i].a);
for(j=0;j<sorted[i].geshu;j++)
{
c=c*2;
t=c;
printf("%d",(int)t);
if(c>1)
c=c-1;
}
printf("\n");
}
}
#include <stdio.h>
#include <math.h>
#include <string.h>
typedef struct
{
char a[15];
float b;
}mynode1;
typedef struct
{ char a[15];
float p;
int geshu;
}mynode2;
void sort(mynode1 a[],int n)
{
int i,j,flag=1;
mynode1 temp;
for(i=1;i<=n&&flag==1;i++)
{
flag=0;
for(j=0;j<n-i;j++)
{
if(a[j].b<a[j+1].b)
{
flag=1;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
void main()
{
int n,i;
float sum=0,c,t;
mynode1 *shanon;
mynode2 *sorted;
printf("请输入消息序列的个数:");
scanf("%d",&n);
if((shanon=new mynode1[n])==NULL)
{
printf("申请堆内存失败!\n");
exit(1);
}
if((sorted=new mynode2[n])==NULL)
{
printf("申请堆内存失败!\n");
exit(1);
}
printf(" 名称 概率 \n");
for(i=0;i<n;i++)
{
printf("请输入第%d个消息名称和概率\n",i+1);
scanf("%s",shanon[i].a);
scanf("%f",&shanon[i].b);
printf(" %8s %f\n",shanon[i].a,shanon[i].b);
}
printf("\n\n\n");
//对消息序列进行排队
printf(" 概率按照从大到小的顺序排列后\n");
sort(shanon,n);
for(i=0;i<n;i++)
{
printf(" %8s %f\n",shanon[i].a,shanon[i].b);
}
for(i=0;i<n;i++)
{ sorted[i].p=sum;
sorted[i].geshu=int(log10(1/(double)shanon[i].b)/log10((double)(2))+1);
strcpy(sorted[i].a,shanon[i].a);
sum=shanon[i].b+sum;
}
for(i=0;i<n;i++)
{
printf(" %s %f %d\n",sorted[i].a,sorted[i].p,sorted[i].geshu);
}
for(i=0;i<n;i++)
{ int j;
c=sorted[i].p;
printf("%s的香农编码:",sorted[i].a);
for(j=0;j<sorted[i].geshu;j++)
{
c=c*2;
t=c;
printf("%d",(int)t);
if(c>1)
c=c-1;
}
printf("\n");
}
}