数据结构课设报告+哈夫曼编译器+C语言+源码

合集下载

数据结构(C语言版)实验报告(哈夫曼树)

数据结构(C语言版)实验报告(哈夫曼树)

《数据结构与算法》实验报告一、需求分析1.问题描述:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。

对于双工通道(及可以双向传输信息的通道),每端都需要一个完整的编/译码系统。

试为这样的信息收发站写一个哈夫曼的编/译码系统。

2.基本要求一个完整的系统应具有以下功能:(1)I:初始化(Initialization)。

从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。

(2)E:编码(Encoding)。

利用已建好的哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。

(3)D:译码(Decoding)。

利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。

(4)P:印代码文件(Print)。

将文件CodeFile以紧凑格式显示在终端上,每行50个代码。

同时将此字符形式的编码文件写入文件CodePrin中。

(5)T:印哈夫曼树(Tree printing)。

将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示出,同时将此字符形式的哈夫曼树写入文件TreePrint中。

3.测试数据(1)利用教科书例6-2中的数据调试程序。

(2)用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAM IS MY FAVORITE”。

4,实现提示(1)编码结果以文本方式存储在文件CodeFile中。

(2)用户界面可以设计为“菜单”方式:显示上述功能符号,再加上“Q”表示退出运行Quit。

请用户键入一个选择功能符。

此功能执行完毕后再显示此菜单,直至某次用户选择了“Q”为止。

(3)在程序的一次执行过程中,第一次执行I、D或C命令之后,哈夫曼树已经在内存了,不必再读入。

哈夫曼编码译码系统课程设计实验报告(含源代码C++_C语言)

哈夫曼编码译码系统课程设计实验报告(含源代码C++_C语言)

目录摘要 (II)Abstract (II)第一章课题描述 (1)1.1 问题描述 (1)1.2 需求分析…………………………………………………..……………………………11.3 程序设计目标……………………………………………………………………………第二章设计简介及设计方案论述 (2)2.1 设计简介 (2)2.2 设计方案论述 (2)2.3 概要设计 (2)第三章详细设计 (4)3.1 哈夫曼树 (4)3.2哈夫曼算法 (4)3.2.1基本思想 (4)3.2.2存储结构 (4)3.3 哈夫曼编码 (5)3.4 文件I/O 流 (6)3.4.1 文件流 (6)3.4.2 文件的打开与关闭 (7)3.4.3 文件的读写 (7)3..5 C语言文件处理方式……………………………………………………………………第四章设计结果及分析 (8)4.1 设计系统功能 (8)4.2 进行系统测试 (8)总结 (13)致谢 (14)参考文献 (15)附录主要程序代码 (16)摘要在这个信息高速发展的时代,每时每刻都在进行着大量信息的传递,到处都离不开信息,它贯穿在人们日常的生活生产之中,对人们的影响日趋扩大,而利用哈夫曼编码进行通信则可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

在生产中则可以更大可能的降低成本从而获得更大的利润,这也是信息时代发展的趋势所在。

本课程设计的目的是使学生学会分析待加工处理数据的特性,以便选择适当的逻辑结构、存储结构以及进行相应的算法设计。

学生在学习数据结构和算法设计的同时,培养学生的抽象思维能力、逻辑推理能力和创造性的思维方法,增强分析问题和解决问题的能力。

此次设计的哈夫曼编码译码系统,实现对给定报文的编码和译码,并且任意输入报文可以实现频数的统计,建立哈夫曼树以及编码译码的功能。

这是一个拥有完备功能的系统程序,对将所学到的知识运用到实践中,具有很好的学习和研究价值.关键词:信息;通讯;编码;译码;程序AbstractThis is a date that information speeding highly development and transmitinformation every time, everywhere cannot leave the information, it passes through during the people daily life production, the influence expands day by day to the people, but codes using Huffman carries on the correspondence to be possible to raise the channel use factor greatly, reduces the intelligence transmission time, reduces the transmission cost. May greatly possible reduce the cost in the production, thus obtains a bigger profit, this is also the information age development tendency is. This curriculum project's goal is makes the student academic society to analyze treats the processing data the characteristic, with the aim of choosing the suitable logical organization, the memory structure as well as carries on the corresponding algorithm design. The student during the study construction of data and algorithm design’s raises student's abstract thinking ability, logic reasoning ability and the creative thought method, the enhancement analysis question and solves the question ability. This design's Huffman codes the code recognition system, realizes to assigns the text the code and the decoding, and the arbitrary input text may realize the frequency statistics, establishes the Huffman tree as well as the code decoding function. This is one has the complete function system program, to the knowledge which will learn utilizes in the practice, has the very good study and the research value.Keywords:Information; Communication; Coding; Decoding; Procedure第一章课题描述1.1问题描述利用哈夫曼编码进行通信,可以压缩通信的数据量,提高传输效率,缩短信息的传输时间,还有一定的保密性。

数据结构课程设计总结报告 哈夫曼编码译码

数据结构课程设计总结报告 哈夫曼编码译码

《数据结构》课程设计实验报告题目哈夫曼编码/译码器学院数理与信息学院专业计算机科学与技术班级计科132学生姓名刘海澍 5周弘杰8徐铭瑶 3指导教师编写日期数据结构课程设计目录1 问题描述.................................................................错误!未定义书签。

2 问题分析.................................................................错误!未定义书签。

3 算法设计 (2)3.1抽象数据类型定义 (2)3.2模块划分 (3)4 详细设计 (4)4.1数据类型的定义 (4)4.2主要模块的算法描述 (4)4.3 流程图 (6)5 测试分析 (9)6 课程设计总结 (10)7 成员分工 (10)参考文献 (11)附录(源程序清单) (12)1.问题描述设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。

1) 初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;2) 编码:利用建好的哈夫曼树生成哈夫曼编码;3) 输出编码;4)显示哈夫曼树;5)界面设计的优化;6) 设字符集及频度如下表:字符空格 A B C D E F频度4 9 23 2 17 15字符G H I J K频度1 2 3 3 42.问题分析(1)定义一个变量名为HTNode的结构体,用该结构体中的char data、int weight、int parent、int lchild、int rchild分别表示哈夫曼树中每个结点的权值、权重、双亲结点、左孩子、右孩子,再定义一个HTNode类型的数组ht[60]存放哈夫曼树;另外定义一个变量名为HCode的结构体,采用HCode类型变量的cd[start]~cd[n]存放当前结点的哈夫曼编码、最后定义一个HCode类型的数组hcd[30]的数组用于存放当前叶子结点ht[i]的哈夫曼编码。

哈夫曼编码译码器数据结构C语言模板

哈夫曼编码译码器数据结构C语言模板

一、需求分析目前,进行快速远距离通信的主要手段是电报,即将需传送的文字转化成由二级制的字符组成的字符串。

例如,假设需传送的电文为“ABACCDA ”,它只有4种字符,只需两个字符的串,便可以分辨。

假设A 、B 、C 、D 、的编码分别为00,01,10和11,则上述7个字符的电文便为“00010010101100”,总长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 lchild; int rchild; };void creation(code *p,int n,int m); //建立哈夫曼树 void coding(code *p,int n); //编码 void display(code *p,int n,int m); //输出函数 void translate(char **hc,code *p,int n); //译码三、 详细设计(一)、建立哈夫曼树a b c d1 2 3 4 5 * * * 6 7 a b * c *ab*c *d * 序号: 字符: 权值: 1 2 3 4 3 6 10 a b * 1 2 1 2 3 3 1 2 3 3 6 4 103 6 图3-1 图3-2 图3-3(二)、对哈夫曼树进行编码 主要代码实现:for(c=i,f=p[i].parent;f!=0;c=f,f=p[f].parent) { if(p[f].lchild==c) //左孩子编码为'0'{ cd[--start]='0'; } else //右孩子编码为'1'{ cd[--start]='1'; } }(三)、输出对应字符的码字符 编码 a 110 b 111 c 10 d(四)、译码过程 主要代码实现:if(strcmp(a,hc[i])==0) //比较两个字符串是否相等,相等则输出0 { for(c=2*n-1,j=0;a[j]!='\0';j++) //从根出发,按字符'0'或'1'确定找左孩子或右孩子 { if(a[j]=='0') //左孩子 {c=p[c].lchild;}else {c=p[c].rchild; //右孩子 }}ab* c* d*1 1 0 1 0 图3-4表3-1从叶子到根逆向求编码a b*c *d *0 1 1 1 从跟到叶子顺向求字符 图3-5四、 调试分析(一)、数字的输入判断(二)、字母的输入判断(三)、程序是否继续进行的判断五、 用户手册(一)、首先根据提示输入初始化数据,提示输入一个数字,请输入一个数a ,0<a<9999;提示输入一个字母,则请输入一个字母(a~z)或者(A~Z)中的一个字符;请勿在输入一个数字后再输入一个字符,或者在输入一个字符后再输入一个数字。

哈夫曼树课程设计报告c语言

哈夫曼树课程设计报告c语言

哈夫曼树课程设计报告c语言哈夫曼树是广泛应用于数据压缩和编码的一种数据结构。

在计算机科学中,哈夫曼编码是一种无损的压缩算法,它基于使用较少的位数来表示频繁出现的字符,从而达到节省空间的目的。

本篇文章将围绕哈夫曼树的课程设计报告进行阐述,帮助读者更加深入地理解和应用哈夫曼树。

首先,我们需要了解哈夫曼树的基本概念和算法。

哈夫曼树是一种二叉树,它的每个节点都表示一个字符和它出现的频率。

哈夫曼树的算法主要是通过构建最小权重树来实现,即将输入的字符按照出现的频率进行排序,然后选择出现频率最小的两个字符,将它们合并成一个节点。

这个新节点的权重就是两个字符的权重之和。

继续将这个新节点与下一个最小频率字符继续合并,直到所有字符合并成一个节点。

最终形成的二叉树就是哈夫曼树。

接下来,我们需要学习如何在C语言中实现哈夫曼树。

在实现过程中,我们需要定义一个结构体来表示哈夫曼树节点。

这个结构体包含两个成员:字符和出现的频率。

同时,我们需要定义一个优先队列来存储字符节点和它们的权重。

在优先队列中,我们需要实现一些基本操作,比如插入、删除和取出队首元素等等。

通过这些操作,我们就可以按照字符频率构建出哈夫曼树。

最后,我们需要实现哈夫曼编码的功能。

在哈夫曼编码中,我们需要定义一个数组来存储每个字符的编码。

这个数组的索引是字符的ASCII码,它的值是该字符的哈夫曼编码。

在对输入字符串进行编码时,我们从哈夫曼树的根节点开始,按照左右子树的方向进行编码。

当遇到叶子节点时,我们就将编码添加到输出字符串中。

最终,我们就可以完成对字符串的压缩和解压。

综上所述,哈夫曼树是一种非常有用的数据结构,它在数据压缩和加密领域都有广泛的应用。

通过本篇文章的介绍,希望读者们能够更加深入地理解哈夫曼树的基本概念和实现方法。

在学习过程中,读者们也可以尝试自己动手实现哈夫曼树,并应用到实际的项目中,提高自己的编程能力。

(完整word版)数据结构课程设计(哈夫曼编码)

(完整word版)数据结构课程设计(哈夫曼编码)

目录目录 (1)1 课程设计的目的和意义 (3)2 需求分析 (5)3 系统设计 (6)(1)设计思路及方案 (6)(2)模块的设计及介绍 (6)(3)主要模块程序流程图 (9)4 系统实现 (14)(1)主调函数 (14)(2)建立HuffmanTree (14)(3)生成Huffman编码并写入文件 (18)(4)电文译码 (19)5 系统调试 (22)小结 (25)参考文献 (26)附录源程序 (27)1 课程设计的目的和意义在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。

哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。

哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。

树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0"码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1"的序列作为和各个对应的字符的编码,这就是哈夫曼编码。

通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。

电报通信是传递文字的二进制码形式的字符串。

但在信息传递时,总希望总长度尽可能最短,即采用最短码。

作为软件工程专业的学生,我们应该很好的掌握这门技术。

在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。

在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。

这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们可以逐步积累调试C程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。

在课程设计过程中,我们不但有自己的独立思考,还借助各种参考文献来帮助我们完成系统。

更为重要的是,我们同学之间加强了交流,在对问题的认识方面可以交换不同的意见.同时,师生之间的互动也随之改善,我们可以通过具体的实例来从老师那学到更多的实用的知识。

哈夫曼编码译码器数据结构C语言

哈夫曼编码译码器数据结构C语言

哈夫曼编码译码器数据结构C语言哈夫曼编码译码器数据结构C语言⒈简介本文档旨在介绍一个使用C语言实现的哈夫曼编码译码器的数据结构。

哈夫曼编码是一种用于数据压缩的算法,它通过将频率较高的字符用较短的编码表示,从而实现数据的压缩和解压缩。

⒉哈夫曼编码(Huffman Coding)基本概念⑴字符频率统计在进行哈夫曼编码之前,我们首先需要统计每个字符在待编码的数据中出现的频率。

通过遍历数据,记录每个字符的出现次数,我们可以得到一个字符频率的统计表。

⑵构建哈夫曼树通过字符频率的统计表,我们可以构建一个哈夫曼树。

哈夫曼树是一种二叉树,其中每个叶节点表示一个字符,而每个内部节点表示一个权重,即两个子节点的频率之和。

⑶哈夫曼编码在哈夫曼树构建完成后,我们可以根据树的结构每个字符的编码。

哈夫曼编码的特点是没有任何一个字符的编码是另一个字符编码的前缀,这种编码方式称为前缀编码。

⑷哈夫曼译码根据字符的哈夫曼编码,我们可以将编码后的数据进行解码,还原为原始的数据。

通过遍历哈夫曼树,从根节点开始,根据每个二进制位的取值进行向左或向右的移动,直至叶节点,然后获取该叶节点对应的字符。

⒊数据结构设计⑴结点结构定义一个哈夫曼树的结点结构,包含以下字段:●`char data`:字符●`int frequency`:字符的频率●`int is_leaf`:是否为叶节点●`struct Node left_child`:左子节点●`struct Node right_child`:右子节点⑵频率统计表使用一个数组或链表来记录每个字符的频率统计信息,包含以下字段:●`char data`:字符●`int frequency`:字符的频率⑶编码表使用一个数组或链表来记录每个字符的哈夫曼编码,包含以下字段:●`char data`:字符●`char code`:编码⒋算法流程⑴字符频率统计算法步骤:⒈初始化频率统计表为空。

⒉读取待编码的数据。

哈夫曼编码-数据结构-C程序

哈夫曼编码-数据结构-C程序

数据结构课程设计一、目的《数据结构》是一门实践性较强的软件基础课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。

本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。

二、要求通过这次设计,要求在数据结构析逻辑特性和物理表示,数据结构的选择的应用、算法的设计及其实现等方面中深对课程基本内容的理解。

同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

三、内容2.哈夫曼编码/译码器【问题描述】设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。

【基本要求】(1)初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;(2)编码:利用建好的哈夫曼树生成哈夫曼编码;(3)输出编码;(4)设字符集及频度如下表:字符空格A B C D E F G H I J K L M频度186 64 13 22 32 103 21 15 47 57 1 5 32 20字符N O P Q R S T U V W X Y Z频度57 63 15 1 48 51 80 23 8 18 1 16 1【选做内容】(1)译码功能;(2)显示哈夫曼树;(3)界面设计的优化。

哈夫曼编写编译码一、问题描述利用哈夫曼编码进行通信可以大大提高信道利用率,这要求在发送端通过一个编码系统对待传输预先编码,在接收端将传来的数据进行译码。

对于双工通道,每端都需要一个完整的编/译码系统。

试为这样的信息收发站写一个哈夫曼码的编/译码系统。

二、概要设计1.哈夫曼树的定义:在一棵二叉树中,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树。

2.哈夫曼树的构造:假设有N个权值,则构造出的哈夫曼树有N个叶子结点。

N个权值分别设为W1,W2,……….Wn,则哈夫曼树的构造规则为:(1)将W1,W2,……….Wn看成有N棵树的森林;(2)在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左,右子树,且新树的根结点为其左,右子树结点权值之和;(3)从森林中删除选取取的两面三刀棵树,并将新树加入森林;(4)重复(2)(3)步,直到森林中只剩一棵树为止,该树即为我们所求得的哈夫曼树。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中南大学数据结构课程设计报告题目哈夫曼编译器学生姓名孙毅指导教师杨希学院信息科学与工程学院专业班级信息安全1401班二○一六年十一月目录一、课程设计目的 (3)二、课程设计的内容 (3)2.1、问题描述 (3)2.2、基本要求 (3)三、问题描述,解决的方法 (3)3.1从键盘读入字符集大小n , 以及n个字符和权值,建立哈夫曼树。

(3)3.2利用已建好的哈夫曼树对文件正文进行编码,将结果存入相关文件中。

53.3利用已建好的哈夫曼树将编码文件中的代码进行译码,结果存入文件中。

(6)3.4输出代码文件,以紧凑格式显示。

(7)3.5以直观的方式输出哈夫曼树,同时将此字符形式的哈夫曼树写入文件中。

(7)四、程序模块功能,程序设计组成框图、流程图 (8)4.1程序模块功能 (8)4.2程序设计框图 (8)4.3流程图 (9)五、调试与测试。

调试方法,测试结果的分析与讨论,遇到的主要问题及采取的解决措施。

(10)5.1调试方面 (10)5.2测试结果方面 (10)六、测试结果,用几组测试数据进行测试算法设计的正确性 (10)6.1第一组数据如下 (10)6.2第二组测试数据如下: (14)七、本次课程设计的心得体会 (16)八、附录:源程序清单 (17)一、课程设计目的数据结构是计算机专业的核心课程,是计算机科学的算法理论基础和软件设计的技术基础,实践性强,课程设计是加强学生实践能力的一个重要手段。

课程设计要求学生在完成程序设计的同时能够写出规范的设计报告,培养学生分析问题、解决问题,提高学生软件设计能力。

二、课程设计的内容哈夫曼编译器2.1、问题描述利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码。

对于双向传输信息的信道,每端都需要一个完整的编译码系统。

为这样的信息收发站编写哈夫曼编译系统。

2.2、基本要求(1)从键盘读入字符集大小n , 以及n个字符和权值,建立哈夫曼树。

(2)利用已建好的哈夫曼树对文件正文进行编码,将结果存入相关文件中。

(3)利用已建好的哈夫曼树将编码文件中的代码进行译码,结果存入文件中。

(4)输出代码文件,以紧凑格式显示。

(5)以直观的方式输出哈夫曼树,同时将此字符形式的哈夫曼树写入文件中。

三、问题描述,解决的方法3.1从键盘读入字符集大小n , 以及n个字符和权值,建立哈夫曼树。

a.首先设计一个结构体,成员有权值、左右儿子、以及字符本身,再设计一个输入函数,函数中要求输入字符集大小n,以及这n个字符和他们各自对应的权值。

b.再根据以上的各种输入结合建立哈夫曼树的思想原理建立起哈夫曼树,设计的函数包括有两个,一个是选中最小权值的两棵树,另一个是创建哈夫曼树。

3.2利用已建好的哈夫曼树对文件正文进行编码,将结果存入相关文件中。

a.第一步是要求用户输入待编码文件的路径,再根据路径读取待编码文件里的内容,再利用哈夫曼树将内容编码。

b.将编码的结果存入文件中,文件起名为编码结果.txt,这个工作已经在编码路径的同时并完成了。

3.3利用已建好的哈夫曼树将编码文件中的代码进行译码,结果存入文件中。

a.跟(2)是一样的,先是要求用户输入待译码文件的路径,再根据路径读取待译码文件里的内容,再利用哈夫曼树将内容进行译码,只是这里的待译码文件即是前面的编码结果.txt。

b.在将译码结果打印到窗口的同时写进文件里面,文件命名为译码结果.txt3.4输出代码文件,以紧凑格式显示。

这一步在将编码或者译码结果进行写文件的同时已经将结果打印到了窗口。

3.5以直观的方式输出哈夫曼树,同时将此字符形式的哈夫曼树写入文件中。

挨个将各个节点的内容的值打印到窗口以及写入文件,文件名为哈夫曼树.txt。

四、程序模块功能,程序设计组成框图、流程图4.1程序模块功能本编译器本人给简单的设计为四个模块,分别是:输入字符相关内容并建立哈夫曼树、根据哈夫曼树对文件内容进行编码、根据哈夫曼树对文件内容进行译码以及退出功能。

4.2程序设计框图开始从键盘输入字符相关内容并建立哈夫曼树编码译码退出4.3流程图noyesno Yesnoyes显示编码结果并写入文件显示译码结果并写入文件 输入待编码文件路径输入待译码文件路径 i==1i==2i !=0 开始输入字符集大小n输入这n 个字符以及权值输入序号i 进行编码与译码及退出的选择结束五、调试与测试。

调试方法,测试结果的分析与讨论,遇到的主要问题及采取的解决措施。

5.1调试方面本次程序用的语言是C,在文件读写方面多多少少有些忘记了,所以本人此次的代码编写部分就大概分为两个阶段来完成的,第一个阶段就是完成建立哈夫曼树、写好编码以及译码函数,和主函数;第二部分呢就是完成读写文件。

在第一阶段完成后,利用键盘输入的方式进行了编码与译码,测试还算顺利,在多次对比之下结果也鉴定为正确。

在第二阶段的读写文件代码编写过程中,读文件的相关操作还算顺利,但就是在写文件上出了不少的岔子,首先第一个问题出在字符串的定义上,开始是俩字符串死活接不上,后来字符串的定义方式改成了这样:。

可算是成功的接上了两个字符串,但是后来发现,起始一个文件在打开之后关闭之前,写的内容是不会被覆盖的,只是在再次打开并进行写操作是才会被覆盖掉,所以后来也就没有对两个字符串进行连接,只是依次写入了文件而已。

这只是在进行编码过程中的写文件的一个小坎坷,后来在写译码函数时的写文件时,那是死活都写不进去,尽管是效仿编码时的写法与否,都不行,后来是将文件的打开与关闭放在了函数的外面才可行的,但应该不是直接的原因,具体是怎么样现在也想不起来了,所以现在开始意识到在写代码的过程中写一份记录程序进程文档是很有必要的。

5.2测试结果方面在测试结果这方面,由于完完全全是一步一步的按照课程设计的要求来写的所以也不存在一些意想不到的错误,出了在写文件上花了些脑筋意外,测试还算顺利。

六、测试结果,用几组测试数据进行测试算法设计的正确性6.1第一组数据如下字符集大小n=3;字符本身以及权值分别为:a,b,c和2,1,3;待编码文件内容为:aaaaaabbbbbbcccccc。

哈夫曼树.txt的内容为:选择编码并输入带编码文件的路径:按回车键进行编码:查看待编码以及编码结果两个文件的内容进行验证:选择译码并输入带编码文件的路径:按回车键进行译码:查看译码结果文件夹进行验证:选择3看有什么情况:选择退出:6.2第二组测试数据如下:字符集大小n=6;自负本身以及权值分别是:a,b,c,d,e,f和9,0,1,3,2,5;待编码文件内容为:aaabbbcccdddeeefff。

查看哈夫曼树.txt文件:选择1编码并输入待编码文件的路径:回车进行编码:查看待编码和编码结果俩个文件进行验证:选择2译码并输入待译码文件的路径:回车进行译码:查看译码结果文件进行验证:七、本次课程设计的心得体会本次课程设计的心得主要是在文件的相关操作的学习上,之前是没有怎么学文件的相关操作,通过本次的课程设计,本人对C语言的文件的相关操作有了相当的了解,并成功的完成了课程设计所要求的文件的读写功能,可以说是有很大的收获的,不仅仅是在文件操作的这一单方面。

在完成一个课题之前,要仔细理解课题要求。

我在此次课程设计中犯的最严重的错误,应该算没有仔细审题。

课题的要求是用读取文件的方式输入需要编码字符,译码所需的编码代号也要用文本方式输入。

我在拿到这个课题的时候,因为没有仔细理解这些要求,就采用了键盘输入字符进行编码和译码的方式,以致走了不少弯路。

另外,这次课程设计充分暴露了我的惰性思想。

在拿到这个课题后,因为对哈夫曼编码这个知识点理解比较到位,所以没花多少时间就完成了课题要求实现的功能。

然而,在此之后,我由于自我感觉良好和惰性,没有积极地去寻找改进程序的方法,也没对程序运行的界面进行美化,使其拥有良好的用户使用体验。

最终在答辩的时候,交给老师的是一个界面简陋的程序。

通过这次课程设计,我更加深入了理解了哈夫曼编码的过程,以及利用哈夫曼编码对数据进行压缩的优越性,并且使我能够更熟练地运用树形的数据结构。

并且体会到了在学习中,要严格要求自己,不能因为一点点的成功就骄傲自满,停止不前。

八、附录:源程序清单#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXLEN 100typedef struct {int weight;int lchild;int rchild;int parent;char key;}htnode;typedef htnode hfmt[MAXLEN];int n;void inithfmt(hfmt t)//对结构体进行初始化{int i;printf("\n");printf("---------------------------------------------------------------------------\n");printf("******************************输入区***************************************\n");printf("\n请输入字符集大小n=");scanf("%d",&n);getchar();for(i=0;i<2*n-1;i++)//对结构体进行初始化{t[i].weight=0;t[i].lchild=-1;t[i].rchild=-1;t[i].parent=-1;}printf("\n");}void inputweight(hfmt t)//输入函数{int w;//w表示权值int i;char k;//k表示获取的字符for(i=0;i<n;i++){printf("请输入第%d个字符:",i+1);scanf("%c",&k);getchar();t[i].key=k;printf("请输入第%d个字符的权值:",i+1);scanf("%d",&w);getchar();t[i].weight=w;printf("\n");}}void selectmin(hfmt t,int i,int *p1,int *p2)//选中两个权值最小的函数{long min1=999999;long min2=999999;int j;for(j=0;j<=i;j++)//选择最小权值字符的下标返回if(t[j].parent==-1)if(min1>t[j].weight){min1=t[j].weight;*p1=j;}for(j=0;j<=i;j++)//选择次小权值字符的下标还回if(t[j].parent==-1)if(min2>t[j].weight && j!=(*p1))//注意 j!=(*p1)){min2=t[j].weight;*p2=j;}}void creathfmt(hfmt t)//创建哈夫曼树的函数{int i,p1,p2;inithfmt(t);inputweight(t);for(i=n;i<2*n-1;i++){selectmin(t,i-1,&p1,&p2);t[p1].parent=i;t[p2].parent=i;t[i].lchild=p1;t[i].rchild=p2;t[i].weight=t[p1].weight+t[p2].weight;}}void printhfmt(hfmt t)//打印哈夫曼树{FILE *f1;char str[10000];char *s;int i;if((f1=fopen("哈夫曼树.txt","w"))!=NULL){printf("------------------------------------------------------------------\n");s ="------------------------------------------------------------------\n ";fprintf(f1,"%s",s);printf("**********************哈夫曼树关系结构****************************\n");s = "**********************哈夫曼树关系结构****************************\n";fprintf(f1,"%s",s);printf("\t\t权重\t父母\t左孩子\t右孩子\t字符\t");s = "\t\t权重\t父母\t左孩子\t右孩子\t字符\t";fprintf(f1,"%s",s);for(i=0;i<2*n-1;i++){printf("\n");printf("\t\t%d\t%d\t%d\t%d\t%c",t[i].weight,t[i].parent,t[i].lchild,t [i].rchild,t[i].key);fprintf(f1,"\n\t\t%d\t%d\t%d\t%d\t%c",t[i].weight,t[i].parent,t[i].lc hild,t[i].rchild,t[i].key);}printf("\n------------------------------------------------------------------\n");s ="\n------------------------------------------------------------------\n";fprintf(f1,"%s",s);fclose(f1);printf("已将哈夫曼树存入文件,文件名为:哈夫曼树\n\n");}}char ch;FILE *f2;void hfmtpath(hfmt t,int i,int j)//编码的重要哈夫曼树路径递归算法{int a,b;a=i;b=j=t[i].parent;if(t[j].parent!=-1){i=j;hfmtpath(t,i,j);}if(t[b].lchild==a){printf("0");fputc('0',f2);}else{printf("1");fputc('1',f2);}}void phfmnode(hfmt t)//对字符进行初始编码{int i,j,a;printf("\n------------------------------------------------------------------\n");printf("**************************哈夫曼编码******************************");printf("\n\t\t字符\t权值\t编码结果");for(i=0;i<n;i++){j=0;printf("\n");printf("\t\t%c\t%d\t",t[i].key,t[i].weight);hfmtpath(t,i,j);}printf("\n------------------------------------------------------------------\n");}void encoding(hfmt t)//对用户输入的文件的内容进行编码{FILE *f3;char r[1000],h[1000];//用来存储输入的字符串int i,j;printf("\n\n请输入需要编码的文件路径:");gets(h);f3=fopen(h,"r");fgets(r,1000,f3);printf("\n待编码文件正文内容为:%s\n",r);printf("编码结果为:");for(j=0;r[j]!='\0';j++)for(i=0;i<n;i++)if(r[j]==t[i].key)hfmtpath(t,i,j);fclose(f3);printf("\n\n已将编码结果存入文件,文件名为:编码结果\n\n");}FILE *f5;void decoding(hfmt t)//对用户输入的密文进行译码{FILE *f4;char r[1000],h[1000];int i,j,len;j=2*n-2;//j初始从树的根节点开始printf("\n\n请输入需要译码的文件路径:");gets(h);f4=fopen(h,"r");fgets(r,1000,f4);len=strlen(r);printf("\n待译码文件中的代码为:%s\n",r);printf("译码的结果是:");//f5=fopen("译码结果.txt","w");for(i=0;i<len;i++){if(r[i]=='0'){j=t[j].lchild;if(t[j].lchild==-1){printf("%c",t[j].key);fputc(t[j].key,f5);j=2*n-2;}}else if(r[i]=='1'){j=t[j].rchild;if(t[j].rchild==-1){printf("%c",t[j].key);fputc(t[j].key,f5);j=2*n-2;}}}fclose(f4);//fclose(f5);printf("\n\n已将译码结果存入文件,文件名为:译码结果\n\n"); }int main(){int i,j;hfmt ht;char flag;printf(" |----------------------|\n"); printf(" | 信安1401--孙毅--CSU |\n"); printf(" |**********************|\n"); printf(" | 哈夫曼编码课程设计 |\n"); printf(" |**********************|\n"); printf(" | 完成时间:2016/10/26 |\n"); printf(" |----------------------|\n"); creathfmt(ht);printhfmt(ht);phfmnode(ht);printf("\n---------------------------------------------------------------------\n");printf("***************************编码&&译码&&退出&&保存***********************");printf("\n【1】编码\t【2】译码\t【0】退出");printf("\n您的选择是:");flag=getchar();getchar();while(flag!='0'){if(flag=='1'){f2=fopen("编码结果.txt","wt");encoding(ht);fclose(f2);}else if(flag=='2'){f5=fopen("译码结果.txt","wt");decoding(ht);fclose(f5);}elseprintf("您的输入有误,请重新输入。

相关文档
最新文档