院系:计算机学院实验课程:实验3实验项目:文本压缩与解压指导老师:开课时间:2010 ~ 2011年度第 1学期专业:班级:学生:学号:一、需求分析1.本程序能够实现将一段由大写字母组成的内容转为哈弗曼编码的编码功能以及将哈弗曼编码翻译为字符的译码功能。
2.友好的图形用户界面,直观明了,每一个操作都有相应的提示,用户只需按着提示去做,便能轻松实现编码以及译码的效果,编码及译码结果都被保存成txt 文档格式,方便用户查看。
3.本程序拥有极大的提升空间,虽然现在只能实现对大写字母的译码以及编码,但通过改进鉴别的算法,即能够实现小写字母乃至其他特殊符号等的编码。
4.本程序可用于加密、解密,压缩后文本的大小将被减小,更方便传输5.程序的执行命令包括:1)初始化 2)编码 3)译码 4)印代码文件 5)印哈弗曼树 6)退出6.测试数据(1)THIS PROGRAM IS MY FAVOURITE(2)THIS IS MY FAVOURITE PROGRAMBUT THE REPORT IS NOT二、概要设计为实现上述功能,应有哈弗曼结点,故需要一个抽象数据类型。
1.哈弗曼结点抽象数据类型定义为:ADT HaffTree{数据对象:HaffNode* ht,HaffCode* hc基本操作:Haffman(int w[],int n)操作结果:构造哈弗曼树及哈弗曼编码,字符集权值存在数组w,大小为nsetdep()setdep(int p,int l)操作结果:利用递归,p为哈弗曼节点序号,l为哈弗曼节点深度setloc()操作结果:设置哈弗曼节点坐标,用以输出到界面setloc2()操作结果:设置哈弗曼节点坐标,用以输出到文本,默认状态下不启用} ADT HaffTree2.本程序包含4个模块1)主程序模块:接受用户要求,分别选择执行①初始化②编码③译码④印代码文件⑤印哈弗曼树⑥退出2)哈弗曼树单元模块——建立哈弗曼树3)哈弗曼编码单元模块——进行哈弗曼编码、译码4)响应用户操作,输出内容到界面或文本各模块之间的关系如下:三、详细设计1.全局变量、结点int m_gcharnum;弗曼树的实现eight=w[i];elseht[i].weight=0;arent=0;child=-1;child=-1;eight<m1&&ht[j].parent==0)ei ght;x1=j;}else if(ht[j].weight<m2&&ht[j].parent==0)eight;x2=j;}}ht[x1].parent=n+i;ht[x2].parent=n+i;ht[n+i].weight=ht[x1].weight+ht[x2].weight;ht[n+i].lchild=x1;ht[ht[n+i].lchild].k=0;child=x2;ht[ht[n+i].rchild].k=1;eight;child=i;parent=ht[child].parent;while(parent!=0)child==child)[]=0;else[]=1;;child=parent;parent=ht[child].parent;}for(j=+1;j<n;j++){ hc[i].bit[j]=[j];}tart=;hc[i].weight=;}}3.主函数和其他函数的实现1)哈弗曼树类的成员函数的实现:child,l+1);ht[p].dep=l;setdep(ht[p].rchild,l+1);}}child;=x+f*10;ht[k].y=ht[k].dep*30;}i=ht[k].rchild;n=1024;=-1;ep)==0)n=ht[ht[p].parent].sn-1024/pow(2 ,ht[p].dep-1);}if(ht[p].k==1)n=ht[ht[p].parent].sn+1024/pow(2,ht[p].dep-1);}();}else{ ();}if(ht[p].lchild!=-1){ (ht[p].lchild);}child!=-1){(ht[p].rchild);}child;);,[k].y,str);child;child!=-1){pDC->MoveTo[k].x+4,[k].y);pDC->LineTo[[k].lchild].x+4,[[k].lchild].y);}if[k].rchild!=-1){pDC->MoveTo[k].x+4,[k].y);pDC->LineTo[[k].rchild].x+4,[[k].rchild].y);}<<endl;eight<<endl;arent<<endl;child<<endl;child<<endl;=" ";}else{fip>>c;[i].s=c;}fip>>w[i];arent;child;child;xt)|*.txt|所有文件(*.*)|*.*|"),NULL);if() == IDOK){m_path1 = ();xt)|*.txt|所有文件(*.*)|*.*|"),NULL);if() == IDOK){m_path2 = ();UpdateData(FALSE);}ofstream sff(m_path2);i++;}for(j=[i].start+1;j<m_gcharnum;j++)sff<<[i].bit[j];xt)|*.txt|所有文件(*.*)|*.*|"),NULL);if() == IDOK){m_path1 = ();UpdateData(FALSE);}AfxMessageBox("译码成功,请保存!");CFileDialog hFileDlg1(false,NULL,NULL,OFN_FILEMUSTEXIST | OFN_READONLY | OFN_PATHMUSTEXIST,TEXT("文档文本 (*.txt)|*.txt|所有文件(*.*)|*.*|"),NULL);if() == IDOK){m_path2 = ();UpdateData(FALSE);}ifstream ldf(m_path1);child;}if(c=='0')child;}if[i].lchild==-1&&[i].rchild==-1);i=2*m_gcharnum-2;}}}}();();}else{AfxMessageBox("您尚未执行初始化操作!请先执行初始化操作!");}}xt)|*.txt|所有文件(*.*)|*.*|"),NULL);if() == IDOK){m_path = ();UpdateData(FALSE);}ofstream saf(m_path);/*();n;}else{ d++;break;}if(d==[p].dep){for(t1;t1<t2-1;t1++) { saf<<" ";}if[p].s==" "||[p].s=="")saf<<"0";;child!=-1)[p].lchild);if(ht[p].rchild!=-1)[p].rchild);t1+=2;}else{d++;saf<<endl;t1=0;t2=0;}}}child;ep-1);f++) saf<<" ";<<endl;child;"");CString str1;GetDlgItemText(IDC_EDIT1,str1);xt)|*.txt|所有文件(*.*)|*.*|"),NULL);if() == IDOK){m_path = ();UpdateData(FALSE);}CFile file1( m_path,CFile::modeRead);char *pBuf;int iLen=();pBuf =new char[iLen+1];(pBuf,iLen);pBuf[iLen]=0;();SetDlgItemText(IDC_EDIT1,pBuf);}xt)|*.txt|所有文件(*.*)|*.*|"),NULL);if() == IDOK){m_path = ();UpdateData(FALSE);}CFile file;(m_path,CFile::modeCreate|CFile::modeWrite);CString strValue;GetDlgItemText(IDC_EDIT1,strValue);xt)|*.txt|所有文件(*.*)|*.*|"),NULL);AfxMessageBox("请选择刚才输入的内容所要保存到的位置!");if() == IDOK){m_path = ();UpdateData(FALSE);}CFile file;(m_path,CFile::modeCreate|CFile::modeWrite);CString strValue;GetDlgItemText(IDC_EDIT1,strValue);xt)|*.txt|所有文件(*.*)|*.*|"),NULL);if() == IDOK){m_path2 = ();UpdateData(FALSE);}ifstream ldf(m_path,ios::in);i++;}for(j=[i].start+1;j<m_gcharnum;j++) sff<<[i].bit[j];}}AfxMessageBox("代码文件已保存成功!");CDialog::OnOK();}4.函数的调用关系图反映了演示程序的层次结构Main(主窗口、主文档)初始化OnHandinput OnAutoget编码OnEncodinghinputOnEncodingainput译码OnDecoding印代码文件OnPte印哈弗曼树OnPhafftreeHaffman Setdep setloc四、调试分析1.由于一开始时候编写的时候没有注意使用面向对象的思想,并没有建立哈弗曼树类,程序完成后才将其转为面向对象的方式,修改仓促,因而使得哈弗曼树类丧失了封装性。