《软件开发》
课程设计报告
题目:电文编码/译码系统设计 院(系):信息科学与工程 专业班级:通信1501 学生姓名:** 学号:20151105014 指导教师:聂兵 评分: )
20 17 年2 月21日至20 17 年月日
目录
1 课程设计的目的 ····································································· 错误!未定义书签。 2 总体设计 ··············································································· 错误!未定义书签。 3 详细设计 ··············································································· 错误!未定义书签。 3.1 构造哈夫曼树 ···································································· 错误!未定义书签。 3.2 哈夫曼编码 ·········································································· 错误!未定义书签。 3.2 哈夫曼译码 ·········································································· 错误!未定义书签。 4 软件测试 ··············································································· 错误!未定义书签。 5 结论 ······················································································· 错误!未定义书签。 参考文献······················································································ 错误!未定义书签。 附录代码清单·············································································· 错误!未定义书签。
1 课程设计的目的
在当今信息爆炸的时代,哈夫曼编码是一种应用广泛而且很有效的数据压缩技术,能够很好的压缩数据文件的存储空间。在数据通信中,常常需要把要传输的文字信息转换成为由二进制的字符0、1组成的二进制字符串,这个过程称之为编码;接收信息后需要将0、1组成的二进制字符串编译成文字,这个过程称之为译码。作为通信专业的学生,我们要很好的掌握这门技术。
2 总体设计
电文编码/译码系统的最主要的功能是要先建立哈夫曼树,然后再根据建好的哈夫曼树生成相对应的哈夫曼编码再来进行译码。设需要进行编码的字符集合是{d1、d2、d3、d4……dn},其在整个电文中出现的频率的集合为{w1、w2、w3、w4……wn},把d1、d2、d3、d4……dn当作哈夫曼树中叶子的节点,把w1、w2、w3、w4……wn对应叶子的权值,构造一棵哈夫曼树。再规定哈夫曼树中的左分支代表0,右分支代表1,因此从根节点往每个叶子节点所经过的路径分支组成的0和1的序列就是该节点所对应字符的编码。
流程图 开始 输入字符串 统计输入的字符串的节点与权值 dnnasc 否 根节点是否>1 是 输出根节点和权值 调用select函数 双亲节点为两子节点之和 输出两孩子节点和已经构造的节点 是否为根节点 否 是 是 是 否 否
左孩子是否为空? 右孩子是否为空 编码为0 编码为1 结束 1
3 详细设计
3.1 构造哈夫曼树
Void CreateHT(HTNodeht[],intn,charstr[],intcn[]) //创建哈夫曼树函数 {
for(int input=1;input<=256;input++) { } int l=0;
for(int output=1;output<=256;output++) {
if(cn[output] !=0) { }
ht[l].data=str[output]; //按照字母表的顺序将出现的字ht[l].weight=cn[output]; l++; str[input]=input;
母依次存入数组ht[] 中
}
inti,k,lnode,rnode; int min1,min2;
for (i=0;i<2*n-1;i++)
ht[i].parent=ht[i].lchild=ht[i].rchild=0; //所有结点的相关域置为初值0 for (i=n;i<2*n-1;i++) //构造哈夫曼树 {
min1=min2=MAX; //int的范围是-32768-32767 lnode=rnode=0; //lnode和rnode分别来记录最小权
for (k=0;k<=i-1;k++) //选出每次外层循环时最小权值的两{
if (ht[k].parent==0) //只在还没有构造二叉树的结点{
2
值的两个结点的位置 个结点
中查找