哈弗曼编码课程设计实验报告_第1页
哈弗曼编码课程设计实验报告_第2页
哈弗曼编码课程设计实验报告_第3页
哈弗曼编码课程设计实验报告_第4页
哈弗曼编码课程设计实验报告_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录一、 实训要求.2二、 课题分析和设计.21、 基本需求分析2,32、 对应的类.3,4,5三、 主要功能界面.51、 主界面52、 读取文章并对字符编码53、 哈弗曼编码信息.64、 文章编码.65、 文章译码.66、 错误处理.7四、 总结(课设心得体会)7五、 附录(主要函数代码)714一、实训要求1、输入为:一段中文或英文的文章的文件名。2、读取文章的字符信息。3、对字符进行权值的计算。4、根据权值构造哈弗曼树。5、生成对应的编码。6、输出为:原文章的编译(译文)。7、根据已经生成的编码表,输入任意的译文可以得到原文。二、课题分析和设计1.基本需求分析:(1)在通信过程中,为了提高

2、信道利用率,缩短信息传输时间降低传输成本,需要一编译码器。(2)此哈弗曼编码译码器应具有编码译码的双向功能,即在发送端通过编码系统对传入的数据进行编码。(3)在接收端将数据译码,将具有两项功能的编码译码器用于双工信道就可满足,双工信道的双向编译功能。 (4)输入某段报文是,系统将自己完成编译输出。(5)、程序设计流程:<1>文字表述:开始进入功能选择界面,包含五种操作(1) 读取文章并对字符编码。(2) 哈夫曼编码信息。(3) 文章编码。(4) 文章译码。(5) 退出程序。<2>操作:(1) 给定一篇文章,统计字符出现的概率,并根据概率建立哈弗曼树,并利用哈弗曼树对字符

3、进哈夫曼编码。(2) 显示哈弗曼编码信息,包括字符和其哈弗曼编码。(3) 对文章进行译码,显示译码信息,并保存。(4) 对文章进行译码,显示并保存。<3>流程图:程序开始返回主界面显示编码保存译码程序主界面显示译码返回主界面保存编码 退出程序 文章译码 文章编码哈夫曼编码信息读取文章并对文章进行编码2、 对应的类:<1>定义类:class Element /结点类 public:char name;/字符名int weight;/字符权值int lchild;/左孩子int rchild;/右孩子int parent;/父结点Element()weight = 0;lc

4、hild = -1;rchild = -1;parent =-1;Element();<2>定义字符和出现的次数:class Name /字符类public:char pname;/字符名int num;/字符出现的次数double lweight;/字符的权值Name()num = 0;lweight = 0;Name();<3>定义字符总类总数和存储信息:class GetName /关于字符类 public:char file_namemax2;/文件名int n; /字符的种类int sum; /字符的总数Name lettermax1; /存储字符信息的类的数

5、组GetName()sum = 0;n = 0;;<4>定义编码类:class CodeNode/编码类 public:char ch; /存储字符char save_codemax1; /存储编码; <5>主要功能实现类:class Function public: GetName L;int fn; /定义哈夫曼数组大小Element HuffmanTmax3; /哈夫曼数组CodeNode Codemax1; /字符编码数组Function()fn = 0;;3、 主要功能界面:1、 主界面:2、 读取文章并对字符编码:3、 哈弗曼编码信息:4、 文章编码:5、

6、文章译码:6、 错误处理:4、 总结(课设心得体会):三周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。 课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础

7、. 通过这次课程设计,本人在多方面都有所提高。在这次设计过程中,体现出自己单独设计模具的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。六、 附录(源代码):#include <iostream>#include <fstream>#include <string.h>#include <windows.h>#define max1 150#define max2 50#define max3 256using namespace std;class Element /结

8、点类 public:char name;/字符名int weight;/字符权值int lchild;/左孩子int rchild;/右孩子int parent;/父结点Element()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 =

9、 0;lweight = 0;Name();class GetName /关于字符类public:char file_namemax2;/文件名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

10、<< "请输入文件名:" << endl;cin >> file_name;input.open(file_name); /打开文件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 =

11、 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 Functionpublic:GetName L;int fn; /定义哈夫曼数组大小Element HuffmanTmax3; /哈夫曼数组CodeNode Codemax1; /字符编码数组Function()fn = 0;void CharHuffmanTC

12、oding()/编码功能实现int i, f, c;char *cd = new char L.n+1; /暂时存储编码的数组int start; /编码读取起始位置cdL.n = '0'for (i = 0; i < L.n; i+)Codei.ch = HuffmanT; /字符信息start = L.n; /起始位置c = i;while (f = HuffmanTc.parent) >= 0)if (HuffmanTf.lchild = c)/如果为左孩子,为0cd-start = '0'else/如果为右孩子,为1cd-star

13、t = '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 << "&

14、quot; << endl;cout << HuffmanT << "t"<< "t"cout << Codei.save_code;cout << endl;cout << "" << endl;void InitHT()/哈夫曼初始化L.ReadLetter();fn = (L.n)*2 - 1;for (int i = 0; i < fn; i+)if (i < L.n)HuffmanT = L.l

15、etteri.pname;HuffmanTi.weight = L.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)/找出未访问过的权值最小节点m2 = m1;p2 = p1;m1 = HuffmanTi.weight;p1 = i;

16、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.parent = HuffmanTp2.parent = i;HuffmanTi.weight = HuffmanTp1.weight + HuffmanTp2

17、.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

18、< L.n; i+)if (Codei.ch = ch)cout << Codei.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 << "请输入保存文章编码的文件名:

19、" << endl;cin >> namef1;output.open(namef1);char ch;while (!input.eof()ch = input.get();for (int i = 0; i < L.n; i+)if (Codei.ch = ch)for (int j = 0; j < strlen(Codei.save_code); j+)output.put(Codei.save_codej);input.close();output.close();cout << "保存完毕!" <&

20、lt; endl;int OutTransCode() /文章译码操作ifstream input;char namefmax2;cout << "请输入保存文章编码的文件名:" << endl;cin >> namef;input.open(namef);if (input.fail()cout << "该文件不存在!" << endl;return 0;char ch;ch = input.get();int c = 2 * L.n - 2;while (!input.eof()if (ch

21、 = '0')/遇0搜索左子树if (HuffmanTc.lchild >= 0)c = HuffmanTc.lchild;if (HuffmanTc.lchild = -1)/判断是否到叶子cout << HuffmanT; /输出字符c = 2 * L.n - 2; /返回根节点if (ch = '1')/遇1搜索右子树if (HuffmanTc.rchild >= 0)c = HuffmanTc.rchild;if (HuffmanTc.rchild = -1)/判断是否到叶子cout << HuffmanT

22、; /输出字符c = 2 * L.n - 2; /返回根节点ch = input.get();cout << endl;input.close();int SaveTransCode()/保存文章译码ofstream output;ifstream input;char namefmax2;char namef1max2;cout << "请输入文章编码所在的文件名:" << endl;cin >> namef;input.open(namef);if (input.fail()cout << &quo

23、t;该文件不存在!" << endl;return 0;cout << "请输入保存文章译码的文件名:" << endl;cin >> 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)outpu

24、t.put(HuffmanT);c = 2 * L.n - 2;if (ch = '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 F

25、unction;while (1) /主界面显示cout<<" *"<<endl;cout<<" *欢迎进入编/译码系统*"<<endl;cout<<" *"<<endl;cout<<endl;cout<<" *功能如下:*"<<endl;cout<<" *1.读取文章并对字符编码*"<<endl;cout<<" *2.哈夫曼编码信息*&quo

26、t;<<endl;cout<<" *3.文章编码*"<<endl;cout<<" *4.文章译码*"<<endl;cout<<" *5.退出程序*"<<endl;cout<<endl;char ch;cout << "=>>请选择功能:"cin>> ch;switch (ch)case '1':/读取文章并对字符编码delete a;a = new Function;s

27、ystem("cls");a->CreatHT();a->CharHuffmanTCoding();cout << "操作完毕!" << endl;system("pause");system("cls");break;case '2':/哈夫曼编码信息system("cls");a->OutputHuffmanTCode();system("pause");system("cls");break;

28、case '3':/文章编码system("cls");while (1)cout << endl;cout << "=>>1.显示文章编码" << endl;cout << "=>>2.保存文章编码" << endl;cout << "=>>3.返回上一界面" << endl;char ch1;cout << endl << "=>>

29、请选择功能:"cin >> ch1;switch (ch1)case '1':/显示文章编码system("cls");a->OutArticleCode();system("pause");system("cls");continue;case '2':/保存文章编码system("cls");a->SaveArticleCode();system("pause");system("cls");continue;case '3':/返回上一界面break;default:system("cls");cout << "输入

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论