版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、压缩软件课程设计书1、 问题描述:建立一个文本文件,统计该文件中各字符频率,对各字符进行Huffman编码,将该文件至翻译成Huffman编码文件,再将Huffman编码文件翻译成原文件。 2、 算法分析及思路:对于该问题,我们做如下分析:(1) 首先得构造出哈弗曼树,我们用函数HuffmanTree(int w,int s,int n)设计;(2) 在构建哈弗曼树的基础上,进一步实现哈弗曼编码问题,我们用函数Huffmancode(char wen)设计;(3) 实现哈弗曼编码后再进一步实现哈弗曼译码问题,我们用函数Huffmandecode()设计;(4) 其中编码问题中,得进一步统计出各
2、个字符在文件中的频率,并进行一些必要的标记,我们用函数runhuffman(char wen)设计;(5) 在译码过程中,还有必要的一步是比较原文件与译码后的文件是否相同,我们用函数compare(char wen)设计;(6) 其中的文件输入我们用到类”fstream.h”中的输入输出流,并在运行的文件夹中建立一个文件名为逍遥游的文本文件,且在逍遥游文件中输入需要编码的数据。3、 主要解决的设计问题:1.写一个对txt文件压缩和解压的程序,使用动态编码。2.使用Huffman编码压缩和解压时,Huffman树的存储可以直接存储树结构,也可以存储所有字符的频度或权值,然后读取时建立Huffma
3、n树;3.使用Huffman编码压缩和解压时,注意定义压缩码的结束标记,可以使用一个特殊的字符作为结束标记,也可以在压缩码之前存储其比特长度;如果使用一个特殊字符作为结束标记,则其频度为1,需要在建立Huffman树时把它看作一个独立的字符进行建树。4.使用Huffman编码压缩和解压时,在一个缓冲区里面收集压缩码比特流,每当收集的比特数满8时,可以把这8比特通过位操作合并成一个字节写入文件(当然也可以收集满一定数目的字节后再写入文件)。写入文件的最小信息单位为字节。四、程序设计的流程图:统计字符,得出统计出的字符的权值n根据权值进行建立哈弗曼树输出哈弗曼树生成二进制文件主函数编码输出编码压缩
4、编码解码解压生成新的文本文档退出建立哈弗曼树输出哈弗曼树根据哈弗曼树编码根据哈弗曼树解码对二进制文件进行解压生成文本文档输出编码对编码进行压缩生成二进制文件五、输入和输出说明:1、数据输入:由文件input.txt提供输入需要压缩的内容;2、结果输出:将压缩好的文件内容输出到编码后的文件.txt中,再由编码后的文件.txt解压到译码后的文件.txt中。6、 程序及其注解:1、数据结构设计(即类的设计,包括类的数据成员、函数成员)类的设计用HuffmanTree.h保存如下:#include<iostream>#include<fstream>using namespac
5、e std;const int MaxSize=512;/-struct element /哈夫曼树的结点int str; /记录字符在数组中的位置int weight; /字符出现频率(权值)int lchild,rchild,parent; /哈夫曼树各个指针变量char bits30; /存储哈夫曼编码的数组;/-class HuffmanTreeelement hufftreeMaxSize; /存放哈夫曼树结点的数组int num; /结点数public:HuffmanTree(int w,int s,int n);void Select(int n,int &s1,int
6、&s2);void Huffmancode(char wen); /哈夫曼编码 void Huffmandecode(); /哈夫曼译码;/-class Runpublic:void huffman(char wen);/将编码后的文件译成原文件void runhuffman(char wen); /统计各字符频率void compare(char wen); /比较逍遥游文件和译码后的文件;/-2、算法设计(类的函数成员的具体设计)(1)算法一设计用HuffmanTree.cpp保存如下:#include<iostream>#include"HuffmanTre
7、e.h"using namespace std;/-void HuffmanTree:Select(int n,int &s1,int &s2)s1=-1;s2=-1;for(int i=0;i<=n;i+)if(hufftreei.parent=-1) if(s1=-1) s1=i;continue; if(s2=-1) s2=i;continue; if(hufftreei.weight<hufftrees1.weight)s1=i; else if(hufftreei.weight<hufftrees2.weight)s2=i;/-Huffma
8、nTree:HuffmanTree(int w,int s,int n) num=n;int i1,i2;i1=i2=0;for(int i=0;i<2*num-1;i+)/外部叶子结点数为num个时,内部结点数为n-1,整个哈夫曼树的需要的结点数为2*num-1.hufftreei.parent=-1;hufftreei.lchild=-1;hufftreei.rchild=-1;for(int j=0;j<num;j+)hufftreej.weight=wj;hufftreej.str=sj;for(int k=num;k<2*num-1;k+) /构建哈夫曼树Selec
9、t(k-1,i1,i2); /在hufftree中找权值最小的两个结点i1和i2 hufftreei1.parent=k;hufftreei2.parent=k;hufftreek.weight=hufftreei1.weight+hufftreei2.weight;hufftreek.lchild=i1;hufftreek.rchild=i2;/-void HuffmanTree:Huffmancode(char wen)ifstream in(wen);ofstream out("编码后的文件.txt");int start=MaxSize-1;int cha=0;ch
10、ar cdMaxSize; /存放一个编码cdMaxSize-1='0'for(int i=0;i<num;i+) start=MaxSize-1;int c,f;for(c=i,f=hufftreei.parent;f!=-1;c=f,f=hufftreef.parent)if(hufftreef.lchild=c) /置左分支编码0cd-start='0'else cd-start='1' /置右分支编码1strcpy(hufftreei.bits,&cdstart);/将编码存放在相应结点存储哈夫曼编码的数组中cout<
11、<"字符在数组中的下标及其编码如下:" /输出字符在数组中的位置及其编码for(int k=0;k<num;k+)if(k%3=0) cout<<endl;cout<<hufftreek.str<<":"<<hufftreek.bits<<'t'cout<<endl<<endl; for(char ch;in.get(ch);) /将逍遥游文件中各个字符转变成相应的编码,写入编码后的文件中if(int)ch<0) cha=(int)ch+
12、256;else cha=(int)ch;for(int j=0;j<num;j+)if(hufftreej.str=cha)out<<hufftreej.bits;cout<<"编码成功!"<<endl;/-void HuffmanTree:Huffmandecode()ifstream in("编码后的文件.txt");ofstream out("译码后的文件.txt");int i=2*num-2;for(char b;in>>b;) if(b='0')i=h
13、ufftreei.lchild;else i=hufftreei.rchild;if(hufftreei.lchild=-1)out<<(char)hufftreei.str;i=2*num-2;cout<<"译码成功!"<<endl;/-(2)算法二设计用HuffmanRun.cpp保存如下:#include<iostream>#include"HuffmanTree.h"using namespace std;/-void Run:runhuffman(char wen)ifstream in(wen)
14、;int wMaxSize;int weightMaxSize; /存放各个字符的频率int strMaxSize; /存放逍遥游文件中各个字符在数组w中的位置(下标)int i=0;int n=0;int cha=0;for(int j=0;j<MaxSize;j+)wj=0;/*从文件逍遥游中依次读入字符,根据字符的ASCII码值将字符存入str数组的相应位置 而weight数组的相应位置则记录该字符出现的频率*/for(char ch;in.get(ch);) if(int)ch<0) cha=(int)ch+256; /中文的ASCII码值为负数,加上256使其可以存放在数
15、组中else cha=(int)ch;wcha+;for(int k=0;k<MaxSize;k+)if(wk!=0)strn=k;weightn=wk;n+;cout<<"字符在数组中的下标及其权值如下:" /输出字符在数组中的位置及其权值for(int p=0;p<n;p+)if(p%6=0)cout<<endl;cout<<strp<<":"<<weightp<<'t'cout<<endl<<endl;HuffmanTree
16、h(weight,str,n); /构造哈夫曼树h.Huffmancode(wen); /利用哈夫曼树进行编码及译码h.Huffmandecode();/-void Run:huffman(char wen)ifstream in(wen);int weightMaxSize; /存放各个字符的频率int strMaxSize; /存放逍遥游文件中各个字符在数组w中的位置(下标)int n=0;HuffmanTree h(weight,str,n); /构造哈夫曼树h.Huffmandecode();void Run:compare(char wen)ifstream ina(wen);ifs
17、tream inc("译码后的文件.txt"); char stringa100000;int i=0;int flag=0;char stringc100000;int j=0; for(char cha;ina>>cha;) /将文件逍遥游的内容读入数组stringastringai=cha;i+;stringai='0'for(char chc;inc>>chc;) /将译码后的文件内容读入数组stringcstringcj=chc;j+;stringcj='0'/*比较文件逍遥游和译码后的文件内容,若相同则说明
18、编码正确,若不同, 则说明编码错误*/for(int k=0;stringak!='0'&&stringck!='0'k+) if(stringak!=stringck) flag=0;if(stringak='0'&&stringck='0') flag=1;else flag=0; if(flag=0)cout<<"逍遥游文件与译码后的文件不相同,编码错误!"<<endl;elsecout<<"逍遥游文件与译码后的文件相同,编码正确!"<<endl;/-(3)实现算法设计的主程序用HaffmanMain.cpp保存如下:#include<iostream>#include"HuffmanTree.h"using namespace std;void main()char
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年农产品追溯体系优化建议
- 2026年会计电算化实操考核试题题库及答案
- 2025 年中考数学押题预测卷解析版(山东青岛卷)
- 金属屋面安装方案
- 食品检验室清洗消毒和维修保养制度
- 康复学基础练习题库(含参考答案)
- 化工企业甲醛泄漏中毒应急演练脚本
- 消防设施防晒防雨操作和维护保养规程
- 流量计检修规程
- 2026年江苏省扬州市网格员招聘考试参考题库及答案解析
- IT项目外包人员管理制度
- 小红书种草营销师模拟题及答案(单选+多选+判断)
- 粮油食材配送投标方案(大米食用油食材配送服务投标方案)(技术方案)
- 新解读《JTGT 3660-2020公路隧道施工技术规范》
- JTG-H30-2015公路养护安全作业规程
- 采用矿山法、盾构法、顶管法施工的隧道、洞室工程
- MH-T 5059-2022民用机场公共信息标识系统设置规范
- 思皓E10X保养手册
- 安全监理考试题库
- 市政道路改造管网施工组织设计
- 海外项目科技技术管理探讨汇报材料
评论
0/150
提交评论