信息论与编码实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

{

相关文档
最新文档