www.pudn.com > shannon.rar > shannoncode.cpp
#include#include #include 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 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<