




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、哈弗曼编码课程设计实验报告目录一、 实训要求 .2二、 课题分析和设计 .21、 基本需求分析 2,32、 对应的类 .3,4,5三、 主要功能界面 .51、 主界面 52、 读取文章并对字符编码 53、 哈弗曼编码信息 .64、 文章编码 .65、 文章译码 .66、 错误处理 .7四、 总结 (课设心得体会 ) 7五、 附录 (主要函数代码 ) 714一、实训要求1、输入为:一段中文或英文的文章的文件名。 2、读取文章的字符信息。3、 对字符进行权值的计算。4、 根据权值构造哈弗曼树。5、 生成对应的编码。6、 输出为:原文章的编译(译文)。7、 根据已经生成的编码表,输入任意的译文 可以
2、得到原文。二、课题分析和设计1.基本需求分析:(1) 在通信过程中,为了提高信道利用率, 缩短信息传输时间降低传输成本,需要一编译 码器。(2) 此哈弗曼编码译码器应具有编码译码 的双向功能,即在发送端通过编码系统对传入的数据进行编码。(3) 在接收端将数据译码,将具有两项功 能的编码译码器用于双工信道就可满足,双工 信道的双向编译功能。(4) 输入某段报文是,系统将自己完成编 译输出。(5)、程序设计流程:文字表述:开始进入功能选择界面,包含五种操作 (1)读取文章并对字符编码。(2) 哈夫曼编码信息。(3) 文章编码。(4) 文章译码。(5) 退出程序。操作:(1)给定一篇文章,统计字符出
3、现的概率, 并根据概率建立哈弗曼树,并利用哈弗曼树对字符进哈夫曼编码。(2) 显示哈弗曼编码信息,包括字符和其 哈弗曼编码。(3) 对文章进行译码,显示译码信息,并 保存。(4)对文章进行译码,显示并保存。 流程图:程序开始程序主界面读 取 文哈 夫 曼文 章文 章退 出显 示保 存返 回显 示保 存返 回2、对应的类:定义类:class element /结点类 public:char name;/字符名 int weight;/字符权值 int lchild;/左孩子int rchild;/右孩子int parent;/父结点 element()weight = 0;lchild = -1
4、;rchild = -1;parent =-1;element();定义字符和出现的次数: class name /字符类public:char pname;/字符名int num;/字符出现的次数 double lweight;/字符的权值 name()num = 0;lweight = 0;name();定义字符总类总数和存储信息:class getname /关于字符类public:char file_namemax2;/文件名int n; /字符的种类int sum; /字符的总数name lettermax1; /存储字符信息的类的数 组getname()sum = 0;n = 0;
5、;定义编码类:class codenode/编码类public:char ch; /存储字符char save_codemax1; /存储编码;主要功能实现类:class functionpublic:getname l;int fn; /定义哈夫曼数组大小element huffmantmax3; /哈夫曼数组 codenode codemax1; /字符编码数组 function()fn = 0;;三、主要功能界面: 1、主界面:2、读取文章并对字符编码:3、哈弗曼编码信息:4、文章编码:5、文章译码:6、错误处理:四、总结(课设心得体会):三周的课程设计结束了,在这次的课程设计中不 仅检
6、验了我所学习的知识,也培养了我如何去 把握一件事情,如何去做一件事情,又如何完 成一件事情。在设计过程中,与同学分工设计, 和同学们相互探讨,相互学习,相互监督。学 会了合作,学会了运筹帷幄,学会了宽容,学 会了理解,也学会了做人与处世。 课程设计 是我们专业课程知识综合应用的实践训练,着 是我们迈向社会,从事职业工作前一个必不少 的过程.”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含 义.我今天认真的进行课程设计,学会脚踏实 地迈开这一步,就是为明天能稳健地在社会大 潮中奔跑打下坚实的基础 . 通过这次课程设 计,本人在多方面都有所提高。在这次设计过 程中,体现出自
7、己单独设计模具的能力以及综 合运用知识的能力,体会了学以致用、突出自 己劳动成果的喜悦心情,从中发现自己平时学 习的不足和薄弱环节,从而加以弥补。六、 附录(源代码): #include #include #include #include #define max1 150#define max2 50#define max3 256using namespace std;class element /结点类 public:char name;/字符名 int weight;/字符权值 int lchild;/左孩子 int rchild;/右孩子 int parent;/父结点 elemen
8、t()weight = 0;lchild = -1;rchild = -1;parent =-1;element();class codenode/编码类 public:char ch; /存储字符char save_codemax1; /存储编码 ;class name /字符类public:char pname;/字符名int num;/字符出现的次数 double lweight;/字符的权值 name()num = 0;lweight = 0;name();class getname /关于字符类public:char file_namemax2;/文件名int n; /字符的种类in
9、t 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 请输入文件名: file_name;input.open(file_name); /打开文件if (input.fail()cout 该文件不存在! endl; return 0;c
10、har 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+;sss +;sss = 1;if (tag = 0)n+;lettern.pname = ch;lettern.num+;sum+;sum-;input.close();getweight(); /得到字符权值;class fun
11、ctionpublic:getname l;int fn; /定义哈夫曼数组大小element huffmantmax3; /哈夫曼数组 codenode codemax1; /字符编码数组 function()fn = 0;void charhuffmantcoding()/编码功能实现 int i, f, c;char *cd = new char l.n+1; / 暂时存储编 码的数组int start; /编码读取起始位置cdl.n = 0;for (i = 0; i = 0) if (huffmantf.lchild = c)/ 如果为左 孩子,为0cd-start = 0;else
12、/如果为右孩子,为 1cd-start = 1;c = f;strcpy(codei.save_code, &cdstart); / 将结果存入对应的编码数组中void outputhuffmantcode()cout 哈夫曼编码: endl;cout endl;cout 字符tt 哈夫曼编码 endl;for (int i = 0; i l.n; i+)/ 输出字符,哈夫 曼编码cout endl;cout huffmant t t;cout codei.save_code;cout endl;cout endl;void initht()/哈夫曼初始化l.readletter(
13、);fn = (l.n)*2 - 1;for (int i = 0; i fn; i+)if (i l.n)huffmantl.letteri.pname;huffmanti.weightl.letteri.lweight;=void select_2min(int m, int &p1, int &p2)/ 选 择最小的两个节点int i;double m1, m2;m1 = m2 = 1;p1 = p2 = -1;for (i = 0; i m; i+)if (huffmanti.parent = -1 & huffmanti.weight m1)/ 找出未访问过的 权值最小节
14、点m2 = m1;p2 = p1;m1 = huffmanti.weight;p1 = i;else if (huffmanti.parent = -1 & huffmanti.weight m2)/ 找出未访问过的 权值第二小结点m2 = huffmanti.weight;p2 = i;void creatht()/建立哈夫曼树 /核心int i, p1, p2;initht();for (i = l.n; i fn; i+)select_2min(i, p1, p2);huffmantp1.parenthuffmantp2.parent = i;=huffmanti.weighthuffm
15、antp1.weighthuffmantp2.weight;huffmanti.lchild = p1;huffmanti.rchild = p2;int outarticlecode()/显示文章编码 ifstream input;input.open(l.file_name);if (input.fail()cout 文件不存在! endl; return 0;char ch;cout 文章编码如下: endl; while (!input.eof()ch = input.get();for (int i = 0; i l.n; i+)=+if (codei.ch = ch)cout co
16、dei.save_code;cout endl;input.close();int savearticlecode()/保存文章编码ofstream output;ifstream input;char namef1max2;input.open(l.file_name);if (input.fail()cout 该文件不存在! endl; return 0;cout 请输入保存文章编码的文件名: namef1;output.open(namef1);char ch;while (!input.eof()ch = input.get();for (int i = 0; i l.n; i+) i
17、f (codei.ch = ch)for(int j = 0; j strlen(codei.save_code); j+)output.put(codei.save_codej);input.close();output.close();cout 保存完毕! endl;int outtranscode() /文章译码操作ifstream input;char namefmax2;cout 请输入保存文章编码的文件名: namef;input.open(namef);if (input.fail()cout 该文件不存在! = 0)c = huffmantc.lchild;if (huffma
18、ntc.lchild = -1)/判断是 否到叶子cout = 0)c = huffmantc.rchild;if (huffmantc.rchild = -1)/判断是 否到叶子cout huffmant; /输出 字符c = 2 * l.n - 2; /返回根节点ch = input.get();cout endl;input.close();int savetranscode()/保存文章译码ofstream output;ifstream input;char namefmax2;char namef1max2;cout 请输入文章编码所在的文件名: namef;input
19、.open(namef);if (input.fail()cout 该文件不存在! endl; return 0;cout 请输入保存文章译码的文件名: namef1;output.open(namef1);char ch;ch = input.get();int c = 2 * l.n - 2;while (!input.eof()if (ch = 0)if (huffmantc.lchild = 0)c = huffmantc.lchild;if (huffmantc.lchild = -1)output.put(huffmant); c = 2 * l.n - 2;if (c
20、h = 1)if (huffmantc.rchild = 0)c = huffmantc.rchild;if (huffmantc.rchild = -1) output.put(huffmant); c = 2 * l.n - 2;ch = input.get();input.close();output.close();cout 保存完毕! endl;int main()function *a = new function; while (1) /主界面显示cout*endl;cout * 欢迎进入编 /译码系统*endl;cout*endl;coutendl;cout * 功
21、能如下:*endl;cout *1. 读取文章并对字符编码 *endl;cout *2. 哈夫曼编码信息 *endl;cout *3. 文章编码*endl;cout *4. 文章译码*endl;cout *5. 退出程序*endl;coutendl;char ch;cout 请选择功能:; cin ch;switch (ch)case 1:/读取文章并对字符编码 delete a;a = new function;system(cls);a-creatht();a-charhuffmantcoding(); cout 操作完毕! outputhuffmantcode();system(pause);system(cls);break;case 3:/文章编码system(cls);while (1)cout endl;cout 1.显示文章编 码 endl;cout 2.保存文章编 码 endl;cout 3.返回上一界 面 endl;char ch1;cout endl 请选择功 能:;cin ch1;switch (ch1)case 1:/显示文章编码system(cls);a-out
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大学食堂饭票管理办法
- 学校校外专家管理办法
- 家居门店资金管理办法
- 2025年综合类-专业综合第十二章其他-专业综合第十二章其他-专业综合第三章消化系统历年真题摘选带答案(5卷单选100题合辑)
- 大型农场制度管理办法
- 学校评价管理办法试行
- 2025年综合类-SMT(表面贴装技术)工程师-SMT工艺工程师历年真题摘选带答案(5卷单选100题合辑)
- 2025年环保气象安全技能考试-净水工历年参考题库含答案解析(5套共100道单选合辑)
- 山东雨水灌溉管理办法
- 安全检查评价管理办法
- 新概念英语1册课文完整版
- WB/T 1092-2018钢铁物流包装、标识规范
- SC/T 3503-2000多烯鱼油制品
- GB/T 18109-2011冻鱼
- 清真食堂承包投标书
- 《数据科学与大数据技术导论》完整版课件(全)
- 马克思主义的世界观和方法论
- 医院处方笺-模板
- 道路综合巡查工作流程
- 模具试模通知单
- 香港联合交易所有限公司证券上市规则
评论
0/150
提交评论