哈夫曼编码译码器---课程设计报告
huffman哈夫曼树编码译码课程设计报告
![huffman哈夫曼树编码译码课程设计报告](https://img.taocdn.com/s3/m/bd2cffa859eef8c75ebfb301.png)
数据结构课程设计信息科学与工程学院:学院计算机科学与技术专业: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。
哈夫曼编码译码器课程设计
![哈夫曼编码译码器课程设计](https://img.taocdn.com/s3/m/8c4a0acb7d1cfad6195f312b3169a4517723e5b1.png)
哈夫曼编码译码器课程设计1.哈夫曼编码是一种有效的数据压缩算法,通过将最常用的字符编码为较短的比特串,最大限度地减少了存储空间。
本文档介绍一个哈夫曼编码译码器的设计和实现,该译码器可以实现从原始文本到哈夫曼编码的转换,并且可以从哈夫曼编码还原出原始文本。
2. 设计和实现本译码器的开发采用Python语言,主要分为两部分:哈夫曼编码和译码两部分。
2.1 哈夫曼编码哈夫曼编码的过程主要分为两步:1.统计每个字符出现的频率,并生成一个频率表。
2.根据频率表生成哈夫曼树,并生成相应的编码表。
以下是用于生成哈夫曼编码的Python代码:import heapqfrom collections import defaultdictclass Node:def__init__(self, freq, char=None, left=None, right=None): self.freq = freqself.char = charself.left = leftself.right = rightdef__lt__(self, other):return self.freq < other.freqdef__eq__(self, other):return self.freq == other.freqdef build_tree(data):freq = defaultdict(int)for char in data:freq[char] +=1q = [Node(freq[char], char) for char in freq]heapq.heapify(q)while len(q) >1:left = heapq.heappop(q)right = heapq.heappop(q)parent = Node(left.freq + right.freq, left.char + right.char, l eft, right)heapq.heappush(q, parent)return q[0]def generate_codes(node, current_code='', codes={}):if node is None:returnif node.char is not None:codes[node.char] = current_codegenerate_codes(node.left, current_code +'0', codes)generate_codes(node.right, current_code +'1', codes)return codes通过调用build_tree()函数来生成哈夫曼树,并调用generate_codes()函数来生成编码表。
哈夫曼编码与译码器-数据结构课程设计报告
![哈夫曼编码与译码器-数据结构课程设计报告](https://img.taocdn.com/s3/m/cf090a8db7360b4c2f3f648a.png)
哈夫曼编码与译码器-数据结构课程设计报告以下是为大家整理的哈夫曼编码与译码器-数据结构课程设计报告的相关范文,本文关键词为哈夫曼,编码,译码器,数据结构,课程,设计,报告,沈阳,航空,您可以从右上方搜索框检索更多相关文章,如果您觉得有用,请继续关注我们并推荐给您的好友,您可以在教育文库中查看更多范文。
沈阳航空航天大学课程设计报告课程设计名称:数据结构课程设计课程设计题目:实现哈夫曼编码和译码器院(系):计算机学院专业:计算机科学与技术班级:24010102学号:20XX040101082姓名:尹伟和指导教师:徐蕾沈阳航空航天大学课程设计报告此页为任务书I沈阳航空航天大学课程设计报告目录1.题目分析................................................................................................................. ..11.1.题目重述............................................................................................................11.1.1.系统功能需求分析.....................................................................................12.程序设计...................................................................................................................22.1.系统功能模块说明............................................................................................22.1.1.系统功能模块结构.....................................................................................22.1.2.系统模块功能说明.....................................................................................32.2.数据结构说明....................................................................................................32.2.1.结构体定义说明.........................................................................................32.2.2.哈夫曼树.....................................................................................................42.2.3.字符-哈夫曼编码对照表............................................................................42.3.函数说明............................................................................................................43.算法描述................................................................................................................. ..63.1.3.2.3.3.3.4.哈夫曼树的构建................................................................................................6字符-哈夫曼编码对照表...................................................................................6编码................................................................................................................. ...6译码....................................................................................................................74.程序测试................................................................................................................. ..94.1.字符集输入........................................................................................................94.2.编码测试..........................................................................................................104.3.译码测试 (11)参考文献................................................................................................................. .......13附录(程序清单).. (14)II沈阳航空航天大学课程设计报告1.题目分析1.1.题目重述本次课程设计的目标是实现一个哈夫曼编码和译码器。
哈夫曼编码译码器---课程设计报告.docx
![哈夫曼编码译码器---课程设计报告.docx](https://img.taocdn.com/s3/m/aeba3a5c856a561253d36f56.png)
目录目⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ (2)1 程的目的和意⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯32 需求分析⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯43 概要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯4 4⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.85 分析和果⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯.11 6⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯127致⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯138附⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯13参考文献⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯..201课程设计目的与意义在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。
哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。
哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。
树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“ 1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。
通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。
电报通信是传递文字的二进制码形式的字符串。
但在信息传递时,总希望总长度尽可能最短,即采用最短码。
作为计算机专业的学生,我们应该很好的掌握这门技术。
在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。
在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。
这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们可以逐步积累调试 C 程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。
哈夫曼编译码器课程设计报告(完整版)
![哈夫曼编译码器课程设计报告(完整版)](https://img.taocdn.com/s3/m/633f06fab0717fd5370cdc19.png)
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 设计试验用程序实验赫夫曼树的构造。
数据结构完整的课程设计报告-哈夫曼编译码器
![数据结构完整的课程设计报告-哈夫曼编译码器](https://img.taocdn.com/s3/m/ed10de232cc58bd63086bd65.png)
课程设计任务书课程名称数据结构课程设计课题赫夫曼编译码器专业班级网络工程***学生姓名***学号**指导老师审批任务书下达日期:2011 年6 月26 日任务完成日期:2011 年7 月15 日一、设计内容1)问题描述对输入的一串电文字符实现赫夫曼编码,再对赫夫曼编码生成的代码串进行译码,输出电文字符串。
2)基本要求a.初始化,键盘输入字符集大小n,n个字符和n个权植,建立哈夫曼树。
b.编码,利用建好的huffman树生成huffman编码;c.输出编码;d.译码功能;二.设计要求:课程设计报告1)需求分析a.程序的功能。
1.初始化,键盘输入字符集大小n,n个字符和n个权植,建立哈夫曼树。
2.编码,利用建好的huffman树生成huffman编码;3.输出编码;4.译码功能;b.输入输出的要求。
2)概要设计a.程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能。
i.void main()ii.void tohuffmancode(int n)//编码部分iii.void decode(char ch[],huftree tree[],int n)//译码iv.void huffman(huftree tree[],int *w,int n) //生成huffman树v.void select(huftree tree[],int k) //找寻parent为0,权最小的两个节点vi.void huffmancode(huftree tree[],char code[],int n)//输出huffman编码其流程图如下:主函数main 调用其他函数:tohuffmancode(int n)decode(char ch[],huftree tree[],int n)huffman(huftree tree[],int *w,int n)select(huftree tree[],int k)huffmancode(huftree tree[],char code[],int n) 其主流程图如下:(3)主要模块程序流程图下面介绍三个主要的程序模块流程图:①函数流程图:流程图注释:该图比较简单,主要是调用各个函数模块,首先代开已经存在的文件,然后统计总的字符数以及出现的各个字符和频率。
哈夫曼编译码器课程设计报告材料
![哈夫曼编译码器课程设计报告材料](https://img.taocdn.com/s3/m/be9c64734028915f814dc25d.png)
《数据结构》课程设计报告题目: 哈夫曼编/译码器专业: 计算机科学与技术(对口) 班级:13(3) : 霞 指导教师: 飞 成绩:计算机学院 2015年11月12日2015-2016学年 第1学期目录1设计容及要求 (3)1.1 容 (3)1.2 要求 (3)2概要设计 (4)2.1抽象数据类型定义 (4)2.2模块划分 (4)3设计过程及代码 (5)3.1设计过程 (5)3.2代码 (7)4设计结果与分析 (10)5参考文献 (12)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,以此设计哈夫曼编码。
本科毕业设计-数据结构课程设计报告赫夫曼编码译码器
![本科毕业设计-数据结构课程设计报告赫夫曼编码译码器](https://img.taocdn.com/s3/m/465e4f9fe2bd960591c67761.png)
数据结构课程设计实验报告书姓名:_____________________________ 班级:12数字媒体技术二班__________ 学号:_____________________________2014年06月赫夫曼编码/译码器实验目的1.进一步掌握最优二叉树的含义。
2.掌握最优二叉树的结构特征,以及各种存储结构的特点及使用范围3.熟练掌握哈夫曼树的建立和哈夫曼编码方法。
4.掌握用指针类型描述、访问和处理运算。
实验内容编写一个哈夫曼码的编/译码系统,一个完整的系统应具有以下功能:(1) 初始化。
从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree.txt 中。
(2) 编码。
利用已建好的哈夫曼树,对文件ToBeTra.txt 中的正文进行编码,然后将结果存入文件CodeFil.txt 中。
(3) 译码。
利用已建好的哈夫曼树将文件CodeFile.txt 中的代码进行译码, 结果存入文件Textfile.txt 中。
(4) 打印哈夫曼树( Treeprinting ). 将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint.txt 中。
三、实验步骤1. 定义结点结构,定义哈夫曼树结构;2. 初始化哈夫曼树,存储哈夫曼树信息;3. 定义求哈夫曼编码的函数;4. 定义译哈夫曼编码的函数;5.写出主函数。
6.测试系统。
四、实验内容1. 文件工程包含两个头文件, Huffma n.h 用于定义显示选项菜单的相关函数, Huffma nTree.h用于定义与霍夫曼编码相关的类;包含三个 cpp 文件,Huffman.cpp 用于实现显示选项菜单的相关函数,Huffma nTree.cpp 用于实现与霍夫曼编码相关的类的成员函数等,HuffmanCode.cpp 用于主函数的实现。
鼻認 HuffmanCode詛外篩依瞰项 “—头交牛.h] Huffman.h _h] HuffmanTreenh I h] stdafx.h _h] targetvenh-Q 源文件些勺 Huffman,cpp 记 HuffmanCod^.cpp 出 HuffmanTree.cpp 門 stdaix.cpp2. 霍夫曼编码相关类程序中将霍夫曼树结点与霍夫曼编码相关操作分别封装为类-3class HTNode { public:void set (char d, int int p, int int r) { data = d : weight 二 w; parent = p : lchild = 1. rchild =}char dat a; int weight : int parent : int lchild : int rchild;} \H HTNode, *Huffm^Tree ;12 13 14 15 16 17 13 19 20 21 22 23 24 25 26通过对类内部数据的赋值与相关函数的操作,可以完成霍夫曼编码解码等操作3. 选项菜单等相关函数1 H#pragma once #include h* 3 #include "HuffmanTree. h" void MainMenuO ;void MeniiC HuffnanCode 总):/7主菜单void ChooseCode ( HuffmanCode 矗); "选择L 输入宇符串编码 void ChaaseRecode( HuffmanCode 也)://选择2进行粥码//void Chooselnput Tree ( HuffmanCode 矗); ////void SourceFromFile( HuffmanCode 矗); void Input FromFilet HuffmanCode fi. ): //选择5从外部读取霍夫曼树与编码串解码 void OtrtputToFile( HuffmanCode & ); "诰择6输岀数据3233 34 35 3C37 38394D41424344 45 46 47 48 495051525354b55d&7 &a59 606182036465 666T 閃6970 7L72HuffKanCods 0: "Hyf f jh.a (nJCfid* ();void clear (). void buildHTr^o (): void HuffmanJCodin;(): vsid Huf fmanK?c odin$ 0 : void select ( Huffmanrree 爲 irrt . inti t inti );void setDataSumf int sun { dataSun = sum;} void set Sour ceSum( irrt sun ) { source Sum = wun;] void setDataf char * ): void set height( int * );void setCodeString( string S L ); void set Sour ce( const char * );string gcodeStrungO { char* gdarta() I return inct gdata5u>0 { return iwt * gweight 0 { return return codeString;] data;) dataSum;} weight :} bool already_r ecoded: bool cleared.priuata:Huff nanTreB HTrea ; "瞳夫曼树 char *data. "叶子貓点埶捐 irrt ^weight: "权值int dat aSum: //叶子姑点埶蚩 CODE code ;"霍夫昼偏码 string codeString: "編码串 string recod&Dat ai "斛码数洞 char *source: "待编玛源數握 int sourceSwn; "待漏码字符个数"■重畫栽摒/7创建霍夫異树Z/霍夫曼編码 "靈夫昼鯛码//■从叶子结点中选槿稅值最小且父踣点/7输出数拥45 e7 E gH |13 14 15 応rl class HuffsanCods { public: void out [),};void Init ( HuffnanCode & );-void Menu( HuffnanCode ftHC ) {int chioce : MainIflenuO : do{cin>>chioce: swit ch (chioce){ case 1:ChooseCode ( HC ); br&ak ; case 2: ChooseRecode( HC ); breah : case 3://ChooseInput Tree( HC ); CDUt<eU 功能已披取消! y«>di : break ; case 4://SourceFromFilet HC ): 功能已被取消:"«endl; break; case 5:InputFronFile ( HC ); br&ak 」 case 6: Output ToFile( HC ); breah: 匚ase 7:In Lt ( HC ); }NlainMenuf); }while (chioce'=0);L5 i- void MainHenuO {cout <<^****#*-*+#*#^择娶 Itl 行的搽作:*#**+#*m****#***#^*" <<endl : cout<<* 1.輸入待解码电文 **<<endl ; ccnrt<V" 2.超码井输出 * <<erudl : cout «* 工输入待解码电文(无效) «endl : cout«# 4・从文件读入宇符串进行编码■:无效)’<<endl;cout«* 5•从文件读入带解码电文 *«endl :cout«ff&输出信息到文件 *«endl : cout«" T.初始化霍夫曼樹 '«endl :cout<<^ D.退出 \n ff<<endl: cout *#^^****#^#^#**********#**:******:#********:*****■' ^^endl ; Init()函数用于从外部文件中加载霍夫曼树, 因为树人工不好整理所以我设置了读入树的 叶子结点与权值,然后内部编写函数将这两种数据整理成霍夫曼树456789 10 11 12 13 14 15 16IIE |19 20211 22123 24 25 2627 2829303132 176 177178|1791180 181 182 183 1B4-void HuffmanCade HC ) {146| 147 148 149 150 151 152 153 154 155 156 157 15£| 15S 160 161 162 153 104 165 166 157 15E 165 170| 171 172 173 1 rx string data; intdat aSum: int*weight: irrtif st team readfile ( "C; WHuffnanTree .tirt", 10s:: m ): cout«'正在读®!霍夫曼树文件<<endl;if( ■readfile ){cout<<"文件不存在!<<endl:return :cout«^ 读取完成![«endl:readfile>>data;dat aSum 二(int) dat a. length ():weight = (int *) nalloc ( dat aSuni^sizeof (int)); for t int i=0.i<dataSum: i++){readfile>>w;weight[i] = w;HC» setDat aSum ( dataSum );HC* setDat a( (char *) data. c_st r () ) ://const_cast<char HC,setWeight( weight );HC» already_recoded = false:HC.cleared = t rue:HC,buildHTree();ChooseCode()函数用于执行从终端读取编码串,然后根据读取的霍夫曼树来解码37 E void ChooseCode( HuffmanCode & HC ) {3839 40■41 42 43 44 45|st ring source.cout«^请输入待解码玛串"«endl; cin»source;HC.setCodeSt ring( source ):ChooseRecode ()函数用以执行解码操作,对从终端或者从文件读取的编码串进行解码并输出4S - void ChooseKecode( HuffmanCade 施HC ) {4950 51 52 53HC. EuffihanKecoding :HC・ alr&ady_recoded = 土工口日;HC. cut ():InputFromFile()函数用于从外部文件读取待解码的编码串112 -Ivoid InputFromFile ( HuffmanCode HC ) {113 114| 115 116 111 US string codeStr ing:if str ean readfile ( rf C: \\cade. txt'*, ias:: in ) cout «* jE 在读取code, tzt 文件................... * «endl;if ( !readfile ){cout«*S件不存在!rf«andl;119 120I 1211122 123] 124 125 126| [}return :}cout<< '读取完成!r«endl;; readf ile>?codeSt ring;HC, setCodeSt ring ( codeSt rirtg ); HC.already_recoded = f:HC. cleared = true;OutputToFile()函数可以将霍夫曼树,解码后的字符串输出到外部文件中130 131 132 133 134 135 136 137 138 139 140 141 142 143 145 146 147r void Output TnFile ( HuffmanCode 4 HC ) { of streamoutf ile( "C:\\HuffmanCode,tx t」if ( I outfile ){cout«*文件不存在!*«endl;retum :}for ( int i=l; i<=HC, gdat aSumO : i++)outfile«(HC.eHT()+i)->data:outf ile<<endl:for ( int i=l: i<-HC. gdataSumO : 1++)outfile<<(HC. gHT()+i)->weight ": □utf ile<<endl;outf ile<<HC・grecodeDat a()«endl:outfile»close():ios::out|ios::trune );4.霍夫曼编码操作编码首先从外部初始化霍夫曼树,即调用lnit()函数从外部读取数据;32 33 34 35 36 37 38 39E:void HuffmarCode: :buildHTree (){ int ij nij sl=0j s2=0:HuffmanTree p:int 二veight: int n = dataSum.nt - :HTree = (HuffmariTreeJnalloc ( (m+1) * sizeof (HTNode));4041 F fort p^HTree+1, i=l; i<=n; i++,p++,v++)42//*p = {*(dat a+i)fl D, 03 0}:p->set C* (dat a+i~l)j 0, 0, 0):44"0号位置不用45 46 47 48 49 50 51 52 53 54 55 56 57for( : i<=m: i++, p++)//*p = U j D, D, 0, 0}: p->set (' W , 0?D, 0, 0);fort i=n+l: i<=m; i卄){select (HTree, i, si, s2):(HTree+s l)->parent = i; (HTree+s2)->parent = i:田Tree+i)->lchild = si: (HTcee+i)->rchild = s2;(HTree+i^ ->weight = (HTree+s 1)-height 4- (HTreB+s2)'>veight : si = s2 = 0;59 f-void HuffmanCode:: HuffmanCoding ( ) {int ij ihj s 1 =0j s 2=氏 c, f, st art: char *cd; int 二 weight : int n = dat aSwn : buildHTree (): //- --------- code = nev strinatn+l] ://(CODE)malloc ((n+l) + sizeof (string)). cd = new char [n] ;//(char*)mallo 匚(char)); cd[n-l] = ' \0';fort i=l : i<=n; i++) {st art = n-1; for Cc=ij f=HTree[i]. parent ; f 1=0; c=f, f=HTree [f]* parent? { if (HTree [f ]. Ichild == c) cd[—st art ] = 0R: else cd [一st art] = '1* ; } code [i-1] 二 (char *)nalloc((restart )#sizeof(char)): //strcpy(code[i]j 4cd[start]); //trans ( code [i]j fi.cd[start ]): code [i-1 ]. assign (cd+st art, n-start); } free (cd); f or ( i=0: KsourceSum, i++) { m = get_in_cleareii( dat source [i]): codeString. append( code [m]); codeSt ring ■歧]:asE ( codeString, lengthO-lj l): } codjeStrint- erase ( D, 1 ); 然后选择编码串来源,可以从外部文件读取,也可从终端输入; 最后是进行霍夫曼解码,调用 HuffmanRecoding()函数;606162 63 641 65 66 67 68 6970 71727374 75767770798081828384858687 @8 89909192if ( n<=l ) return;95 -void Huff JikanCode; :Huff JikanRecoding () { unsigned int le = codsSt ring*length (): unsigned int i ; int aim : string t ; string 1, r ; 1. assign ( lj "『); r- assign( 1, T T ): aim = 2*dataSwn-l; 104119 recodeDat a. append( I 』 \CT ); recadeData =recodeData» erase (0^ 1).122 }五、实验结果105 1US 107日 108 109 110 111 112 113 114 115 11S 117 118for( i=0; i<=le; i++) { _____________ unsigned int i 、… t = codeSt r 1)://i+1 //*<<i<<erLdl: if ( HTree [aim], data I 二 \0* H recodeBata- append ( 1, HTree [aim] data ). aim = 2*data3um -l ; } //cout<<H-l ; if ( !t. cojivpare (1)) aim = HTreetaini]. lchild; else if ( !t * compare (r)) aim = HTree[aim]. rchild;首先在C 盘下设置HuffmanTree.txt 的初始值,第一行为叶子结点的值,第二行为权值然后设置code.txt 的初始值,为要解码的字符串96 97 98 99 100 101 102 103运行程序第一步初始化知夫曼欣件……皿"选择要执行的操作;效行文无进电{串码电畫雯曼码岀码入纽夫解曹心霍tssK入码入文文出習HAB81234-5678第二步从code.txt读取编码串code・七泌文件■ >无码IS效行艾无进电—串码^ss电宀曼鲁入首夫嘗心霍?u?码入文文岀善234567NXWM E恒拉耳耳先扌牛夢扌丸■仃R [ ?^'乍- 算貝拭拉耳则植號耳冥梵址耳艮図:址坯效无XC码IS效行文无进电文^ss电电宀曼码出码△豹夫解嘗心霍入码入文文岀前S8MW8第三步,解码码电丈(无效)选择要执行釦操作:***"*""扁码,库码岀的内容liuqin gtongj:0001100010111101M11110iai00101111E :\5S 超仪J 庚同课理设计\H u ffman Code\ Debug\H u fftnan Code.exe 第四步,输出到Huffma nCode.txt 文件1234567码出码入毎夫解睿2®-富入文文出體编码000110001011101111010100权值12112211E:儀超夕5 仪原司课理设计\H u ff ma n Cade\Dfbug\H u ffmain Code,exti增入待解殆电文确电文(无效)痕入壬蒼串进行编码|A|g码电文律夫曼h:先扌辛萝7 J j 丁g「-j 三. JOftNXXl I NXXX i CNXM EB tNX效无zk码IS效行文无进电电电宀曼码出码△豹夫解嘗心霍tsu入码入文文岀前1234567H uffma nC D-de.txt - ic爭本文件(» 耦IE 格式(O}_査首M[litiqngto12 112 2 1 1 liuqingtang还可以选择从终端输入编码串然后解码,输出到外部,比如编码串000011010 (Iqt)解码岀的内^linqinytongf***********A j J S tt 行的操作:请输入待解码码串000011010:M BtXJCM KKKMJHK诜彳睪要扌丸 f 丁•作-»**HHHH**JM***JOHt**E:住対5饵5\刘戾同课環设计\H u ffma n Code\ Dfbug\H u ffmanCode.txeIs效行文无进电—串码^xn电电宀X雯曼码出码入首夫入码入文文岀雷IWMMW8■1234567解曾常f入码入文文岀护码IS效行文无进电{串码文^xuv电电宀码出码【无效IE 电仪J 辰同课理设计u ffma n Code\ D 昔bug\H u ffmanCode.txeI ■—■C.-l 11 .■^S—^O M t I I jf | L F I 口 "匚丄」L f 1 1-T '. | "1 I 口| -Tyf* I r ■效无码IS效行文无进电—串码^xss电电宀X雯曼码出码入渤夫入码入文文岀善UMWS■■■叶子值编码Q&Q11B001011101ill010100枚值1112211000011010内容Rt丈件锄旧褐式Q宜寿(V) m(H) liuqngto12 112 2 11iqt六、实验心得实验之后,我对于程序设计的思路又有了加深的理解,同时掌握了一定的霍夫曼编码方面的知识。
哈夫曼编码译码课程设计报告
![哈夫曼编码译码课程设计报告](https://img.taocdn.com/s3/m/4e6d62977f1922791688e8c1.png)
哈夫曼编码译码课程设计报告《数据结构》课程设计——赫夫曼编码/译码器设计指导教师:李文书、周维达班级: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)大致个人测试案例:主界面:。
huffman哈夫曼树编码译码课程设计报告
![huffman哈夫曼树编码译码课程设计报告](https://img.taocdn.com/s3/m/bd2cffa859eef8c75ebfb301.png)
数据结构课程设计信息科学与工程学院:学院计算机科学与技术专业: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。
数据结构课程设计报告哈夫曼编码译码器
![数据结构课程设计报告哈夫曼编码译码器](https://img.taocdn.com/s3/m/61c24a7f0b4c2e3f56276322.png)
哈弗曼编码译码器专业班级:XXXX学号:XXXX姓名:XXXX指导教师:XXXX课程设计时间:XXXX计算机专业数据结构课程设计任务书1 需求分析设计一个哈弗曼编码译码器,实现哈夫曼树的建立,树形输出,编码和解码。
2 概要设计3 运行环境(软、硬件环境)1) 硬件:PC 机main建立哈夫曼树查看哈夫曼编码树形输出哈夫哈夫曼文件编码哈夫曼文件解码帮助退出系统2)操作系统:Windows 2000/XP/20033)编译环境:Visual C++6.04 开发工具和编程语言开发工具:VISCALL c++6.0;编程语言:C语言。
5 详细设计#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct // 结点的结构{unsigned int weight; // 结点的权值unsigned int parent,lchild,rchild;}HTNode,*HuffmanTree; // 动态分配数组存储哈夫曼树typedef char **HuffmanCode; // 动态分配数组存储哈夫曼编码HuffmanTree HT;HuffmanCode HC;int n=8;const char menu[]="|1 建立哈夫曼树|\n""|2 查看哈夫曼编码|\n""|3 树形输出哈夫曼树|\n""|4 哈夫曼文件编码|\n""|5 哈夫曼文件解码|\n""|6 帮助|\n""|7 退出系统|\n";const char helpsabout[]="|主要功能: |\n""| 利用哈夫曼编码进行通信可以大大提高信道的利用率,缩短信息的传输时间,降低 |\n""|传输成本。
哈夫曼编译码器课程设计报告(完整版)
![哈夫曼编译码器课程设计报告(完整版)](https://img.taocdn.com/s3/m/b642982ca26925c52dc5bf4a.png)
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 设计试验用程序实验赫夫曼树的构造。
哈夫曼编译码器课程设计报告
![哈夫曼编译码器课程设计报告](https://img.taocdn.com/s3/m/336b75bf89eb172ded63b7bf.png)
《数据结构》课程设计报告题目: 哈夫曼编/译码器 专业: 计算机科学与技术(对口)班级: 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,以此设计哈夫曼编码。
课程设计报告--哈夫曼编码译码系统
![课程设计报告--哈夫曼编码译码系统](https://img.taocdn.com/s3/m/be69bf7d76eeaeaad0f33047.png)
2.定义代表森林的数组,在创建哈夫曼树的过程当中保存被选中的字符,即给定报文中出现的字符,模拟哈夫曼树选取和删除左右子树的过程;
3.自底而上地创建哈夫曼树,保存根的地址和每个叶节点的地址,即字符的地址,然后自底而上检索,首尾对换调整为哈夫曼树实现哈弗曼编码;
随着计算机的普遍应用与日益发展,其应用早已不局限于简单的数值运算,而涉及到问题的分析、数据结构框架的设计以及设计最短路线等复杂的非数值处理和操作。算法与数据结构的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础。
算法与数据结构旨在分析研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法达到最优。
4.定义hufnode类型的全局数组hufNode[256],在编码时最为哈夫曼编码对照表的节点,char型c保存字符,int code[100]保存其哈夫曼编码;
5.定义HFM类,主要保存哈夫曼树的根节点指针,但其丰富的功能函数将实现哈夫曼编码译码的工作及其他功能;
函数介绍:
1.void init(signode * sig){……}初始化数组SN[];
数据结构是在整个计算机科学与技术领域上广泛被使用的术语。它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。数据结构是数据存在的形式。
《数据结构》主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
哈夫曼编码译码课程设计报告
![哈夫曼编码译码课程设计报告](https://img.taocdn.com/s3/m/4e6d62977f1922791688e8c1.png)
哈夫曼编码译码课程设计报告《数据结构》课程设计——赫夫曼编码/译码器设计指导教师:李文书、周维达班级: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)大致个人测试案例:主界面:初始化:Huofuman.txt初始化存入文件结果如下:编码结果如下:codefile.txt编码存入文件如下:译码结果如下:textfile.txt译码存入文件如下:打印结果如下:打印树结果如下:treeprint.txt存入文件结果如下:(2)本例测试案例_1已知某系统在通信联络中只可能出现八种字符,其频率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计哈夫曼编码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录目录 (2)1课程设计的目的和意义 (3)2需求分析 (4)3概要设计 (4)4详细设计 (8)¥5调试分析和测试结果 (11)6总结 (12)7致谢 (13)8附录 (13)参考文献 (20).|;1 课程设计目的与意义在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。
哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。
哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。
树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。
通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。
电报通信是传递文字的二进制码形式的字符串。
但在信息传递时,总希望总长度尽可能最短,即采用最短码。
作为计算机专业的学生,我们应该很好的掌握这门技术。
在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。
(在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。
这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们可以逐步积累调试C程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。
在课程设计过程中,我们不但有自己的独立思考,还借助各种参考文献来帮助我们完成系统。
更为重要的是,我们同学之间加强了交流,在对问题的认识方面可以交换不同的意见。
同时,师生之间的互动也随之改善,我们可以通过具体的实例来从老师那学到更多的实用的知识。
数据结构课程具有比较强的理论性,同时也具有较强的可应用性和实践性。
课程设计是一个重要的教学环节。
我们在一般情况下都能够重视实验环节,但是容易忽略实验的总结,忽略实验报告的撰写。
通过这次实验让我们明白:作为一名大学生必须严格训练分析总结能力、书面表达能力。
需要逐步培养书写科学实验报告以及科技论文的能力。
只有这样,我们的综合素质才会有好的提高。
2 需求分析课题:哈夫曼编码译码器)问题描述:打开一篇英文文章,统计该文章中每个字符出现的次数,然后以它们作为权值,对每一个字符进行编码,编码完成后再对其编码进行译码。
问题补充:1. 从硬盘的一个文件里读出一段英语文章;2. 统计这篇文章中的每个字符出现的次数;3. 以字符出现字数作为权值,构建哈夫曼树,并将哈夫曼树的存储结构的初态和终态进行输出;4. 对每个字符进行编码并将所编码写入文件然后对所编码进行破译。
具体介绍:在本课题中,我们在硬盘中预先建立一个文档,在里面编辑一篇文章。
然后运行程序,调用函数读出该文章,显示在界面;再调用函数对该文章的字符种类进行统计,并对每个字符的出现次数进行统计,并且在界面上显示;然后以每个字符出现次数作为权值,调用函数构建哈夫曼树;并调用函数将哈夫曼的存储结构的初态和终态进行输出。
然后调用函数对哈夫曼树进行编码,调用函数将编码写入文件;再调用对编码进行译码,再输出至界面。
至此,整个工作就完成了3 概要设计。
【(1).编码:提示要编码的文件文件名→读取文件→以字母出现次数为权值建立哈弗曼树→对文本进行哈弗曼编码并输出编码→提示将编码保存的文件名→保存编码文件;}(2).译码:提示输入要译码的文件名→利用建立好的哈弗曼树进行译码→将译码输出→提示保存译码文件的文件名→保存译码文件;(3).退出:退出系统,程序运行结束。
1.打开文件函数:Open(char s[])图2 打开文件函数流程图2.保存文件函数Save(char s[])图3 保存文件函数流程图)3.哈弗曼编码函数:HFMCode(HFMTree HT,CodeNode HC[],char str[])图4 哈弗曼编码函数流程图、、4.译码函数:DeCoding(char code[],HFMTree HT,char str[],chars[])%¥图5 译码函数流程图·4 详细设计本课题是用最优二叉树即哈夫曼树来实现哈夫曼编码译码器的功能。
假设每种字符在电文中出现的次数为Wi,编码长度为Li,电文中有n种字符,则电文编码总长度为(W1*L1)+(W2*L2)+…+(Wi*Li)。
若将此对应到二叉树上,Wi为叶结点,Li为根结点到叶结点的路径长度。
那么,(W1*L1)+(W2*L2)+…+(Wi*Li)恰好为二叉树上带权路径长度。
因此,设计电文总长最短的二进制前缀编码,就是以n种字符出现的频率作权,构造一棵哈夫曼树,此构造过程称为哈夫曼编码该系统将实现以下几大功能:从硬盘读取字符串,建立哈夫曼树,哈弗曼编码以及哈夫曼译码等。
1.从硬盘读出字符串的函数:void Open(char s[])》立哈夫曼树函数void CreatHFMTree(HFMTree *HT,int count[]){h=str[i];HC[i].code[n-1]='\0'; tart=n-1;for(q=p;q->Parent;q=q->Parent)ode[--HC[i].start]='0';else HC[i].code[--HC[i].start]='1';(p=p->next; 行程序得到如下界面:图6 主界面运行截图2.选择1,按回车键,在输入对字符串进行编码,得到如下界面:。
图7 编码运行截图3.输入按回车键保存哈弗曼编码:图8 保存编码运行截图4.输入按回车键进行译码得到如下界面:#图9 译码运行截图6总结通过一周的课程设计使我对哈夫曼树以及哈夫曼编码有了更深的认识和理解,也使我更加明白哈夫曼编码译码在信息技术中的重要性和地位。
首先我谈谈我在设计期间我遇到的难点。
开始的时候,代码中有许多的错误,特别是有一个“无法找到文件”的错误让我束手无策,最后还是屏蔽了定义的四个头文件然后慢慢地改正错误才让我又看到了希望。
然后在实现文章的读入时,由于对文件不是太熟悉,只好翻开C语言书本仿照其模式编写。
许多的错误让我明白了一个道理---细心是非常重要的。
同时,对于编程者而言,思路清晰是相当重要的。
在适当的时候和同学一起交流探讨是一个十分好的学习机会。
请教老师也很重要,因为毕竟我们是新手,对于某些问题很难弄清楚。
而且,某些错误对于我们来说有时候想半天都弄不来,但老师几下下就搞好了,这样就更加有效地节约了时间。
这次课程设计不但让我学得了一些编程知识,还学会了系统的做一份课程设计报告,学会了如何截图,学会了如何更好的画流程图,明白了做事情只有认真,才能真正做得更好!这段时间里,可谓是酸甜苦辣都尝过。
有时,为了一个错误而焦头烂额;有时,连吃饭都是匆匆了事;但一旦程序运行成功,总会让我兴奋不已。
:通过这次课程设计,我看清楚了自己的编程功底和动手能力还不如人意,这主要是平时实践太少的缘故。
我想,在未来的暑假中,我会努力尝试编写一些程序。
虽然我们信息管理专业的学生,但现在编程的能力太差了,毕竟多精通一门技术总是好事。
在这个程序中,还有许多地方值得完善。
比如,读出文本只能是大写的文档,空格和小写不能识别,更不用说是任意的ASCⅡ码字符了。
由于时间问题,暂时不能实现了。
我想在暑假里好好研究这个问题7 致谢在这次设计中我要感谢与我同组的两位同学喻霞林和董茗桓,有很多不懂得地方我们可以互相讨论研究,没有他们的配合我不可能完成这次课程设计!8 附录:#include <>#include <>?#include <>#define M 10000#define N 128typedef struct node{int weight;…struct node *LChild,*RChild,*Parent;struct node *next;}HFMNode,*HFMTree;typedef struct{char ch;$char code[N+1];int start;}CodeNode;int n;【void clearscreen(){system("cls");}void Open(char s[]){,char name[10];FILE *fp;int i=0;printf("请输入要打开的文件名:");gets(name);if((fp=fopen(name,"rt"))==NULL){printf("打开失败!\n"); \exit(1);}s[i++]=fgetc(fp);while(s[i-1]!=EOF)s[i++]=fgetc(fp);s[i]='\0';fclose(fp);}|void Save(char s[]){char name[10];FILE *fp;printf("请输入要保存的文件名:");gets(name);&if((fp=fopen(name,"wt"))==NULL){printf("存储失败!");exit(1);}fputs(s,fp);printf("\n保存成功,文件名为:%s。
\n",name);printf("\n按回车键继续...");、getchar();fclose(fp);}》void SearchStr(char s[],char str[],int count[]) {int i,j,k=0;for(i=0;i<N;i++)count[i]=0;for(i=0;s[i];i++){for(j=0;j<k;j++)'if(str[j]==s[i]){count[j]++;break;}if(j==k){str[k]=s[i];、count[k++]++;}}str[k]='\0';n=k;}void SelectMin(HFMTree HT,int k,HFMTree *HT1,HFMTree *HT2) {{int i,min;HFMTree p;min=32767;for(i=0,p=HT;i<k;i++,p=p->next)if(p->weight<min&&p->Parent==0){min=p->weight;<*HT1=p;}min=32767;for(i=0,p=HT;i<k;i++,p=p->next)if(p->weight<min&&p->Parent==0&&p!=*HT1){min=p->weight;*HT2=p;》}}void CreatHFMTree(HFMTree *HT,int count[]){,int i;HFMTree p,HT1,HT2;p=*HT=(HFMTree)malloc(sizeof(HFMNode));p->next=p->LChild=p->RChild=p->Parent=NULL;for(i=1;i<2*n-1;i++){p->next=(HFMTree)malloc(sizeof(HFMNode));p=p->next;>p->next=p->LChild=p->RChild=p->Parent=NULL;}for(i=0,p=*HT;i<n;i++){p->weight=count[i];p=p->next;}【for(i=n;i<2*n-1;i++){SelectMin(*HT,i,&HT1,&HT2);HT1->Parent=HT2->Parent=p;p->LChild=HT1;p->RChild=HT2;p->weight=HT1->weight+HT2->weight;!p=p->next;}}void HFMCode(HFMTree HT,CodeNode HC[],char str[]){)int i;HFMTree q,p=HT;for(i=0;i<n;i++){HC[i].ch=str[i];HC[i].code[n-1]='\0';}for(i=0;i<n;i++);{HC[i].start=n-1;for(q=p;q->Parent;q=q->Parent)if(q==q->Parent->LChild)HC[i].code[--HC[i].start]='0';else HC[i].code[--HC[i].start]='1';p=p->next;}-}void TotalCoding(char s[],CodeNode HC[],char code[]){;int i,j;code[0]='\0';for(i=0;s[i];i++)for(j=0;j<n;j++)if(s[i]==HC[j].ch)strcpy(code+strlen(code),HC[j].code+HC[j].start); },void DeCoding(char code[],HFMTree HT,char str[],char s[]){int i,j,k=0;HFMTree root,p,q;for(root=HT;root->Parent;root=root->Parent);for(i=0,p=root;code[i];i++){if(code[i]=='0')!p=p->LChild;else p=p->RChild;if(p->LChild==NULL&&p->RChild==NULL){for(j=0,q=HT;q!=p;q=q->next,j++);s[k++]=str[j];p=root; ik}—}s[k]='\0';}void Coding(char s[],char str[],char code[],int count[],HFMTree *HT,CodeNode HC[]){clearscreen();…printf("\n打开存放字符串的文件...\n\n");Open(s);SearchStr(s,str,count);CreatHFMTree(HT,count);HFMCode(*HT,HC,str);TotalCoding(s,HC,code);printf("\n读入的字符串为:\n");puts(s);(printf("\n最终的哈夫曼编码是:\n");puts(code);printf("\n保存编码,");Save(code);}void TransCode(char code[],char str[],char ss[],HFMTree *HT,CodeNode HC[])"{clearscreen();printf("\n打开编码的文件...\n\n");Open(code);DeCoding(code,*HT,str,ss);printf("\n得到的最终字符串为:\n");puts(ss);printf("\n保存译码,");%Save(ss);}void main(){char s[M],ss[M];char str[N];int count[N];char code[M];char choice;HFMTree HT;CodeNode HC[N];do{clearscreen();printf("\n\n");printf(" ************哈夫曼树************\n");printf(" ** **\n");printf(" ** 1.编码。