Y 结束本次循环 把最后一个字符设为’/0’
for(i=0;i p=sb[i].pb; for(j=0;j p=p*2; if(p>=1) { sb[i].m[j]='1'; p=p-1; } else sb[i].m[j]='0'; } sb[i].m[sb[i].l]='\\0'; } 3、函数调用关系图 仅有main()函数。概率排序、求累加概率、自信息量、码字长度、码字的 函数均包含在main()函数内。 九、用户手册及总结 用户手册: 1.按照提示先输入信源的总个数 2.依次输入各信源的名称 3.再按上序输入信源的概率 4.得出结果 总结: 本次编程中没有用到特别复杂的算法。按照香农编码的编码方法依次实现各模块即可。在编程中要注意的是数字的类型,利用log函数时求得的值是double型。 附源代码: #include typedef struct symbol { char s[50]; double pa,pb,h; //分别为符号概率,累加概率,自信息量 int l; //码字长度 char m[100]; //码字 }symbol; int N; void main() { int i,j; symbol sb[100]; printf(\请输入符号的个数:\ scanf(\ printf(\请依次输入消息符号:\\n\ for(i=0;i scanf(\ } printf(\请依次输入各消息符号的概率:\\n\ for(i=0;i scanf(\ } int x; symbol z; for(i=0;i x=i; for(j=i+1;j if(sb[x].pa z=sb[i];sb[i]=sb[x];sb[x]=z; } sb[0].pb=0; for(i=1;i sb[i].pb=sb[i-1].pb+sb[i-1].pa; } double y; for(i=0;i sb[i].h=-log(sb[i].pa)/log(2); y=sb[i].h; if(sb[i].h-(int)y==0) sb[i].l=(int)y; else sb[i].l=(int)(y+1); } double p; for(i=0;i p=sb[i].pb; for(j=0;j p=p*2; if(p>=1) { sb[i].m[j]='1'; p=p-1; } else sb[i].m[j]='0'; } sb[i].m[sb[i].l]='\\0'; } printf(\消息符号 符号概率 累加概率码字\\n\ for(i=0;i printf(\ %1.4lf %1.4lf %1.4lf 信息量 = 码字长度 %s\\n\ b[i].s,sb[i].pa,sb[i].pb,sb[i].h,sb[i].l,sb[i].m); }