版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 劳务合同样本2024年
- 电子加工承揽合同样本
- 总包商分包支付委托保证(参考)
- 建筑公司用工劳动合同
- 二手设备出售合同范本
- 买卖居间服务合同模板2024年
- 中外合作经营合同书示例
- 二手机动车买卖协议范本
- 公私合营学校创办协议
- 购房合同范本标准汇编
- 推进农村一二三产业融合发展的路径和着力点
- 消防警示标识与安全标示标牌
- 胃早癌-经典课件
- 2023精编幼儿园家园共育课件
- 火灾逃生与自救技能培训
- 劳务派遣劳务外包服务方案(技术方案)
- 专题一:如何问题导学型学本课堂课件
- 国际经济与贸易专业生涯人物访谈报告
- 苏教版数学五年级上册全册教学反思(版本1)
- 创伤伤口包扎术(加压包扎止血法)技术操作考核评分标准
- 被执行人执行和解申请书
评论
0/150
提交评论