📄 suansu.c
字号:
#include <stdlib.h>
#include <iostream.h>
#include <stdio.h>
#define N 4
double uniform(double a,double b)
{double m,n;
m=b-a;
n=a+(double)(m*rand()/(RAND_MAX+1.0));
return n;}
double encode(char p[4][4],double chance[])//编码,chance[4]用于接收各个字符的概率范围
{
char number[4];double high=0,low=0,rang=1;int i,j;
char n;double aa=0,bb=0,cc=0,dd=0,m1=0,m2=0,m3=0,m4=0;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
if(p[i][j]=='a')
m1+=1;
else if(p[i][j]=='b')
m2+=1;
else if(p[i][j]=='c')
m3+=1;
else if(p[i][j]=='d')
m4+=1;
}
printf("please enter in the numbers ");//输入信源符号a,b,c,d;
for(i=0;i<N;i++)
{
scanf("%c",&n);
number[i]=n;
}
for(i=0;i<N;i++)
{
if(number[i]=='a')
aa=m1/16;
else if(number[i]=='b')
bb=m2/16;
else if(number[i]=='c')
cc=m3/16;
else if(number[i]=='d')
dd=m4/16;
}
chance[0]=aa;chance[1]=aa+bb;chance[2]=aa+bb+cc;chance[3]=aa+bb+cc+dd;
bb=bb+aa;cc=bb+cc;dd=cc+dd;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
if(p[i][j]=='a')
{high=low+rang*aa;
low=low+rang*0;
rang=high-low;
}
else if(p[i][j]=='b')
{high=low+rang*bb;
low=low+rang*aa;
rang=high-low;
}
else if(p[i][j]=='c')
{high=low+rang*cc;
low=low+rang*bb;
rang=high-low;
}
else if(p[i][j]=='d')
{
high=low+rang*dd;
low=low+rang*cc;
rang=high-low;
}
}
low=uniform(low,high);
return low;
}
void decode(double x,char ce[16],double chance[])
{ int i;
for(i=0;i<16;i++)
{
if((x>=0)&&(x<chance[0]))
{ce[i]='a';x=(x-0)/(chance[0]-0);}
else if((x>=chance[0])&&(x<chance[1]))
{ce[i]='b';x=(x-chance[0])/(chance[1]-chance[0]);}
else if((x>=chance[1])&&(x<chance[2]))
{ce[i]='c';x=(x-chance[1])/(chance[2]-chance[1]);}
else if((x>=chance[2])&&(x<chance[3]))
{ce[i]='d';x=(x-chance[2])/(chance[3]-chance[2]);}
}
}
main()
{char cod[4][4]={{'a','b','b','d'},{'b','c','d','a'},{'c','c','d','b'},{'c','b','d','a'}};
char ec[16];int i;double t;double chance[N];
t=encode(cod,chance);
decode(t,ec,chance);
printf("%f",t);
printf("译码输出:");
for(i=0;i<16;i++)
printf("%c ",ec[i]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -