资源预览内容
第1页 / 共20页
第2页 / 共20页
第3页 / 共20页
第4页 / 共20页
第5页 / 共20页
第6页 / 共20页
第7页 / 共20页
第8页 / 共20页
第9页 / 共20页
第10页 / 共20页
亲,该文档总共20页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
数据结构( C+ 实现)实训报告信息治理吴昊翀1251220217黄建灯题目:哈弗曼编码与译码专业:班级:学生:学号: 指导老师:2 / 16目录一、实训要求3二、课题分析和设计31. 基本需求分析32. 对应的结构体或类4三、主要功能界面61. 主界面62. 读取文章并对字符编码73. 哈弗曼编码信息74. 文章编码8四、 总结10五、附录10一、实训要求输入为:一段英文或中文的文章(原文) 对输入的文章构造哈夫曼树生成对应的编码输出为:原文所对应的编码(译文)依据已经生成的编码表,输入任意的译文可以得到对应的原文二、课题分析和设计1. 基本需求分析1. 在通信过程中,为了提高信道利用率,缩短信息传输时间降低传输成本,需要一编码译码器;2. 此哈弗曼编码译码器应具有编码译码的双向功能,即在发送端通过编码系统对传入的数据进行编码;3. 在接收端将数据译码,将具有两项功能的编码译码器用于双工信道就可满意,双工信道的双向编译功能;4. 输入某段报文是,系统将自己完成编译输出;1. 程序设计流程(1) 文字表述开头进入功能挑选界面,包含五种操作:1. 读取文章并对字符编码;2. 哈夫曼编码信息;3. 文章编码;4. 文章译码;5. 退出程序;(2) 操作1:给定一篇文章,统计字符显现的概率,并依据概率建立哈弗曼树,并利用哈弗曼树对字符进行哈弗曼编码;2:显示哈弗曼编码信息,包括字符,字符显现的概率,哈弗曼编码;3:对文章进行译码,显示译码信息,并储存;4:对文章进行译码,显示并储存( 3)流程图程序开始20 / 16程序主界面读取文章并对哈弗曼编码文 章 编 码信息文 章 编 码文 章 译 码退 出 程 序显 示 编码保 存 编码返 回 主界面显示译码保 存 译码返回主界面2. 对应的结构体或类(1) )定义class Htnote public:char name; /字符名double weight; / 权重int lchild; / 左孩子int rchild; / 右孩子int parent; / 父亲Htnote weight = 0;lchild = -1;parent = -1;rchild = -1;(2) 定义字符和显现的次数class Name public:int num; / 字符显现的次数char pname; /字符名double lweight; / 权值Name num = 0;lweight = 0;(3) 定义字符种类总数和储备信息class GetName public:char namefmax2;int n; / 字符的种类int sum; / 字符的总数Name lettermax1; / 储备字符信息的类的数组GetName sum = 0;n = 0;(4) 定义编码类class CodeNode/编码类public:char ch; /储备字符char bitsmax1; / 储备编码;class Function public:GetName L;int fn; / 定义哈夫曼数组大小Htnote HuffmanTmax3; /哈夫曼数组CodeNode Codemax1; / 字符编码数组Function fn = 0;三、主要功能界面1. 主界面2. 读取文章并对字符编码3. 哈弗曼编码信息4. 文章编码5. 文章译码四、总结为期两个星期的课程设计最终完善落下帷幕,回想起前前后后仍是有苦有甜;当拿到课题是感觉仍行! 结果前几天做程序的代码时一点都不会做,课本也看不懂课程进度可以说是 原地踏步! 只能怪自己吧!老师讲的有时能听懂有时就听不懂,到头来今日的局面,当时以为自己完成不了任务; 过程中甜的是有老师和同学的帮忙, 终于圆满完成任务; 通过本次实训让我重新学习了算法和数据结构这门课程, 也懂得了用代码来建立哈弗曼树, 编码译码双向功能 .上机试验, 将理论的学问与实际结合起来; 增强了自己的动手才能, 觉的任何学问都不是轻而易举的学懂, 必需花点心思去学, 必需要付出努力;以后上课就不能像以前那样,要好好学习这样不辜负老师对我们的心愿; 最终诚心感谢帮忙我完成程序设计的老师和同学表示感谢!五、附录全部代码:#ifndef HUFFMANFUNCTION_H #defineHUFFMANFUNCTION_H#include #include #include #include #define max1 150#define max2 50#define max3 256 using namespace std;class Htnote public:char name; /字符名double weight; / 权重int lchild; / 左孩子int rchild; / 右孩子int parent; / 父亲Htnote weight = 0;lchild = -1;parent = -1;rchild = -1;class Name public:int num; / 字符显现的次数char pname; /字符名double lweight; / 权值Name num = 0;lweight = 0;class GetName public:char namefmax2; int n; / 字符的种类 int sum; / 字符的总数Name lettermax1; / 储备字符信息的类的数组GetName sum = 0;n = 0;void GetWeight/ 得到字符的权值for int i = 0; i n; i+ letteri.lweight = double letteri.num / sum; /显现的次数除总数得到权值int ReadLetter ifstream input;cout 请输入文件名: namef;input.opennamef; / 打开文件if input.fail cout 该文件不存在! endl; return 0;char ch;ch = input.get; letter0.pname = ch; letter0.num+; sum+;while .input.eof /读取文件中的全部字符int tag = 0;ch = input.get;for int i = 0; i n + 1; i+ if letteri.pname = ch letteri.num+; sum+;tag = 1;if tag = 0 n+;lettern.pname = ch; lettern.num+; sum+;sum-; input.close;GetWeight; / 得到字符权值;class CodeNode/编码类public:char ch; /储备字符char bitsmax1; / 储备编码;class Function public:GetName L;int fn; / 定义哈夫曼数组大小Htnote HuffmanTmax3; /哈夫曼数组CodeNode Codemax1; / 字符编码数组Function fn = 0;void CharHuffmanTCoding/编码功能实现int i, f, c;char cd1000; / 临时储备编码的数组int start; / 编码读取起始位置cdL.n = 0;for i = 0; i = 0 if HuffmanTf.lchild = c/假如为左孩子,为0cd-start = 0; else/ 假如为右孩子,为 1cd-start = 1;c = f;strcpyCodei.bits, &cdstart; /将结果存入对应的编码数组中void OutputHuffmanTCode cout 哈夫曼编码: endl; cout - endl;cout 字符t 权值 tt 哈夫曼编码 endl;for int i = 0; i L.n; i+/输出字符,权值,哈夫曼编码cout - endl;cout HuffmanTi.name t HuffmanTi.weight t; cout Codei.bits;cout endl;cout - endl;void InitHT/ 哈夫曼初始化L.ReadLetter; fn = L.n*2 - 1;for int i = 0; i fn; i+ if i L.n HuffmanTi.name = L.letteri.pname;Huf
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号