信息论编码实习报告Word文档格式.docx
《信息论编码实习报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《信息论编码实习报告Word文档格式.docx(61页珍藏版)》请在冰豆网上搜索。
Ifprefix.cisinDictionaryprefix←prefix.c
else
code-stream←cwforprefixDictionary[j]←prefix.c
j←n+1
prefix←c
end
code-stream←cwforprefix
(2)译码算法
cw←firstcodefromcode-streamchar-stream←Dictionary[cw]pw←cw
while((cw←nextcodeword)!
=NULL)ifcwisinDictionary
char-stream←Dictionary[cw]prefix←Dictionary[pw]
k←firstcharacterofDictionary[cw]
Dictionary[j]←prefix.kj←n+1
pw←cw
prefix←Dictionary[pw]
k←firstcharacterofprefixchar-stream←prefix.kDictionary[j]←prefix.k
pw←cwj←n+1
④程序及运行结果
(1)编码程序#include<
stdio.h>
#include<
stdlib.h>
#include<
string.h>
charstr[]="
TheLempelZivalgorithmcancompresstheenglishtextbyaboutfiftyfivepercent."
;
char Dic[200][5];
//定义一个二维的字符串数组,用来存放字典内容,200表示个数,5表示长度
/**********************************************************
函数名称:
intFind(strings)
函数功能:
在字典中寻找字符s,并返回在字典中的序号输入参数:
所要查找的字符
返回值:
字符在字典中对应的标号
**********************************************************/intFind(char*str)
{
inti,temp=-1;
for(i=0;
i<
200;
i++) //这个地方的i<
200要与上面定义的dic
长度相对应,否则会输出错误结果
if(strcmp(Dic[i],str)==0)temp=i+1;
//字符的查找,并输出对应的相对位置
}
returntemp;
voidDic_init(),字典初始化
将a~z,A~Z以及一些标点符号加入字典中并编号输入参数:
void
/**********************************************************/voidDic_init()
inti,j;
for(j=0,i=0;
26;
i++)//新建一个字典,将A-Z存入其中
Dic[j][0]='
A'
+i;
j++;
for(j=26,i=0;
i++)//新建一个字典,将a-z存入其中
a'
Dic[52][0]='
'
//存入四个符号
Dic[53][0]='
.'
Dic[54][0]='
?
'
Dic[55][0]='
!
Dic[56][0]='
'
intmain()//主程序
printf("
输入待编码的字符串为:
\n%s\n"
str);
Dic_init();
//字典初始化
chartemp[2];
//定义2个字符长的字符串temp[0]=str[0];
//取第一个字符temp[1]='
\0'
//将第2个设置为空格
charP[5];
//P为前缀,将temp赋给字符串Pstrcpy(P,temp);
inti=1;
//下面从第2个字符开始
intj=57;
//目前字典存储的最后一个位置
编码为:
"
);
while
(1)
chart[2];
//定义2个字符长的字符串t[0]=str[i];
//取下一字符
t[1]='
//将第2个设置为空格charC[5];
//C为字符流中下一个字符chard[5];
strcpy(C,t);
charBlank[2]="
if(!
strcmp(C,Blank)) //无码字要译,结束
%4d"
Find(P));
//输出代表当前前缀的码字break;
//退出循环,编码结束
strcpy(d,P);
if(Find(strcat(P,C))>
-1) //有码字要译,如果P+C在词典中,则用C扩展P,进行下一步:
i++;
else //如果P+C不在词典中,则将P+C添加到词典中,令
P:
=C
Find(d));
//输出代表当前前缀的码字charPC[5];
strcpy(PC,strcat(d,C));
strcpy(Dic[j++],PC);
strcpy(P,C);
\n生成的字典为:
\n"
j;
i++) //输出词典中的内容,j为词典的长度
%8d—%s;
i+1,Dic[i]);
return0;
运行结果:
(2)译码程序#include<
//intCodenum[100];
//定义接收到的一串编码
intCodenum[]={20,34,31,57,12,31,39,42,31,38,57,26,35,48,57,27,38,
33,41,44,35,46,34,39,57,29,27,40,82,41,64,44,31,45,45,57,79,60,31,40,3
3,38,35,45,34,93,31,50,46,57,28,51,72,28,41,47,106,32,35,32,46,109,115,4
8,60,65,44,29,96,46,54,0};
intCodeum[]={20,34,31,57,29,27,46,61,27,40,40,41,64,45,35,64,41,40,
57,46,59,65,68,42,51,57,41,32,76,78,62,44,54,0};
//定义接收到的一串编码,结尾以0做标志
charstr[100];
//定义一个待编码的字符串变量
chardic[200][10];
//这是定义字典存放空间,其容量大小可以自己更改,但是一定要有足够的地方存放下面生成字典的内容,否则会运行出错
//intn;
intFind(intx)
在字典中寻找字典元素并返回输入参数:
所要查找的编码
字典中相应位置的字典元素
**********************************************************/
用a~z,A~Z以及一些标点符号,初始化字典输入参数:
**********************************************************/voidDic_init()
dic[j][0]='
dic[j][1]='
dic[52][0]='
dic[53][0]='
dic[54][0]='
dic[55][0]='
dic[56][0]='
//for(i=52;
=56;
i++)dic[i][1]='
voidcode(stringstr)
对输入的字符串进行LZW字典编码输入参数:
str待编码的字符串
用cout输出显示编码后的码
voidDe_code(int*code)
charCurr[10];
charCu[2];
Cu[1]='
charPre[10];
Dic_init