信息论编码与密码学实习报告姓名:学号:班级:指导老师:目录一.LempelZil字典编码----------------------------7二.信道容量的计算--------------------------------16三.Hamming码的编码与译码-------------------------36四.循环码最小距离的计算--------------------------43五.维特比译码器软件的设计------------------------56六.实习心得--------------------------------------571一、LempelZiv字典编码1、题目要求:写一个执行Lempel-Ziv算法的程序。该程序的输入可以是英文字母。它应该将字母转化为她们的ASCII码然后进行压缩.它应该输出压缩结果。用这个程序求下列的字符串所得到的压缩:(1)TheLempelZivalgorithmcancompresstheEnglishtextbyaboutfiftyfiveprecent.(2)Thecatcannotsitonthecanopyofthecar.2、算法设计:(1)字典初始化(2)增添开始与结束位(3)开始读入字符流,进入循环(4)以两个字符为一组构建新的字符(5)判断新的字符是否存在于字典中,如果存在,不做处理,如果不存在,将其添加到字典中,将该新字符在字典中的位置作为编码发送(6)译码过程与编码过程相反23、算法流程图开始字典初始化在字典中寻找字符s读入字符p读入下一个字符c判断p+c是否存在字典中将p+c存入字典令p=cp=p+cnoyes34、程序代码:#include#include#includeusingnamespacestd;stringstr1;//定义字符串变量str1stringstr2;stringdic[500];intn;//函数名:intfind(strings)//函数功能:在字典中寻找字符s,并返回在字典中的序号//参数:所要查找的字符//返回值:字符在字典中对应的标号intfind(strings){inttemp=-1;for(inti=0;i<100;i++){if(dic[i]==s)temp=i+1;}returntemp;}//函数名:voidinit()//函数功能:用a~z,A~Z以及一些标点符号,初始化字典//参数:void//返回值:void4voidinit()//字典初始化{inti,j;for(j=0,i=0;i<=26;i++){dic[j]='A'+i;j++;}for(j=26,i=0;i<=26;i++){dic[j]='a'+i;j++;}dic[52]=",";dic[53]=".";dic[54]="?";dic[55]="!";}//函数名:voidcode(stringstr)//函数功能:对输入的字符串进行LZW字典编码//参数:str待编码的字符串//返回值:用cout输出显示编码后的码voidcode(stringstr){init();//初始化chartemp[2];temp[0]=str[0];//取第一个字符temp[1]='\0';stringP=temp;//P为前缀5inti=1;intj=56;//目前字典存储的最后一个位置cout<<"编码为:";while(1){chart[2];t[0]=str[i];//取下一字符t[1]='\0';stringC=t;//C为字符流中下一个字符if(C=="")//无码字要译,结束{cout<<""<-1)//有码字要译,如果P+C在词典中,则用C扩展P,进行下一步:{P=P+C;//前缀变成p+ci++;}else//如果P+C不在词典中,则将P+C添加到词典中,令P=C{cout<<""<