logo资料库

哈夫曼编/译码器I:初始化(Initialization)。E:编码(Encoding)。D:译码(Decoding)。P:印代....doc

第1页 / 共40页
第2页 / 共40页
第3页 / 共40页
第4页 / 共40页
第5页 / 共40页
第6页 / 共40页
第7页 / 共40页
第8页 / 共40页
资料共40页,剩余部分请下载后查看
目 录
目 录 1 设计目的................................................................................................................. 2 1.1 设计任务与要求............................................................................................. 2 2 总体设计................................................................................................................. 3 2.1 设计思路..........................................................................................................3 2.2 软件流程图..................................................................................................... 4 2.3 功能模块说明................................................................................................16 3 调试与测试...........................................................................................................16 3.1 测试方法...................................................................................................... 16 3.2 结果分析...................................................................................................... 16 4 设计总结............................................................................................................... 26 4.1 设计体会...................................................................................................... 26 4.2 存在问题与建议.......................................................................................... 27 5 参考文献............................................................................................................... 28 附录(源程序清单).............................................................................................. 29 - 1 -
1 设计目的 1.1 设计任务与要求 [基本要求] 一个完整的系统应具有以下功能: (1)I:初始化(Initialization)。从终端读入字符集大小 n,以及 n 个 字符和 n 个权值,建立哈夫曼树,并将它存于文件 hfmTree 中。 (2)E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文 件 htmTree 中读入),对文件 ToBeTran 中的正文进行编码,然后将结果存入文 件 CodeFile 中。 (3)D:译码(Decoding)。利用已建好的哈夫曼树将文件 CodeFile 中的 代码进行译码,结果存入文件 TextFile 中。 (4)P:印代码文件(Print)。将文件 CodeFile 以紧凑格式显示在终端上, 每行 50 个代码。同时将此字符形式的编码写入文件 CodePrint 中。 (5)T:印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观 的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文 件 TreePrint 中。 [测试数据] (1)数据一:已知某系统在通信联络中只可能出现 8 种字符,其概率分别 为 0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,以此设计哈夫曼编码。利用此 数据对程序进行调试。 (2)用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以 下报文的编码和译码:“THIS PROGRAM IS MY FAVORITE”。 字符 A B C D E F G H I 频度 186 64 13 22 32 10 21 15 47 57 字符 N O P 频度 57 63 15 Q 1 [实现提示] 3 S R T U 48 51 80 23 V 8 W 18 J 1 X 1 K 5 Y 16 L M 32 20 Z 1 (1)文件 CodeFile 的基类型可以设为子界型 bit = 0..1。 - 2 -
(2)用户界面可以设计为“菜单”方式:显示上述功能符号,再加上“Q”, 表示运行 Quit。请用户键入一个先把功能符,些功能执行完毕后再经菜单,直 至某次用户先把了“E”为止。 (3)在程序的一次执行过程中,第一次执行 I、D 或 C 命令之后,哈夫曼树 已经在内存了,不必再读入。每次执行中不一定执行 I 命令,因为文件 hfmTree 可能早已建好。 2 总体设计 2.1 设计思路 程序设计要根据题目要求来设计,由于设计要求较多,该程序应该采用函 数调用,分开来设计函数,使问题简单化,然后利用调用函数将这些函数统一起 来。 首先建立哈夫曼树,设计一个初始化(Initialization)函数对哈夫曼树进 行初始化从终端能输入字符字符的数目,能输入字符和权值,并将字符和权值保 存在文件 hfmtree 中。再设计一个想要输入的字符的函数,获取输入的字符,保 存在文件 tobetran 中。然后写一个编码(Encoding)函数对文件 tobetran 中的字 符进行编码,并将编码保存到文件 codefile 中。再写一个译码(Decoding)函数 对文件 codefile 中代码进行译码。写一个打印代码文件(print)函数要将文件 codefile 中的译码显示在屏幕上,同时再将此译码写入文件 codeprint 中。写 一个打印哈夫曼树(tree printing)函数,将存在内存中的哈夫曼树显示在屏幕 上,同时将此字符形式的哈夫曼树写入文件 treeprint 中。最后写一个 main 主 函数,将这些函数调用起来。 - 3 -
2.2 软件流程图 N N int j,flag; j=1 j<=i Y t[j].weights2 Y j=s1; s1=s2; s2=j; N select(HuffmanTree t,int i,int &s1,int &s2)函数 - 4 -
int m,i,s1,s2,start; n<=1 Y return; m=2*n-1; p=HT+1,i=1 i<=n Y p->weight=*w; N N iparent=0; ++i,++p i=n+1 i<=m ++i,++p,++w select(HT,i-1,s1,s2) Y N i++ HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); i=1 1 - 5 -
1 i<=n Y start=n-1; N c=i,f=HT[i].parent N N cd[--start]='1'; f!=0 Y HT[f].lchild = =c Y cd[--start]= '0'; c=f,f=HT[f].parent HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); i++ free(cd); HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)函数 - 6 -
flag=1 i=0 i
2 (htmTree=fopen("htmTree.txt ","w"))==NULL Y cout<<"can not open file!"<
分享到:
收藏