用户手册:
1.按照提示先输入随后将输入字符串的总个数
2.依次输入个字符串 3.得出结果 总结:
本次编程实验中进一步加深了对尾随后缀集合算法的理解,运用C语言将其实现。在程序中设置了一个互相比较两个字符串是否为对方前缀的函数,以求得尾随后缀。
程序大体写完后,又在原程序的基础上增加了它的鲁棒性。 附源代码:
#include
int N,sum=0; //N为输入码字的个数,sum为尾随后缀集合中码字的个数 int flag; //判断是否唯一可译标志位
void patterson(char c[],char d[]) //检测尾随后缀 {
int i,j,k;
for(i=0;;i++) {
if(c[i]=='\\0'&&d[i]=='\\0')//2字符串一样,跳出 break;
if(c[i]=='\\0') //d比c长,将d的尾随后缀放入f中 {
for(j=i;d[j]!='\\0';j++) f[sum][j-i]=d[j]; f[sum][j-i]='\\0';
for(k=0;k if(strcmp(f[sum],f[k])==0) /*查看当前生成的尾随后缀在f集 合中是否存在*/ { sum--;break; } } sum++; break; } if(d[i]=='\\0') //c比d长,将c的尾随后缀放入f中 { for(j=i;c[j]!='\\0';j++) f[sum][j-i]=c[j]; f[sum][j-i]='\\0'; for(k=0;k if(strcmp(f[sum],f[k])==0) /*查看当前生成的尾随后缀在 f集合中是否存在*/ { sum--;break; } } sum++; break; } if(c[i]!=d[i])//字符不一样了也退出 break; } } /*主函数*/ main() { int i,j; printf(\请输入码字的个数(小于100):\输入码得个数 scanf(\ while(N>100) { printf(\输入码字个数过大,请输入小于100的数\\n\ printf(\请输入码字的个数(小于100):\ scanf(\ } flag=0; printf(\请分别输入码字(每个码字长度小于50个字符):\\n\ for(i=0;i scanf(\ } for(i=0;i { if(strcmp(c[i],c[j])==0) {flag=1;break;} } if(flag==1)//如果码本身有重复,就可以断定它不是唯一可译码 { printf(\这不是唯一可译码。\\n\ } else { for(i=0;i 入f中*/ { for(j=i+1;j patterson(c[i],c[j]); } } for(i=0;;i++) //根据原始码与s[i]生成s[i+1]也放入f[i] { int s=0; for(j=0;j 重复的则不再添加*/ { if(i==sum) { s=1;break;} else patterson(f[i],c[j]); } if(s==1)break; } for(i=0;i 重复则不是唯一的*/ { for(j=0;j if(strcmp(f[i],c[j])==0) { flag=1; break; } } } if(flag==1) { printf(\这不是唯一可译码。\\n\ } else printf(\这是唯一可译码。\\n\ } printf(\尾随后缀集合为:\ for(i=0;i<=sum;i++) printf(\} 实验二 Shannon编码 一、 实验内容 编程实现Shannon编码算法 二、实验环境 1. 计算机 2. Windows 2000 或以上 3. VC++ 6.0 三、实验目的 1. 进一步熟悉Shannon编码算法; 2. 掌握C语言编程(尤其是数值的进制转换,数值与字符串之间的转换等) 四、实验要求 1. 提前预习实验,认真阅读实验原理。 2. 认真高效的完成实验,实验过程中服从实验室管理人员以及实验指导老 师的管理。 3. 认真填写实验报告。 五、实验原理 1. Shannon编码的原理参考书1的162页。 2. 算法流程 输入信源符号个数q,信源概率分布P 降序排列{pi} for i=1 →q ?1? 计算编码长度 li??log2?; p(s)i?? 计算累加概率F(si)??p(sk); k?1i?1 将累加概率F(si) (十进制小数)变成二进制数 六、参考书 1. 《信息论——基础理论及应用》傅祖芸,电子工业出版社 七、实验设计 1、数据结构 本实验所需设计的程序中,码字可用如下结构表示: typedef struct symbol { char s[50]; double pa,pb,h; //分别为符号概率,累加概率,自信息量 int l; //码字长度 char m[100]; //码字 }symbol; 2、关键算法 本程序的关键算法是通过累加概率及码长求码字,其算法流程图如 下: 判断结果是否 Y 小于1 编码的下一位是1,并将所乘结果减1,目前得到的长度加1 开始 将累加概率pa乘以2 N N 判断目前得到的长度是否等于编码长度 编码的下一位是0,目前得到的长度加1