#include<iostream>
#include<conio.h>
using namespace std;
#define MAX 100
struct sh {
float x;//字符概率
float y;//字符概率累加
int k;//码字长度
// int code;//第i个消息符号的码字
}x[MAX];
void dis(float a[], int m)
{
int max;
float I = 0, t, p = 0;
for (int i = 0; i < m; i++)x[i].x = a[i];
for (int i = 0; i < m; i++)//将概率由大到小排序
{
max = i;
for (int j = i + 1; j < m; j++) {
if (x[i].x <= x[j].x)max = j;
t = x[i].x;
x[i].x = x[max].x;
x[max].x = t;
}
}
for (int i = 0; i < m; i++)//计算码长
{
I = -log(x[i].x) / log(2);
if (I - (int)I == 0) {
x[i].k = (int)I;
}
else x[i].k = (int)I + 1;
}
cout << endl;
cout << "信源符号xi" << "\t概率p(xi)" << "\t累加概率" <<"\t码字长度"<< "\t二元码" << endl;
for (int i = 0; i < m; i++)
{
if (i != 0) {
p += x[i - 1].x;
x[i].y = p;
}
else x[i].y = 0;
cout << "" << "S" << i + 1 << "\t\t" << x[i].x << "\t\t" <<x[i].y <<"\t\t"<< x[i].k << "\t\t";
float t = x[i].y;
for (int j = 0; j < x[i].k; j++) {
t = t * 2;
if (t >= 1) {
cout << "1";
t = t - 1;
}
else {
cout << "0";
}
}
cout << endl;
}
cout << endl;
}
struct bh {
char b[3];
}c[10];
void input()
{
//char b[3];
float sum = 0, a[MAX];
int m,n=1;
cout << "输入信源个数:";
cin >> m;
cout << "如果输入分数按:0 " << "如果输入小数按:1" << endl;
cin >> n;
if (n == 0) {
cout << "输入" << m << "个该信源概率:" << endl;
for (int i = 0; i < m; i++) {
cout << "P(x" << i + 1 << "):";
cin >>c[i].b;
a[i] =(float)(c[i].b[0] - '0') / (c[i].b[2] - '0');
sum = sum + a[i];
}
}else{
cout << "输入" << m << "个该信源概率:" << endl;
for (int i = 0; i < m; i++) {
cout << "P(x" << i + 1 << "):";
cin >> a[i];
// a[i] = (double)1 / 7;
sum = sum + a[i];
} }
if (sum != 1) {
cout << "输入概率和是" << sum << "不为1,请重新输入" << endl;
a[m] = NULL;
input();
}
else
dis(a, m);
}
int main()
{
input();
_getch();
return 0;
}
————————————————
版权声明:本文为CSDN博主「大巧若拙。」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a2698084940/article/details/106902167
在return 0之前加个getchar(),别让程序直接退出