信息论与编码实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息论与编码实验报告
学院:计算机与通信工程学院
专业:计算机科学与技术
班级:计1203班
学号:
姓名:
2014年12月29日
实验一唯一可译码判别准则
实验目的:
1.进一步熟悉唯一可译码判别准则;
2.掌握C语言字符串处理程序的设计和调试技术。
实验内容:
1.已知:信源符号数和码字集合C;
2.输入:任意的一个码,码字的个数和每个具体的码字在运行时从键盘输入;
3.输出:判决(是唯一可译码/不是唯一可译码);循环(若继续判决则输入1循环判决,否则输入0结束运行)。
实验原理:
根据唯一可译码的判别方法,利用数据结构所学的知识,定义字符串数据类型并利用指针进行编程来实现算法。
算法:1、考察C 中所有的码字,若Wi是Wj的前缀,则将对应的后缀作为一个尾随后缀码放入集合Fi+1中;
2、考察C和Fi俩个集合,若Wi ∈C是Wj∈F的前缀或Wi ∈F是Wj∈C的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1中;
3、F=∪Fi即为码C的尾随后缀集合;
4、若F中出现了C中的元素,算法终止,返回假(C不是唯一可译码);否则若F中没有出现新的元素,则返回真。
实验环境及实验文件存档名:
1.实验环境:visual C++ 6.0
2.文件名:weiyikeyi.cpp
实验结果及分析:
1.源代码:
#include
#include
char c[100][50];
char f[300][50];
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; } } void yima() { int i,j; printf(" ********唯一可译码判别********\n"); printf("请输入码字的个数:");//输入码得个数 scanf("%d",&N); while(N>100) { printf("输入码字个数过大,请输入小于100的数\n"); printf("请输入码字的个数:"); scanf("%d",&N); } flag=0; printf("请分别输入码字:\n"); for(i=0;i { scanf("%s",&c[i]); } for(i=0;i for(j=i+1;j { if(strcmp(c[i],c[j])==0) {flag=1;break;} } if(flag==1)//如果码本身有重复,就可以断定它不是唯一可译码 { printf("这不是唯一可译码。\n"); } else { for(i=0;i { 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 {