《哈夫曼编码译码课程设计》报告
哈夫曼编码译码系统课程设计实验报告(含源代码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]的哈夫曼编码。
哈夫曼编码译码系统实验报告,数据结构课程设计报告书
专业资料安徽大学数据结构课程设计报告项目名称:哈弗曼编/译码系统的设计与实现姓名:鉏飞祥学号:E21414018专业:软件工程完成日期2016/7/4计算机科学与技术学院1 .需求分析1.1问题描述•问题描述:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(解码)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站设计一个哈夫曼编译码系统。
1.2基本要求(1) 输入的形式和输入值的范围;(2) 输出的形式;(3) 程序所能达到的功能。
1.基本要求(1)初始化(Initialzation)。
从数据文件DataFile.data中读入字符及每个字符的权值,建立哈夫曼树HuffTree;(2)编码(EnCoding)。
用已建好的哈夫曼树,对文件ToBeTran.data中的文本进行编码形成报文,将报文写在文件Code.txt中;(3)译码(Decoding)。
利用已建好的哈夫曼树,对文件CodeFile.data 中的代码进行解码形成原文,结果存入文件Textfile.txt中;(4)输出(Output)。
输出DataFile.data中出现的字符以及各字符出现的频度(或概率);输出ToBeTran.data及其报文Code.txt;输出CodeFile.data 及其原文Textfile.txt;2. 概要设计说明本程序中用到的所有抽象数据类型的定义。
主程序的流程以及各程序模块之间的层次(调用)关系。
(1)数据结构哈夫曼树的节点struct huff{int weight;int parent;int l;int r;};哈夫曼编码的存储struct huff *hufftree;(2)程序模块选择1到i-1中parent为0且权值最小的两个下标void Select(struct huff *HT, int n, int &s1, int &s2)构建哈夫曼树:void huffmancoding(struct huff *ht,int *w,int n)对原文进行编码:void code(char *c)根据报文找到原文:void decoding(char *zifu)3. 详细设计核心技术分析:1:构建哈夫曼树及生成哈夫曼编码:根据每个字符权值不同,根据最优二叉树的构建方法,递归生成哈夫曼树,并且用数组存放哈夫曼树。
哈夫曼编译码器课程设计报告(完整版)
.. .XXX学院本科数据结构课程设计总结报告设计题目:实验一、哈夫曼编/译码器学生:XXX系别:XXX专业:XXX班级:XXX学号:XXX指导教师:XXX XXX2012年6 月21日xxx学院课程设计任务书题目一、赫夫曼编译码器专业、班级xxx学号xxx xxx主要容、基本要求、主要参考资料等:1. 主要容利用哈夫曼编码进行信息通信可大大提高信道利用率,缩短信息传输时间,降低传输成本。
要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。
对于双工信道(既可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站写一个哈夫曼的编/译码系统。
2. 基本要求系统应具有以下功能:(1)C:编码(Coding)。
对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中,将以此建好的哈夫曼树存入文件HuffmanTree中(2)D:解码(Decoding)。
利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入textfile中。
(3)P:打印代码文件(Print)。
将文件codefile以紧凑格式显示在终端上,每行50个代码。
同时将此字符形式的编码文件写入文件codeprint中。
(4)T:打印哈夫曼树(Tree Printing)。
将已在存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint 中。
3. 参考资料:数据结构(C语言版)严蔚敏、吴伟民编著;数据结构标准教程胡超、闫宝玉编著完成期限:2012年6月21 日指导教师签名:课程负责人签名:2012年6月21 日一、设计题目(任选其一)实验一、哈夫曼编/译码器二、实验目的1巩固和加深对数据结构的理解,提高综合运用本课程所学知识的能力;2 深化对算法课程中基本概念、理论和方法的理解;3 巩固构造赫夫曼树的算法;4 设计试验用程序实验赫夫曼树的构造。
哈夫曼编码译码器---课程设计报告.docx
目录目⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ (2)1 程的目的和意⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯32 需求分析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯43 概要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯4 4⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.85 分析和果⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.11 6⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯127致⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯138附⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯13参考文献⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯..201课程设计目的与意义在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。
哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。
哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。
树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“ 1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。
通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。
电报通信是传递文字的二进制码形式的字符串。
但在信息传递时,总希望总长度尽可能最短,即采用最短码。
作为计算机专业的学生,我们应该很好的掌握这门技术。
在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。
在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。
这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们可以逐步积累调试 C 程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。
哈夫曼编译码器课程设计报告(完整版)
XXX学院本科数据结构课程设计总结报告设计题目:实验一、哈夫曼编/译码器学生姓名:XXX系别:XXX专业:XXX班级:XXX学号:XXX指导教师:XXX XXX2012年6 月21日xxx学院课程设计任务书题目一、赫夫曼编译码器专业、班级xxx学号xxx 姓名xxx主要内容、基本要求、主要参考资料等:1. 主要内容利用哈夫曼编码进行信息通信可大大提高信道利用率,缩短信息传输时间,降低传输成本。
要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。
对于双工信道(既可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站写一个哈夫曼的编/译码系统。
2. 基本要求系统应具有以下功能:(1)C:编码(Coding)。
对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中,将以此建好的哈夫曼树存入文件HuffmanTree中(2)D:解码(Decoding)。
利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入textfile中。
(3)P:打印代码文件(Print)。
将文件codefile以紧凑格式显示在终端上,每行50个代码。
同时将此字符形式的编码文件写入文件codeprint中。
(4)T:打印哈夫曼树(Tree Printing)。
将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint中。
3. 参考资料:数据结构(C语言版)严蔚敏、吴伟民编著;数据结构标准教程胡超、闫宝玉编著完成期限:2012年6月21 日指导教师签名:课程负责人签名:2012年 6月 21 日一、设计题目(任选其一)实验一、哈夫曼编/译码器二、实验目的1巩固和加深对数据结构的理解,提高综合运用本课程所学知识的能力;2 深化对算法课程中基本概念、理论和方法的理解;3 巩固构造赫夫曼树的算法;4 设计试验用程序实验赫夫曼树的构造。
哈弗曼编码译码报告
树的结点中查找 { if (ht[k].weight<min1) { min2=min1;rnode=lnode; min1=ht[k].weight; lnode=k; } else if (ht[k].weight<min2) { min2=ht[k].weight; rnode=k;} } ht[lnode].parent=i; ht[rnode].parent=i; ht[i].weight=ht[lnode].weight+ht[rnode].weight; ht[i].lchild=lnode; ht[i].rchild=rnode;//ht[] 作为双亲结点 } } (3)利用哈夫曼编码算法哈夫曼编码 void CreateHCode(HTNode ht[],HCode hcd[],int n) { int i,f,c; HCode hc; for(i=0; i<n; i++)//根据哈弗曼树求哈弗曼编码 { hc.start=n; c=i; f=ht[i].parent; while (f!=-1)//循环知道树的根结点 {
3、主要模块的算法描述 (1)主函数 int main() { int n; printf("请输入要输入的字符数量n:");//读入字符的个数 while(scanf("%d",&n),n!=-1){//初始化 printf("请输入n个字符和n个权值\n"); CodeInput(n,ht);//输入数据函数,将读入n个字符和权重 CreateHT(ht,n);//构造哈弗曼树 CreateHCode(ht,hcd,n);//哈弗曼编码算法 CodeOutput(n,hcd);}//打印哈弗曼编码,将打印出编码,和每一 个字符的编码 return 0; (2)构造哈夫曼树 void CreateHT(HTNode ht[],int n)//构造一棵哈夫曼树 { int i,k,lnode,rnode; int min1,min2; for (i=0;i<2*n-1;i++)//所有结点的相关域置初值-1 ht[i].parent=ht[i].lchild=ht[i].rchild=-1; for (i=n;i<2*n-1;i++)//构造哈弗曼树 { min1=min2=32767;//lnode和rnode为最小权值的两个结 点位置 lnode=rnode=-1; for (k=0;k<=i-1; k++)//在ht[]中查找权值的最小的两 个结点 if (ht[k].parent==-1)//只在尚未构造的二叉
哈夫曼编码译码课程设计报告
哈夫曼编码译码课程设计报告《数据结构》课程设计——赫夫曼编码/译码器设计指导教师:李文书、周维达班级:10电信实验班学号:Q10600132姓名:王彬彬一、实验目的1、提高分析问题、解决问题的能力,进一步巩固数据结构各种原理与方法。
2、熟悉掌握一门计算机语言,能够进行数据算法设计。
二、实验原理哈夫曼编\译码器的主要功能是先建立哈夫曼树,然后利用建好的哈夫曼树生成哈夫曼编码后进行译码。
在数据通信中,经常需要将传送的文字转换成由二进制字符0、1组成的二进制串,称之为编码。
构造一棵哈夫曼树,规定哈夫曼树中的左分之代表0,右分支代表1,则从根节点到每个叶子节点所经过的路径分支组成的0和1的序列便为该节点对应字符的编码,称之为哈夫曼编码。
最简单的二进制编码方式是等长编码。
若采用不等长编码,让出现频率高的字符具有较短的编码,让出现频率低的字符具有较长的编码,这样可能缩短传送电文的总长度。
哈夫曼树课用于构造使电文的编码总长最短的编码方案。
主要流程图如下:三、实验步骤1:写好流程图,设计实验方案。
2:初始化,从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件HuofumanTree中。
3:编码。
利用已建好的哈夫曼树,对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。
4:译码。
利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件Textfile中。
5:印代码文件(Print).将文件CodeFile以紧凑格式显示在终端上,每行50个代码。
同时将此字符形式的编码文件写入文件CodePrint中。
6:印哈夫曼树(Treeprinting).将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint 中。
具体函数如下:1:Initialization() 初始化2:Encoding() 编码3:Decoding() 译码4:Print_file() 打印代码文件5:search(k,j,p) 搜索二叉树6:Print_tree() 打印二叉树7:menu() 主菜单9:main() 主函数四、实验结果与分析(1)大致个人测试案例:主界面:。
哈夫曼编码译码器实验报告
哈夫曼编码译码器实验报告实验名称:哈夫曼编码译码器实验一、实验目的:1.了解哈夫曼编码的原理和应用。
2.实现一个哈夫曼编码的编码和译码器。
3.掌握哈夫曼编码的编码和译码过程。
二、实验原理:哈夫曼编码是一种常用的可变长度编码,用于将字符映射到二进制编码。
根据字符出现的频率,建立一个哈夫曼树,出现频率高的字符编码短,出现频率低的字符编码长。
编码过程中,根据已建立的哈夫曼树,将字符替换为对应的二进制编码。
译码过程中,根据已建立的哈夫曼树,将二进制编码替换为对应的字符。
三、实验步骤:1.构建一个哈夫曼树,根据字符出现的频率排序。
频率高的字符在左子树,频率低的字符在右子树。
2.根据建立的哈夫曼树,生成字符对应的编码表,包括字符和对应的二进制编码。
3.输入一个字符串,根据编码表将字符串编码为二进制序列。
4.输入一个二进制序列,根据编码表将二进制序列译码为字符串。
5.比较编码前后字符串的内容,确保译码正确性。
四、实验结果:1.构建哈夫曼树:-字符出现频率:A(2),B(5),C(1),D(3),E(1) -构建的哈夫曼树如下:12/\/\69/\/\3345/\/\/\/\ABCDE2.生成编码表:-A:00-B:01-C:100-D:101-E:1103.编码过程:4.译码过程:5.比较编码前后字符串的内容,结果正确。
五、实验总结:通过本次实验,我了解了哈夫曼编码的原理和应用,并且实现了一个简单的哈夫曼编码的编码和译码器。
在实验过程中,我充分运用了数据结构中的树的知识,构建了一个哈夫曼树,并生成了编码表。
通过编码和译码过程,我进一步巩固了对树的遍历和节点查找的理解。
实验结果表明,本次哈夫曼编码的编码和译码过程正确无误。
在实验的过程中,我发现哈夫曼编码对于频率较高的字符具有较短的编码,从而实现了对字符串的高效压缩。
同时,哈夫曼编码还可以应用于数据传输和存储中,提高数据的传输效率和存储空间的利用率。
通过本次实验,我不仅掌握了哈夫曼编码的编码和译码过程,还深入了解了其实现原理和应用场景,加深了对数据结构和算法的理解和应用能力。
huffman哈夫曼树编码译码课程设计报告
数据结构课程设计信息科学与工程学院:学院计算机科学与技术专业:1601 计卓级:班号:学:学生姓名指导教师:23/ 1年月日题目名称一、实验内容哈夫曼编码译码系统【问题描述】用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站写一个哈夫曼码的编/译码系统。
【基本要求】1)初始化。
从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树。
2)编码。
利用已建好的哈夫曼树对输入英文进行编码,编码结果存储在数组中。
3)译码。
利用已建好的哈夫曼树将数组中的代码进行译码,结果存入一个字符数组。
4)输出编码。
将编码结果显示在终端上,每行50个代码。
5)输出哈夫曼树。
将哈夫曼树以直观的方式(树或凹入表形式)显示出来。
【实现提示】用户界面可以设计为“菜单”方式,再加上一个“退出”功能。
请用户键入一个选择功能符。
此功能执行完毕后再显示此菜单,直至某次用户选择了“退出”为止。
参考教材P240-246【选做内容】将哈夫曼树保存到文件中,编码和译码的结果也分别存放在两个文本文件中。
23/ 2二、数据结构设计储存结构struct HNodeType {//字符结构体类型int weight;//权int parent;//双亲位置int lchild;//左孩子int rchild;//右孩子char inf;// 字符};struct HcodeType {存储编码int bit[MaxBit];// int start;// 起始位置};三、算法设计1、在构造哈夫曼树时,设计一个结构体数组HuffNode保存哈夫曼树中各结点的信息,根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n-1个结点,所以数组HuffNode的大小设置为2n-1。
哈夫曼编译码器课程设计报告(完整版)
XXX学院本科数据结构课程设计总结报告设计题目:实验一、哈夫曼编/译码器学生:XXX系别:XXX专业:XXX班级:XXX学号:XXX指导教师:XXX XXX2012年6 月21日xxx学院课程设计任务书题目一、赫夫曼编译码器专业、班级xxx学号xxx xxx主要容、基本要求、主要参考资料等:1. 主要容利用哈夫曼编码进行信息通信可大大提高信道利用率,缩短信息传输时间,降低传输成本。
要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。
对于双工信道(既可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站写一个哈夫曼的编/译码系统。
2. 基本要求系统应具有以下功能:(1)C:编码(Coding)。
对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中,将以此建好的哈夫曼树存入文件HuffmanTree中(2)D:解码(Decoding)。
利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入textfile中。
(3)P:打印代码文件(Print)。
将文件codefile以紧凑格式显示在终端上,每行50个代码。
同时将此字符形式的编码文件写入文件codeprint中。
(4)T:打印哈夫曼树(Tree Printing)。
将已在存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint中。
3. 参考资料:数据结构(C语言版)严蔚敏、吴伟民编著;数据结构标准教程胡超、闫宝玉编著完成期限:2012年6月21 日指导教师签名:课程负责人签名:2012年 6月 21 日一、设计题目(任选其一)实验一、哈夫曼编/译码器二、实验目的1巩固和加深对数据结构的理解,提高综合运用本课程所学知识的能力;2 深化对算法课程中基本概念、理论和方法的理解;3 巩固构造赫夫曼树的算法;4 设计试验用程序实验赫夫曼树的构造。
哈夫曼编译码器课程设计报告
《数据结构》课程设计报告题目: 哈夫曼编/译码器 专业: 计算机科学与技术(对口)班级: 13(3) 姓名: 陈霞指导教师:彭飞2015-2016学年 第1学期成绩:计算机学院2015年11月12日目录1 设计内容及要求 (3)1.1 内容 (3)1.2 要求 (4)2 概要设计 (5)2.1 抽象数据类型定义 (5)2.2 模块划分 (6)3 设计过程及代码 (7)3.1 设计过程 (7)3.2 代码 (11)4 设计结果与分析 (17)5 参考文献 (20)1设计内容及要求1.1 内容利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站写一个哈夫曼编/译码系统。
1.2 要求一个完整的系统应具有以下功能:(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,以此设计哈夫曼编码。
哈夫曼编码译码器---课程设计报告.docx
目录目⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ (2)1 程的目的和意⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯32 需求分析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯43 概要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯4 4⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.85 分析和果⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.11 6⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯127致⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯138附⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯13参考文献⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯..201课程设计目的与意义在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。
哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。
哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。
树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“ 1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。
通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。
电报通信是传递文字的二进制码形式的字符串。
但在信息传递时,总希望总长度尽可能最短,即采用最短码。
作为计算机专业的学生,我们应该很好的掌握这门技术。
在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。
在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。
这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们可以逐步积累调试 C 程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。
哈夫曼编码译码器实验报告
问题解析与解题方法问题分析:设计一个哈夫曼编码、译码系统。
对一个ASCII编码的文本文件中的字符进行哈夫曼编码,生成编码文件;反过来,可将编码文件译码还原为一个文本文件。
(1)从文件中读入任意一篇英文短文(文件为ASCII编码,扩展名为txt);(2)统计并输出不同字符在文章中出现的频率(空格、换行、标点等也按字符处理);(3)根据字符频率构造哈夫曼树,并给出每个字符的哈夫曼编码;(4)将文本文件利用哈夫曼树进行编码,存储成压缩文件(编码文件后缀名.huf)(5)用哈夫曼编码来存储文件,并和输入文本文件大小进行比较,计算文件压缩率;(6)进行译码,将huf文件译码为ASCII编码的txt文件,与原txt文件进行比较。
根据上述过程可以知道该编码译码器的关键在于字符统计和哈夫曼树的创建以及解码。
哈夫曼树的理论创建过程如下:一、构成初始集合对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F={T1,T2,T3,...,Ti,...,Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。
二、选取左右子树在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。
三、删除左右子树从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。
四、重复二和三两步,重复二和三两步,直到集合F中只有一棵二叉树为止。
因此,有如下分析:1.我们需要一个功能函数对ASCII码的初始化并需要一个数组来保存它们;2.定义代表森林的数组,在创建哈夫曼树的过程当中保存被选中的字符,即给定报文中出现的字符,模拟哈夫曼树选取和删除左右子树的过程;3.自底而上地创建哈夫曼树,保存根的地址和每个叶节点的地址,即字符的地址,然后自底而上检索,首尾对换调整为哈夫曼树实现哈弗曼编码;4.从哈弗曼编码文件当中读入字符,根据当前字符为0或者1的状况访问左子树或者右孩子,实现解码;5.使用文件读写操作哈夫曼编码和解码结果的写入;解题方法:结构体、数组、类的定义:1.定义结构体类型的signode 作为哈夫曼树的节点,定义结构体类型的hufnode 作为哈夫曼编码对照表的节点,定义HFM类实现对哈夫曼树的创建,利用其成员函数完成哈夫曼编码译码的工作。
课程设计报告--哈夫曼编码译码系统
2.定义代表森林的数组,在创建哈夫曼树的过程当中保存被选中的字符,即给定报文中出现的字符,模拟哈夫曼树选取和删除左右子树的过程;
3.自底而上地创建哈夫曼树,保存根的地址和每个叶节点的地址,即字符的地址,然后自底而上检索,首尾对换调整为哈夫曼树实现哈弗曼编码;
随着计算机的普遍应用与日益发展,其应用早已不局限于简单的数值运算,而涉及到问题的分析、数据结构框架的设计以及设计最短路线等复杂的非数值处理和操作。算法与数据结构的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础。
算法与数据结构旨在分析研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法达到最优。
4.定义hufnode类型的全局数组hufNode[256],在编码时最为哈夫曼编码对照表的节点,char型c保存字符,int code[100]保存其哈夫曼编码;
5.定义HFM类,主要保存哈夫曼树的根节点指针,但其丰富的功能函数将实现哈夫曼编码译码的工作及其他功能;
函数介绍:
1.void init(signode * sig){……}初始化数组SN[];
数据结构是在整个计算机科学与技术领域上广泛被使用的术语。它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。数据结构是数据存在的形式。
《数据结构》主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
编码译码实验报告
一、实验目的1. 理解编码译码的基本原理和方法。
2. 掌握哈夫曼编码和译码的实现过程。
3. 通过实验,提高编程能力和数据结构应用能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019三、实验内容1. 哈夫曼编码与译码(1)哈夫曼编码的原理哈夫曼编码是一种变长编码,通过为不同频率的字符分配不同的编码长度,达到压缩数据的目的。
哈夫曼编码的核心是构建一棵哈夫曼树,树中每个叶子节点对应一个字符,非叶子节点对应两个子节点的编码。
(2)哈夫曼编码的实现首先,根据输入的字符及其频率,构建哈夫曼树。
然后,从根节点开始,对每个叶子节点进行编码,编码规则为从根节点到叶子节点的路径,左子节点编码为“0”,右子节点编码为“1”。
(3)哈夫曼译码的实现根据哈夫曼编码的编码规则,将编码后的数据还原成原始字符。
从编码数据的第一个比特开始,根据编码规则,逐步还原出原始字符。
2. 字符串编码与译码(1)字符串编码的原理字符串编码是将字符串中的字符转换成二进制表示,以达到压缩数据的目的。
常见的字符串编码方法有ASCII编码、UTF-8编码等。
(2)字符串编码的实现以ASCII编码为例,将字符串中的每个字符转换为对应的ASCII码,然后将其转换为二进制表示。
(3)字符串译码的实现将编码后的二进制数据转换回对应的ASCII码,再将ASCII码转换成字符。
四、实验步骤1. 创建一个新的C++项目,命名为“编码译码实验”。
2. 在项目中创建两个源文件:main.cpp和编码译码.cpp。
3. 在main.cpp中编写代码,实现以下功能:(1)从文件中读取字符串,进行哈夫曼编码。
(2)将编码后的数据写入文件。
(3)从文件中读取编码后的数据,进行哈夫曼译码。
(4)将译码后的字符串输出到屏幕。
4. 在编码译码.cpp中编写代码,实现以下功能:(1)构建哈夫曼树。
(2)实现哈夫曼编码和译码算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机与信息工程系《实践环节名称》报告专业:计算机科学与技术班级:********学号:*********姓名:***报告完成日期:2011/6/10指导教师:***评语:成绩:批阅教师签名:批阅时间:目录1.问题描述 (1)2.基本要求 (1)3.数据结构 (1)4.总体设计 (1)5.详细设计 (2)5.1主函数 void main() (2)5.2建立文件 void jianliwenjian() (3)5.3输入原文 void luruyuanwen() (4)5.4创建哈夫曼树 void chuangjian() (5)5.5编码 void bianma() (6)5.6对哈夫曼码译码 void yiwen() (7)5.7保存译文 void baocunyiwen() (8)5.8输出原文 void duquyuanwen() (9)5.9输出原文编码void duqubianma() (10)5.10输出译文 void duquyiwen() (11)6.测试与调试 (11)7.源程序清单 (8)8.实验心得 (28)1.问题描述打开一篇英文文章,统计该文章中每个字符出现的次数,然后以它们作为权值,设计一个哈夫曼编/译码系统。
2.基本要求以每个字符出现的次数为权值,建立哈夫曼树,求出哈夫曼编码,对文件yuanwen 中的正文进行编码,将结果存到文件yiwen中,再对文件yiwen中的代码进行译码,结果存到textfile中。
3.数据结构char CH[N]; //记录原文字符数组char YW[N]; //记录译文字符数组typedef char * Hcode[m+1]; //存放哈夫曼字符编码串的头指针的数组typedef struct{char a;int num;}dangenode; //记录单个字符的类别和出现的次数typedef struct{dangenode b[m];int tag;}jilunode; //统计原文出现的字符种类和数量typedef struct node //静态三叉的哈夫曼树的定义{int weight; //结点的权值int parent; //双亲的下标int Lchild; //左孩子结点的下标int Rchild; //右孩子结点的下标}htnode,hn[M+1]; // hn是结构数组类型,0号单元不用4.总体设计功能函数模块划分void main() //主函数void jianliwenjian() //建立存储原文的文件yuanwenvoid luruyuanwen() //通过程序录入原文到文件yuanwen中void min_2(hn ht,int n,int *tag1,int *tag2) //选择权值较小的两个结点void chuangjian(jilunode * jilu,hn ht) //建立哈夫曼树void bianma(jilunode * jilu,hn ht,Hcode hc,int n) //对原文进行编码void bianmabaocun(Hcode hc,jilunode * jilu) //保存编码在文件yiwen中void yiwen(Hcode hc,jilunode * jilu) //读取yiwen中的编码,并将其翻译为原文void baocunyiwen() //将翻译的译文保存到文件textfile中void duqubianma() //在编码文件yiwen中读取编码5.详细设计5.1主函数void main()5.2建立文件void jianliwenjian()首先,要建立一个文件来存储原文,在这里文件的名称按要求默认为yuanwen,文件建立时有可能成功,有可能失败,建立失败时输出“Cannot open file”,成功后会提示:“文件已建立,名称为yuanwen”。
5.3输入原文void luruyuanwen()输入原文时首先要打开原文件,成功打开文件后逐个读取输入的字符存放到文件中,直到遇到结束标志‘^’,然后关闭文件。
5.4创建哈夫曼树void chuangjian()打开存储原文的文件yuanwen,将字符逐个读出,然后统计字符的种类,类别和数量,最后建立静态的三叉链表来建立哈夫曼树,树中的叶子结点对应出现的个字符。
5.5编码void bianma()该函数实现对哈夫曼树的编码,先申请一个能存储字符编码的临时空间cd,编码从哈夫曼树的叶子结点开始,寻找其父母结点,然后根据父母结点判断孩子结点的左右位置,左边置1,右边置0,并将1,0这样的字符从后往前逆序存放在cd中,每求得一个叶子结点的编码,就将其复制到存储哈夫曼编码的头指正数组中,找完叶子结点的编码后就释放临时空间cd。
5.6对哈夫曼码译码void yiwen()打开文件yiwen,打开成功后,逐个读取存放在里边的编码字符,并与先前的编码相匹配,直到找到编码对应的原字符,当找完编码后就关闭文件。
5.7保存译文void baocunyiwen()打开文件textfile,打开成功后,将译文保存到文件中,然后关闭文件。
5.8输出原文void duquyuanwen()打开文件yuanwen,将里边的原文输出,以便查看。
5.9输出原文编码void duqubianma()打开文件yiwen,打开成功后,将文件中存放的编码输出,然后关闭文件。
5.10输出译文void duquyiwen()打开文件textfile,打开成功后,输出里边的译文,然后关闭文件。
6.测试与调试程序调试采用Microsoft Visual Studio2008,程序在调试过程中遇到了各种问题,首先在建立哈夫曼树时我是用静态三叉链表实现的,但里边的参数parent,Lchild,Rchild定义为指针类型,在原理上是可行,但调试时总得不到正确结果,后来改为书中用基本类型整型后就很好的得到了满意结果,其它一些小错误在不断地调试,不断地改善后,基本达到可满意的效果。
各模块的调试结果截屏如下:6.1主函数菜单6.2建立文件6.4直接将原文存放到文件yuawen中6.5对原文编码6.7输出原文6.9输出译文7.源程序清单#include<stdio.h>#include<stdlib.h>#include<string.h>#define N 5000#define m 128 //叶子结点个数,即字符总类数#define M 2*m-1 //哈夫曼树的节点数char CH[N]; //记录原文字符数组char YW[N]; //记录译文字符数组typedef char * Hcode[m+1]; //存放哈夫曼字符编码串的头指针的数组typedef struct{char a;int num;}dangenode; //记录单个字符的类别和出现的次数typedef struct{dangenode b[129];int tag;}jilunode; //统计原文出现的字符种类数typedef struct node{int weight; //结点权值int parent; //双亲下标int Lchild; //左孩子结点的下标int Rchild; //右孩子的下标}htnode,hn[M];//静态三叉的哈夫曼树的定义void jianliwenjian(){printf("现在建立文件,以存储原文(文件名称默认为“yuanwen”)\n");printf(" 文件建立中......\n");FILE *fp;if((fp=fopen("yuanwen","wb"))==NULL) //建立文件{printf("Cannot open file\n");exit(0);}printf("文件已建立,名称为:yuanwen");fclose(fp); //关闭文件}void luruyuanwen() //原文输入完后,将其保存到文件yuanwen中{char ch;FILE *fp;exit(0);}printf("请输入原文(结束标志为:“^”)\n");do{ch=getchar();fputc(ch,fp); //将字符保存到文件中}while(ch!='^'); //判断结束getchar(); //接收回车命令符fclose(fp); //关闭文件}void min_2(hn ht,int n,int *tag1,int *tag2)//在建哈夫曼树的过程中,选择权值小的两{ 个结点int i,min,s;min=N;for(i=1;i<=n;i++)if(ht[i].weight<min&&ht[i].parent==0){min=ht[i].weight;*tag1=i; //记录权值最小的结点下标}min=N;for(i=1;i<=n;i++)if(ht[i].weight<min&&ht[i].parent==0&&i!=*tag1){min=ht[i].weight;*tag2=i;}if(ht[*tag1].weight==ht[*tag2].weight&&ht[*tag2].Lchild!=0){s=(*tag1); //如果结点权值相同,先出现的放在哈夫曼树的左边(*tag1)=(*tag2);(*tag2)=s;}}void chuangjian(jilunode * jilu,hn ht) //建立哈夫曼树、以及对原{ 文字符的类别和数量统计int i,j,s,tag1,tag2;s=0;i=-1;char ch;FILE *fp;if((fp=fopen("yuanwen","rb"))==NULL) //以只读的方式打开文件exit(0);}while(!feof(fp)) //判断文件指示标志是否移动到了文件尾处{ch=fgetc(fp);if(ch!='^') //判断字符是否是结束标志{++i;CH[i]=ch;for(j=1;j<=jilu->tag;j++){if(CH[i]==jilu->b[j].a){jilu->b[j].num++;break;}}if(j-1==jilu->tag&&CH[i]!=jilu->b[j-1].a){jilu->tag++;jilu->b[jilu->tag].a=CH[i];jilu->b[jilu->tag].num=1;}}}jilu->tag--;fclose(fp); //关闭文件printf("原文中的各字符统计状况如下:\n");printf("*^*^*^*^*^*^*^*^**^*^*^**^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n"); for(i=1;i<=jilu->tag;i++){s++;printf("‘%c’的个数为:%d ",jilu->b[i].a,jilu->b[i].num);if(s%4==0) //每行放四个数据printf("\n");}printf("\n");for(i=1;i<=2*(jilu->tag)-1;i++){if(i<=jilu->tag){ht[i].weight=jilu->b[i].num; //初始化叶子结点权值ht[i].Lchild=0; //初始化叶子结点左孩子ht[i].parent=0; //初始化叶子结点父母ht[i].Rchild=0; //初始化叶子结点右孩子}else{ht[i].Lchild=0; //初始化非叶子结点左孩子ht[i].parent=0; //初始化非叶子结点父母ht[i].Rchild=0; //初始化非叶子结点右孩子ht[i].weight=0; //初始化非叶子结点权值}}for(i=jilu->tag+1;i<=2*(jilu->tag)-1;i++){min_2(ht,i-1,&tag1,&tag2); 需找权值小的两个父母为0的结点ht[tag1].parent=i;ht[tag2].parent=i;ht[i].Lchild=tag1;ht[i].Rchild=tag2;ht[i].weight=ht[tag1].weight+ht[tag2].weight;}}void bianma(jilunode * jilu,hn ht,Hcode hc,int n) //哈夫曼树建完后,对叶{ 子结点逐个编码char * cd;int start,i,p,c;cd=(char *)malloc((n+1)*sizeof(char)); //申请存储字符的临时空间cd[n-1]='\0'; //加结束标志for(i=1;i<=n;i++){start=n-1;c=i;p=ht[i].parent;while(p!=0){--start;if(ht[p].Lchild==c)cd[start]='1'; //结点在左边置1if(ht[p].Rchild==c)cd[start]='0'; //结点在右边置0c=p;p=ht[p].parent;}printf("%c的编码为:%s\n",jilu->b[i].a,&cd[start]);hc[i]=(char *)malloc((n-start)*sizeof(char)); //为字符数组分配空间strcpy(hc[i],&cd[start]);//将临时空间中的编码复制到字符数组中}free(cd); //释放临时空间}void bianmabaocun(Hcode hc,jilunode * jilu) //将原文以编码的形式保存到{ 文件yiwen中int i,j;FILE *fp;if((fp=fopen("yiwen","wb"))==NULL) //以写的方式打开文件{printf("Cannot open file\n");exit(0); //文件打开失败退出}for(i=0;i<=N&&CH[i]!='^';i++){for(j=1;j<=jilu->tag;j++)if(CH[i]==jilu->b[j].a){fputs(hc[j],fp); //将文件中的字符输出到字符数组中 printf("%s",hc[j]);}}fclose(fp); //关闭文件}void yiwen(Hcode hc,jilunode * jilu) //读取yiwen中的编码,并将其翻译{ 为原文存放到字符数组YW[N]中int tag1,tag2,i,j,s=0;FILE *fp; //文件指针char *c;if((fp=fopen("yiwen","rb"))==NULL) //以只读的方式打开文件{printf("cannot open file\n");exit(0);}while(!feof(fp)){tag1=1; //结束for循环的辅助标志tag2=1; //结束for循环的辅助标志c=(char *)malloc(200*sizeof(char));for(i=0;i<200&&tag1;i++){c[i]=fgetc(fp); //将文件中的字符输出到数组中c[i+1]='\0'; //加结束标志for(j=1;(j<=jilu->tag)&&tag2;j++){if(strcmp(hc[j],c)==0) //将编码与原文字符匹配{YW[s]=jilu->b[j].a; //匹配成功后将字符保存到数组YW中tag1=0;s++;free(c); //释放临时字符存储空间tag2=0;}}}}YW[s]='\0';}void baocunyiwen() //将翻译的译文保存到文件textfile中{int i;FILE *fp;if((fp=fopen("textfile","wb"))==NULL){printf("Cannot open file\n");exit(0);}for(i=0;YW[i]!='\0';i++){fputc(YW[i],fp); //将数组中的字符保存到文件中putchar(YW[i]);}fclose(fp); //关闭文件}void duquyiwen() //从文件textfile中读取译文{char ch;FILE *fp;if((fp=fopen("textfile","rb"))==NULL) //以只读的方式打开文件{printf("cannot open file\n");exit(0);}while(!feof(fp)){ch=fgetc(fp); //将文件中的字符赋给字符变量chprintf("%c",ch); //输出字符}fclose(fp); //关闭文件}void duquyuanwen() //从文件yuanwen中读取原文{char ch;FILE *fp;if((fp=fopen("yuanwen","rb"))==NULL) //以只读的方式打开文件{printf("cannot open file\n");exit(0);}while(!feof(fp)){ch=fgetc(fp); //将文件中的字符赋给字符变量chprintf("%c",ch); //输出字符}fclose(fp); //关闭文件}void duqubianma() //从文件yiwen中读取原文{char ch;FILE *fp;if((fp=fopen("yiwen","rb"))==NULL){printf("cannot open file\n");exit(0);}while(!feof(fp)){ch=fgetc(fp); //将文件中的字符赋给字符变量chprintf("%c",ch); //输出字符}fclose(fp); //关闭文件}void main(){int a,c,tep=1;hn humtree; //定义用三叉链表方式实现的哈夫曼树Hcode hc; //定义存放哈夫曼字符编码串的头指针的数组jilunode ji; //定义存放字符种类数量的栈jilunode *jilu;jilu=&ji; //取指针jilu->tag=0; //字符种类数标志初始化while(tep){printf(" (*^__^*) 哈夫曼编码系统欢迎您(*^__^*) \n");printf("*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n"); printf(" 1——创建存贮原文件的文件\n");printf(" 2——输入原文\n");printf(" 3——对原文编码\n");printf(" 4——对编码译码\n");printf(" 5——输出原文\n");printf(" 6——输出译码\n");printf(" 7——输出译文\n");printf(" 8——退出\n");printf("注意:如果您未创建原文件原文操作,请不要进行后续项操作!\n");printf("*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*\n");printf("请输入服务选项(-8):");scanf("%d",&a);getchar();switch(a){case 1:jianliwenjian(); //建立存储字符的文件printf("是否继续?(.YES 2,NO ):");scanf("%d",&c);getchar();if(c==1)tep=1;elsetep=0;system("cls");break;case 2:system("cls");luruyuanwen(); //将原文录入到文件中printf("\n注意:原文件将保存在名称为“yuanwen”的文件中!\n");printf("是否继续?(.YES 2,NO ):");scanf("%d",&c);getchar();if(c==1)tep=1;elsetep=0;system("cls");break;case 3:chuangjian(jilu,humtree); //创建哈夫曼树printf("\n各字符编码结果为:\n");bianma(jilu,humtree,hc,jilu->tag); //对哈夫曼树的叶子结点编码printf("原文的编码为:\n");printf("*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^ *^*^*^*\n");bianmabaocun(hc,jilu); //保存编码printf("\n*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^ *^*^*^*^*^*^*\n");printf("\n注意:原文的编码将保存在以名称为“yiwen”的文件中!\n");printf("是否继续?(.YES 2,NO ):");scanf("%d",&c);getchar();if(c==1)tep=1;elsetep=0;system("cls");break;case 4:system("cls");printf("编码对应的译文为:\n");yiwen(hc,jilu); //对编码译码baocunyiwen(); //保存译文printf("\n注意:译文将保存在以名称为“textfile”的文件中!\n");printf("是否继续?(.YES 2,NO ):");scanf("%d",&c);getchar();if(c==1)tep=1;elsetep=0;system("cls");break;case 5:system("cls");printf("原文为:\n");duquyuanwen(); //从文件中读取原文printf("\n是否继续?(.YES 2,NO ):");scanf("%d",&c);getchar();if(c==1)tep=1;elsetep=0;system("cls");break;case 6:system("cls");printf("原文的编码为:\n");duqubianma(); //从文件中读取编码printf("\n是否继续?(.YES 2,NO ):");scanf("%d",&c);getchar();if(c==1)tep=1;elsetep=0;system("cls");break;case 7:system("cls");printf("编码的译文为:\n");duquyiwen(); //从文件中读取译文printf("\n是否继续?(.YES 2,NO ):");scanf("%d",&c);getchar();if(c==1)tep=1;elsetep=0;system("cls");break;case 8:printf("谢谢使用!");tep=0;break;default:system("cls");printf("选择错误!\n");}}}8.实验心得这次的程序实习让我感受很多,之前太没它当回事,直到星期二早上去机房我才开始看我的实习题目,这时我才发现很多同学已经把程序弄好了,有一些在调试。