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