m0_71661142 2023-11-14 17:57 采纳率: 40%
浏览 10
已结题

C语言实现香农编码,但是输出的码字一直错误

我用C语言写了个实现香农编码的程序。但是最后实现码字的时候总是计算错误,请各位帮忙看看和改错。
ps:已经有半年没写过C了,链表啥的都忘光了,所以用数组来写。


#include <stdio.h>
#include <stdlib.h>
#include <math.h> 
int main() {
    int size = 5;
    float q[size];int p[size];
    int i;
//生成size个两位随机小数作为信源 
    srand(time(0));
    for(i=0; i<size; i++){ 
        p[i] = rand()%90+0;
    } 
    printf("5个概率为:\n");
    for(i=0; i<size; i++){ 
        float t;
        t=0.01*(p[i]%100);
        q[i]=t;
        printf("%.2f ", q[i]);
    } printf("\n");
    printf("从大到小排序后:\n");
    for(i=0;i<size;i++){
        int j;
        for(j=i+1;j<size;j++){
            float temp;
            if (q[i]<=q[j]){
                temp=q[i];
                q[i]=q[j];
                q[j]=temp;
            }
        }
    } 
    for(i=0; i<size; i++){ 
        printf("%.2f ", q[i]);
    } printf("\n");
//****************************************************
//计算累加概率 
    float leijia[size+1];float leijia2[size+1];
    leijia[0]=0.0;leijia2[0]=leijia[0];
    printf("累加概率为:\n");
    for (i=0;i<size;i++){
        leijia[i+1]=leijia[i]+q[i];
        printf("%.5f\t",leijia[i]);
    }printf("\n");
    for(i=1;i<size;i++){
        leijia2[i]=leijia[i]-(int)leijia[i];
    }
//****************************************************    
//计算码字长度和输出码字 
    int mazicd[size];
    for(i=0;i<size;i++){
        double bds=-1*log10(q[i])/log10(2);
        if(bds-(int)bds==0){
            mazicd[i]=(int)bds;    
        }else{
            mazicd[i]=(int)bds+1;
        }
        printf("码字长度为:%d\t",mazicd[i]);
        printf("码字为:");
        int k=0;char mz[20];
        int temp=leijia2[i]*2;
        for(k=0;k<mazicd[i];k++){
            if(leijia[i]==0){
                mz[k]=0;
                printf("%d",mz[k]);
            }else{
                if(temp>=1){
                    mz[k]=1;
                    printf("%d",mz[k]);
                }else{
                    mz[k]=0;
                    printf("%d",mz[k]);
                }
            }
        }printf("\n");
    }return 0;
}

img

  • 写回答

2条回答 默认 最新

  • K_n_i_g_h_t_1990 2023-11-14 20:07
    关注

    你的代码在计算二进制码字时存在逻辑错误。具体来说,计算二进制码字的逻辑似乎不准确。你使用了 leijia2[i] 来确定二进制码字,但生成二进制码字的逻辑不正确。

    
    //****************************************************    
    //计算码字长度和输出码字 
        int mazicd[size];
        for(i = 0; i < size; i++){
            double bds = -1 * log10(q[i]) / log10(2);
            if(bds - (int)bds == 0){
                mazicd[i] = (int)bds;    
            } else{
                mazicd[i] = (int)bds + 1;
            }
            printf("码字长度为:%d\t", mazicd[i]);
            printf("码字为:");
            int k;
            for(k = 0; k < mazicd[i]; k++){
                int temp = leijia2[i] * 2;
                mz[k] = temp; // 直接将temp值存储在mz[k]中
                printf("%d", mz[k]);
                leijia2[i] = temp - (int)temp; // 更新leijia2以供下一次迭代使用
            }
            printf("\n");
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月23日
  • 已采纳回答 11月15日
  • 修改了问题 11月14日
  • 创建了问题 11月14日