行程编码实验报告.docx
- 文档编号:29992600
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:25
- 大小:77.24KB
行程编码实验报告.docx
《行程编码实验报告.docx》由会员分享,可在线阅读,更多相关《行程编码实验报告.docx(25页珍藏版)》请在冰豆网上搜索。
行程编码实验报告
行程编码以vc方式实现
实验目的:
了解行程算法的压缩和解压过程,学会计算压缩比以及与行程算法相关的问题。
实验平台:
在vc2010下以c++代码的形式完成。
软件设计说明:
该程序主要是为了实现压缩和解压的功能。
压缩算法相对较为简单,主要是对输入的要压缩的数据进行遍历,遍历并同时记录相同的数据的数目,当遍历到不相同的数据后停止遍历并将数据和数目压入到vector中保存,考虑到可能会在数据间产生误差,我加入’\’用于区分不同的两个数据,还有若数据的长度为1时,我不将1保存到vector中,以此方式尽可能的减少压缩数据的长度,增加压缩的效果。
函数中使用了
voidyasuo(vector
{
intlength=a.size();//原数据的长度
vector
intj=0;
intn=1;
for(inti=0;i { stringb=a[i]; if(i! =length-2) { if(a[i]! =a[i+1]) { if(n! =1) { if(b=="\\") { temp.push_back(b); temp.push_back(b); } else temp.push_back(b); strings; stringstreamout; out< s=out.str(); temp.push_back(s); s="\\"; temp.push_back(s); n=1; j=j+2; } else { if(b=="\\") { temp.push_back(b); temp.push_back(b); } else temp.push_back(b); strings; s="\\"; temp.push_back(s); n=1; j=j+1; } } else n++; } else { if(a[i]==a[i+1]) { n++; if(b=="\\") { temp.push_back(b); temp.push_back(b); } else temp.push_back(b); strings; stringstreamout; out< s=out.str(); temp.push_back(s); n=1; j=j+2; } else { if(n! =1) { if(b=="\\") { temp.push_back(b); temp.push_back(b); } else temp.push_back(b); strings; stringstreamout; out< s=out.str(); temp.push_back(s); s="\\"; temp.push_back(s); n=1; if(a[i+1]=="\\") { temp.push_back(a[i+1]); temp.push_back(a[i+1]); } else temp.push_back(a[i+1]); j=j+2; } else { if(b=="\\") { temp.push_back(b); temp.push_back(b); } else temp.push_back(b); strings; s="\\"; temp.push_back(s); n=1; if(a[i+1]=="\\") { temp.push_back(a[i+1]); temp.push_back(a[i+1]); } else temp.push_back(a[i+1]); j=j+2; } } } } print(temp,a,j);//用于数据的输出 } 然后是解压算法的设计思路如下,主要是定义三个vector的向量,一个用于记录要压缩的数据,一个用于记录标志’\’的在string中的位置,然后根据’\’的位置求出数据的数目,将数目保存到另外一个vector中,然后根据数据和长度一一对应输出,这样就将数据解压完成。 但是在这里需要特别注意对’\’的处理在压缩的过程中若压缩的字符为’\\’,则输出的时候记为’\\’,判断的时候主要是判定连续3个字符是否全为’\\’,以此判断是否是遇到标志字符’\’。 代码如下: voidjieya(stringa) { vector vector vector vector for(inti=0;i { if(i==0) { if(a[i]=='\\') { data.push_back('\\'); loca.push_back (1); i++; } else { data.push_back(a[0]); loca.push_back(i); } } else { if(a.length()-i-1>2) { if(a[i]=='\\'&&a[i+1]=='\\'&&a[i+2]=='\\') { data.push_back('\\'); loca.push_back(i+2); i=i+2; } else if(a[i]=='\\'&&a[i+1]! ='\\') { data.push_back(a[i+1]); loca.push_back(i+1); } } else { if(a[i]=='\\'&&a[i+1]=='\\'&&a[i+2]=='\\') { data.push_back('\\'); loca.push_back(i+2); i=i+2; } else if(a[i]=='\\'&&a[i+1]! ='\\') { data.push_back(a[i+1]); loca.push_back(i+1); } } } } for(intj=0;j { if(data.size()==1) { if(loca[j]==a.length()-1&&data[j]! ='\\') len.push_back (1); else if(loca[j]==a.length()-1&&data[j]=='\\') len.push_back (1); else { intlensi=0; for(intk=loca[j]+1;k { if(a[k]>='0'&&a[k]<='9') zhi.push_back((int)a[k]-48); } if(zhi.size()==0) lensi=1; else for(intl=0;l { intz=zhi.size()-l-1; lensi=lensi+zhi[l]*pow((float)10,z); } len.push_back(lensi); lensi=0; zhi.clear(); } } else { if(j==data.size()-1) { if(a.length()-loca[j]==0) { len.push_back (1); } else { intlensi1=0; for(intk=loca[j]+1;k { if(a[k]>='0'&&a[k]<='9') zhi.push_back((int)a[k]-48); } if(zhi.size()==0) lensi1=1; else for(intl=0;l { intz=zhi.size()-l-1; lensi1=lensi1+zhi[l]*pow((float)10,z); } len.push_back(lensi1); lensi1=0; zhi.clear(); } } else { intlensi2=0; for(intk=loca[j]+1;k { if(a[k]>='0'&&a[k]<='9') zhi.push_back((int)a[k]-48); } if(zhi.size()==0) lensi2=1; else for(intl=0;l { intz=zhi.size()-l-1; lensi2=lensi2+zhi[l]*pow((float)10,z); } len.push_back(lensi2); lensi2=0; zhi.clear(); } } } for(inth=0;h cout< print2(data,len); } 运行截图: 首先运行压缩算法: 压缩不同字符,结果如下: qqqqqqqWWWWWWW22222222111111((((((==== 结果如下: 输入特殊的字符,包含’\’,输入\\\\\wwww1111R 运算结果如下: 解压的运行结果如图,解压q7\W7\28\16\(6\=4, 运行结果如下: 解压\\5\w4\14\R, 运行结果如下: 解压\\\w5\t7\\\, 运行结果如下: 此数据考虑了边界的输出情况,而输出结果也是正确的。 完整代码如下: #include #include #include #include usingnamespacestd; voidprint(vector { doublerate; cout<<"压缩后的数据为:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 行程 编码 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)