设计程序实现香农公式计算

img


无任何报错却不能正常运行


#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(),别让程序直接退出