PAGE
PAGE #
PAGE
PAGE #
一、需求分析
目前,进行快速远距离通信的主要手段是电报, 即将需传送的文字转化成由二级制的字符组成的字 符串。例如,假设需传送的电文为“ ABACCDA ”, 它只有4种字符,只需两个字符的串,便可以分辨。 假设A、B、C、D、的编码分别为00,01,10和11, 则上述7个字符的电文便为“ 0001001010110(”,总 长14位,对方接受时,可按二位一分进行译码。
当然,在传送电文时,希望总长尽可能地短。如 果对每个字符设计长度不等的编码,且让电文中出现 次数较多的字符采用尽可能短的编码,则传送电文的 总长便可减少。如果设计 A、B、C、D的编码分别 为0,00,1,01,则上述7个字符的电文可转换成总长为 9的字符串“ 000011010'。但是,这样的电文无法翻 译,例如传送过去的字符串中前4个字符的字串
“ 0000”就可以有很多种译法,或是“ AAAA ”或者 “ BB ”,或者“ ABA ”等。因此,若要设计长短不等 的编码,则必须是任一字符的编码都不是另一个字符 的编码的前缀,这种编码称作前缀编码。
然而,如何进行前缀编码就是利用哈夫曼树来
做,也就有了现在的哈夫曼编码和译码。
二、概要设计
利用哈夫曼树编/译码
(一人建立哈夫曼树
(一人
建立哈夫曼树
(二人 对哈夫曼树进行编码
(三)、输出对应字符的编码
译码过程
主要代码实现:
struct code〃结构体的定义
char a; int w;
int parent; int (child; int rchild;
void creation(code *p,int njnt m); //建立哈夫曼树
〃编码void coding(code *p,int n);
〃编码
void displays code 木pjnt njnt m); 〃输出函数
void translate* char *^hc,code wp,int n);
三、详细设计
x~)>
x~)>建立哈夫曩树
宀 o ooo
64623 4 3 6 13图图
646
23 4 3 6 1
3
(一)、对哈夫曼树进行编码主要代码实现:
(一)、对哈夫曼树进行编码
从叶子到根逆for(c=i,f=p[i].pare nt;f!=O;c=f,f=p[f].pare nt) {
从叶子到根逆
if(p[f]」child==c)
{
} else//右孩子编码为'1' 01
} else
//右孩子编码为'1' 01
{
cd[--start]='1:
}
}
(二)、输出对应字符的码
字符
编码
a
110
b
111
c
10
d
0
表
三)、译码过程 要代码实现:
if(strcmp(a,hc[i])==O) //比较两个字符串是否相等,
则输出0
for(c=2* n-1,j=0;a[j]!='\0';j++)
'O'或'1'确定找左孩子或右孩子
{
if(a[j]=='0')〃左孩子
{
c=p[c].lchild;
}
else
//从根出发,按字从跟到叶子顺0 1{
//从根出发,按字
从跟到叶子顺
0 1
c=p[c].rchild;II 右孩子
”的藪字血入雾冲號字臓第if ?数罕运和字母的输图
”的藪字血入雾冲號字臓第if ?数罕运和
字母的输
图
S'
s and S
制⑴?用扎臺个数号:按峯一个鮒字返帶》
H 修新轲人1
也字桃1职臺靜入一个数和=
三、调试分析
数字的输入判断
巒心咲?<二二二二二二
g新输人
)丄丄i11111
gWfftA.
涣定?Cluu*u*?KLt s
涣定?Cluu*u*?KLt s anil Sr lt,jLTk£ff \ AiLa.JLiuLsli.ajLiixA it Hi '.buf 1 sulX Vebu.E ^ iLuLlM^ ..
程序是否继续进行的萨卸
判断
lifl
毛否誉滞 '汽術几用者V)否曲辿”
|lBTe^E; -Bjay hey 七? k. ohi t. iiiiAE!
四、用户手册
(一)、首先根据提示输入初始化数据,提示输入一 个数字,请输入一个数a,0
(二)在某一界面结束后,会有“请按回车继续下面 操作"提示,请按提示进行操作,如输入其他数字则 无效,知道输入回车符界面才会跳转。
(三)对界面的操作可以自行选择,在询问是否译码 的时候,请按