文件压缩与解压实验报告.doc

文件压缩与解压实验报告.doc

ID:55146122

大小:414.01 KB

页数:28页

时间:2020-04-28

上传者:简单2019
文件压缩与解压实验报告.doc_第1页
文件压缩与解压实验报告.doc_第2页
文件压缩与解压实验报告.doc_第3页
文件压缩与解压实验报告.doc_第4页
文件压缩与解压实验报告.doc_第5页
资源描述:

《文件压缩与解压实验报告.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

学生姓名学号专业年级、班级课程名称实验3实验项目文本解压与压缩实验时间年月日实验指导老师实验评分院系:计算机学院实验课程:实验3实验项目:文本压缩与解压指导老师:开课时间:2010~2011年度第1学期专业:班级:学生:学号:27 学生姓名学号专业年级、班级课程名称实验3实验项目文本解压与压缩实验时间年月日实验指导老师实验评分一、需求分析1.本程序能够实现将一段由大写字母组成的内容转为哈弗曼编码的编码功能以及将哈弗曼编码翻译为字符的译码功能。2.友好的图形用户界面,直观明了,每一个操作都有相应的提示,用户只需按着提示去做,便能轻松实现编码以及译码的效果,编码及译码结果都被保存成txt文档格式,方便用户查看。3.本程序拥有极大的提升空间,虽然现在只能实现对大写字母的译码以及编码,但通过改进鉴别的算法,即能够实现小写字母乃至其他特殊符号等的编码。4.本程序可用于加密、解密,压缩后文本的大小将被减小,更方便传输5.程序的执行命令包括:1)初始化2)编码3)译码4)印代码文件5)印哈弗曼树6)退出6.测试数据(1)THISPROGRAMISMYFAVOURITE(2)THISISMYFAVOURITEPROGRAMBUTTHEREPORTISNOT二、概要设计为实现上述功能,应有哈弗曼结点,故需要一个抽象数据类型。1.哈弗曼结点抽象数据类型定义为:ADTHaffTree{数据对象:HaffNode*ht,HaffCode*hc基本操作:Haffman(intw[],intn)操作结果:构造哈弗曼树及哈弗曼编码,字符集权值存在数组w,大小为nsetdep()setdep(intp,intl)操作结果:利用递归,p为哈弗曼节点序号,l为哈弗曼节点深度setloc()操作结果:设置哈弗曼节点坐标,用以输出到界面setloc2()操作结果:设置哈弗曼节点坐标,用以输出到文本,默认状态下不启用}ADTHaffTree2.本程序包含4个模块1)主程序模块:接受用户要求,分别选择执行①初始化②编码③译码④印代码文件⑤印哈弗曼树27 学生姓名学号专业年级、班级课程名称实验3实验项目文本解压与压缩实验时间年月日实验指导老师实验评分⑥退出2)哈弗曼树单元模块——建立哈弗曼树3)哈弗曼编码单元模块——进行哈弗曼编码、译码4)响应用户操作,输出内容到界面或文本各模块之间的关系如下:主程序控制模块建立哈弗曼树进行哈弗曼编码、译码输出内容到界面或文件三、详细设计1.全局变量、结点intm_gcharnum;//记录字符集大小全局变量intt;//用于输入框弹出次数的计数int*w;//用于存储各个字符权值的数组intx;//用于计算各个哈弗曼结点x坐标的全局变量intinitswitch;//用于判断是否已经进行了初始化操作intprinttree;//用于判断哈弗曼树是否已经生成的操作HaffTreeHF;//哈弗曼树类structHaffNode{intweight;//记录结点权值intparent;//记录结点双亲序号intlchild;//记录结点左孩子序号intrchild;//记录结点右孩子序号intx;//记录x坐标inty;//记录y坐标intdep;//记录深度27 学生姓名学号专业年级、班级课程名称实验3实验项目文本解压与压缩实验时间年月日实验指导老师实验评分intsn;//记录空格个数intk;//0为左孩子,1为右孩子,-1为根strings;};structHaffCode{intbit[28];//记录各结点的哈弗曼编码intstart;//记录遍历哈弗曼树的起始位置intweight;//记录结点权值};2.哈弗曼树的实现//函数名:Haffman//功能:生成哈弗曼树,为每一个哈弗曼结点生成哈弗曼编码//函数参数:intw[]引入各个字符的权值//intn字符集大小voidHaffTree::Haffman(intw[],intn){inti,j,m1,m2,x1,x2;//m1,m2表示最小、次小x1,x2表示左右孩子for(i=0;i<2*n-1;i++)//进行初始化操作,记录权值{if(is;intk;inti=2*m_gcharnum-2;while(!s.empty()||i!=-1)//如果栈不为空且序号不为-1{27 学生姓名学号专业年级、班级课程名称实验3实验项目文本解压与压缩实验时间年月日实验指导老师实验评分while(i!=-1){s.push(i);//入栈i=ht[i].lchild;//获取左孩子的序号}if(!s.empty()){k=s.top();//出栈s.pop();if(k!=-1){ht[k].x=x+f*10;ht[k].y=ht[k].dep*30;}i=ht[k].rchild;//获取右孩子的序号}f++;}}}///////////////////////////////////////////////////////////////////////////函数名:setloc2,利用层次遍历思想实现//功能:为各个哈弗曼结点确定坐标,以输出到文档//函数参数:无voidHaffTree::setloc2(){if(initswitch==1){queueq;intk=2*m_gcharnum-2;ht[k].sn=1024;//设置第一个结点的空格值为1024个ht[k].k=-1;//标记第一个结点为根结点intd0=11;intd=1;intp;if(k!=-1){q.push(k);//入队}27 学生姓名学号专业年级、班级课程名称实验3实验项目文本解压与压缩实验时间年月日实验指导老师实验评分while(!q.empty()){while(d<=d0){if(!q.empty()){p=q.front();}//出队else{d++;break;}if(d==ht[p].dep)//如果d不等于当前深度,先不出队{if(d!=1){if(ht[p].k==0)//计算左孩子空格个数{ht[p].sn=ht[ht[p].parent].sn-1024/pow(2,ht[p].dep-1);}if(ht[p].k==1)//计算右孩子空格个数{ht[p].sn=ht[ht[p].parent].sn+1024/pow(2,ht[p].dep-1);}q.pop();}else{q.pop();}if(ht[p].lchild!=-1){q.push(ht[p].lchild);}//左孩子入队if(ht[p].rchild!=-1){q.push(ht[p].rchild);}//右孩子入队}else{d++;}}}}}2)程序主界面某些函数的实现:///////////////////////////////////////////////////////////////////////////函数名:CP3View::OnDraw()//功能:画图27 学生姓名学号专业年级、班级课程名称实验3实验项目文本解压与压缩实验时间年月日实验指导老师实验评分//函数参数:CDC*pDCvoidCP3View::OnDraw(CDC*pDC){CP3Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedatahereCRectrect;GetClientRect(rect);///取得客户区域pDC->FillRect(rect,&m_brushBackground);///用背景画刷填充区域OnEraseBkgnd(pDC);CPenpenblack;//定义画笔CBrushbrush1;//定义画刷COLORREFoldbackcolor=RGB(255,255,255);//获取背景颜色penblack.CreatePen(PS_SOLID,2,RGB(255,0,0));//为画笔设定大小和颜色pDC->SelectObject(&penblack);brush1.CreateSolidBrush(oldbackcolor);//为画刷设定颜色pDC->SelectObject(&brush1);if(printtree==1)//如果显示树的按钮已被按下,则执行下面的内容{HF.setloc();//设置各个节点坐标//利用非递归中序遍历思想画图stacks;建栈intk;inti=2*m_gcharnum-2;while(!s.empty()||i!=-1){while(i!=-1){s.push(i);//入栈i=HF.ht[i].lchild;//获取左孩子序号}if(!s.empty()){k=s.top();//出栈s.pop();if(k!=-1){CStringstr(HF.ht[k].s.data());//获取当前哈弗曼结点的数据27 学生姓名学号专业年级、班级课程名称实验3实验项目文本解压与压缩实验时间年月日实验指导老师实验评分pDC->TextOut(HF.ht[k].x,HF.ht[k].y,str);//输出str的值}i=HF.ht[k].rchild;//获取右孩子序号//////////////////////////////////////////////////画线用if(HF.ht[k].lchild!=-1){pDC->MoveTo(HF.ht[k].x+4,HF.ht[k].y);pDC->LineTo(HF.ht[HF.ht[k].lchild].x+4,HF.ht[HF.ht[k].lchild].y);}if(HF.ht[k].rchild!=-1){pDC->MoveTo(HF.ht[k].x+4,HF.ht[k].y);pDC->LineTo(HF.ht[HF.ht[k].rchild].x+4,HF.ht[HF.ht[k].rchild].y);}//////////////////////////////////////////////////}}}}///////////////////////////////////////////////////////////////////////函数名:CP3View::OnHandinput//功能:执行手动输入操作//函数参数:CDC*pDCvoidCP3View::OnHandinput(){//TODO:Addyourcommandhandlercodehereifstreamfip("HaffmanTree.txt");//利用文件流打开文件inti;if(!fip)//判断文件HaffmanTree.txt是否已经存在,若存在,则自动读取,若不存在,则手动输入{fip.close();fstreamfop("HaffmanTree.txt",ios::out);//以写方式打开文件DINITdint;//打开输入字符集大小对话框dint.DoModal();if(m_gcharnum!=0)27 学生姓名学号专业年级、班级课程名称实验3实验项目文本解压与压缩实验时间年月日实验指导老师实验评分{t=0;DBLANKWdblankw;//打开输入空格权值对话框dblankw.DoModal();t++;for(t=1;t>m_gcharnum;//读取字符集大小charc[4];HF.ht=newHaffNode[2*m_gcharnum-1];HF.hc=newHaffCode[m_gcharnum];w=newint[m_gcharnum];for(i=0;i>c;HF.ht[i].s=c;}fip>>w[i];//读取字符权值赋给w数组fip>>HF.ht[i].parent;//读取双亲序号fip>>HF.ht[i].lchild;//读取左孩子序号fip>>HF.ht[i].rchild;//读取右孩子序号}HF.Haffman(w,m_gcharnum);//生成哈弗曼树fip.close();//关闭文件}AfxMessageBox("初始化成功!");initswitch=1;}///////////////////////////////////////////////////////////////////////函数名:CP3View::OnEncodinghinput//功能:执行编译手动输入操作//函数参数:CDC*pDCvoidCP3View::OnEncodinghinput(){//TODO:Addyourcommandhandlercodehereif(initswitch==1)//判断是否已经初始化{DTOBETRAINdtbt;//打开手动输入对话框dtbt.DoModal();}else{AfxMessageBox("您尚未执行初始化操作!请先执行初始化操作!");}}///////////////////////////////////////////////////////////////////////函数名:CP3View::OnEncodingainput//功能:执行自动编码//函数参数:CDC*pDCvoidCP3View::OnEncodingainput(){//TODO:Addyourcommandhandlercodehere27 学生姓名学号专业年级、班级课程名称实验3实验项目文本解压与压缩实验时间年月日实验指导老师实验评分if(initswitch==1)//判断是否已经初始化{CStringm_path1,m_path2;//m_path1记录需要编码文件的路径,m_path2记录编码完成后文件的保存路径stringcmp;chartemp;AfxMessageBox("请选择要编码的文件的位置!");CFileDialoghFileDlg(true,NULL,NULL,OFN_FILEMUSTEXIST|OFN_READONLY|OFN_PATHMUSTEXIST,TEXT("文档文本(*.txt)|*.txt|所有文件(*.*)|*.*|"),NULL);if(hFileDlg.DoModal()==IDOK){m_path1=hFileDlg.GetPathName();//获取编码文件路径UpdateData(FALSE);}ifstreamldf(m_path1,ios::in);//以读方式打开文件AfxMessageBox("请选择代码文件的保存位置!");CFileDialoghFileDlg1(false,NULL,NULL,OFN_FILEMUSTEXIST|OFN_READONLY|OFN_PATHMUSTEXIST,TEXT("文档文本(*.txt)|*.txt|所有文件(*.*)|*.*|"),NULL);if(hFileDlg1.DoModal()==IDOK){m_path2=hFileDlg1.GetPathName();UpdateData(FALSE);}ofstreamsff(m_path2);//以写方式打开文件while((temp=ldf.get())!=EOF){cmp=temp;inti=0,j=0;if(temp==' ')//判断是否为回车{sff<<' ';}else{if(temp==0x20)//判断是否为空格{i=0;}else{while(cmp!=HF.ht[i].s)i++;}for(j=HF.hc[i].start+1;jq;intp;inti=0;intd=1;intt1=0,t2=0;intd0=11;intk=2*m_gcharnum-2;if(k!=-1){q.push(k);}while(!q.empty()){while(d<=d0){if(!q.empty()){p=q.front();t2=HF.ht[p].sn;}else{d++;break;}27 学生姓名学号专业年级、班级课程名称实验3实验项目文本解压与压缩实验时间年月日实验指导老师实验评分if(d==HF.ht[p].dep){for(t1;t1s;//建栈intk;inti=2*m_gcharnum-2;while(!s.empty()||i!=-1){while(i!=-1){s.push(i);i=HF.ht[i].rchild;//获取右孩子序号}if(!s.empty()){k=s.top();s.pop();if(k!=-1){27 学生姓名学号专业年级、班级课程名称实验3实验项目文本解压与压缩实验时间年月日实验指导老师实验评分for(intf=0;f<6*(HF.ht[k].dep-1);f++)saf<<"";//输出空格saf<<"…"<

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭