1、行程编码实验报告行程编码以vc方式实现实验目的:了解行程算法的压缩和解压过程,学会计算压缩比以及与行程算法相关的问题。实验平台:在vc2010下以c+代码的形式完成。软件设计说明:该程序主要是为了实现压缩和解压的功能。压缩算法相对较为简单,主要是对输入 的要压缩的数据进行遍历,遍历并同时记录相同的数据的数目,当遍历到不相同的数据后停止遍历并将数据和数目压入到vector中保存,考虑到可能会在数据间产生误差,我加入用于区分不同的两个数据,还有若数据的长度为1时,我不将1保存到vector中,以此方式尽可能的减少压缩数据的长度,增加压缩的效果。函数中使用了中的功能,其作用为将int转换为strin
2、g的类型,便于储存数据,其功能函数如下:void yasuo(vector a) /a传入要压缩的数据 int length=a.size(); /原数据的长度 vector temp; /保存压缩后的数据 int j=0; int n=1; for(int i=0;ilength-1;i+) string b=ai; if(i!=length-2) if(ai!=ai+1) if(n!=1) if(b=) temp.push_back(b); temp.push_back(b); else temp.push_back(b); string s; stringstream out; outn
3、; 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); string s; s=; temp.push_back(s); n=1; j=j+1; else n+; else if(ai=ai+1) n+; if(b=) temp.push_back(b); temp.push_back(b); else temp.push_back(b); string s; s
4、tringstream out; outn; 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); string s; stringstream out; outn; s = out.str(); temp.push_back(s); s=; temp.push_back(s); n=1; if(ai+1=) temp.push_back(ai+1); temp.push_back(ai+1)
5、; else temp.push_back(ai+1); j=j+2; else if(b=) temp.push_back(b); temp.push_back(b); else temp.push_back(b); string s; s=; temp.push_back(s); n=1; if(ai+1=) temp.push_back(ai+1); temp.push_back(ai+1); else temp.push_back(ai+1); j=j+2; print(temp,a,j); /用于数据的输出然后是解压算法的设计思路如下,主要是定义三个vector的向量,一个用于记录要
6、压缩的数据,一个用于记录标志的在string中的位置,然后根据的位置求出数据的数目,将数目保存到另外一个vector中,然后根据数据和长度一一对应输出,这样就将数据解压完成。 但是在这里需要特别注意对的处理在压缩的过程中若压缩的字符为,则输出的时候记为,判断的时候主要是判定连续3个字符是否全为,以此判断是否是遇到标志字符。代码如下:void jieya(string a) vector data; /记录数据 vector loca; /记录标志的位置 vector len; /记录个数据的长度 vector zhi; /记录每个数据的各个位上的数值 for(int i=0;i2) if(ai
7、=&ai+1=&ai+2=) data.push_back(); loca.push_back(i+2); i=i+2; else if(ai=&ai+1!=) data.push_back(ai+1); loca.push_back(i+1); else if(ai=&ai+1=&ai+2=) data.push_back(); loca.push_back(i+2); i=i+2; else if(ai=&ai+1!=) data.push_back(ai+1); loca.push_back(i+1); for(int j=0;jdata.size();j+) /记录数据的长度 if(d
8、ata.size()=1) if(locaj=a.length()-1&dataj!=) len.push_back(1); else if(locaj=a.length()-1&dataj=) len.push_back(1); else int lensi=0; for(int k=locaj+1;k=0&ak=9) zhi.push_back(int)ak-48); if(zhi.size()=0) lensi=1; else for(int l=0;lzhi.size();l+) int z=zhi.size()-l-1; lensi=lensi+zhil*pow(float)10,z
9、); len.push_back(lensi); lensi=0; zhi.clear(); else if(j=data.size()-1) if(a.length()-locaj=0) len.push_back(1); else int lensi1=0; for(int k=locaj+1;k=0&ak=9) zhi.push_back(int)ak-48); if(zhi.size()=0) lensi1=1; else for(int l=0;lzhi.size();l+) int z=zhi.size()-l-1; lensi1=lensi1+zhil*pow(float)10,
10、z); len.push_back(lensi1); lensi1=0; zhi.clear(); else int lensi2=0; for(int k=locaj+1;k=0&ak=9) zhi.push_back(int)ak-48); if(zhi.size()=0) lensi2=1; else for(int l=0;lzhi.size();l+) int z=zhi.size()-l-1; lensi2=lensi2+zhil*pow(float)10,z); len.push_back(lensi2); lensi2=0; zhi.clear(); for(int h=0;h
11、loca.size();h+) coutlocah ; print2(data,len);运行截图:首先运行压缩算法:压缩不同字符,结果如下:qqqqqqqWWWWWWW22222222111111(=结果如下:输入特殊的字符,包含,输入wwww1111R运算结果如下:解压的运行结果如图,解压q7W72816(6=4,运行结果如下:解压5w414R,运行结果如下:解压w5t7,运行结果如下:此数据考虑了边界的输出情况,而输出结果也是正确的。完整代码如下:#include#include#include#includeusing namespace std;void print(vector &
12、temp,vector & a) /输出解压后的数据 double rate; cout压缩后的数据为:endl; for(int k=0;ktemp.size();k+) couttempk; coutendl; cout压缩前的长度为:a.size()endl; cout压缩后的长度为:temp.size()endl; rate=a.size()/(temp.size()*1.0); cout压缩率为:rateendl;void print2(vector &a,vector &b) /输出压缩后的数据 cout解压后的数据为:endl; for(int i=0;ia.size();i+)
13、 for(int j=0;jbi;j+) coutai;void yasuo(vector a) /压缩算法 int length=a.size(); vector temp; int j=0; int n=1; for(int i=0;ilength-1;i+) string b=ai; if(i!=length-2) if(ai!=ai+1) if(n!=1) if(b=) temp.push_back(b); temp.push_back(b); else temp.push_back(b); string s; stringstream out; outn; s = out.str()
14、; 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); string s; s=; temp.push_back(s); n=1; j=j+1; else n+; else if(ai=ai+1) n+; if(b=) temp.push_back(b); temp.push_back(b); else temp.push_back(b); string s; stringstream out
15、; outn; 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); string s; stringstream out; outn; s = out.str(); temp.push_back(s); s=; temp.push_back(s); n=1; if(ai+1=) temp.push_back(ai+1); temp.push_back(ai+1); else temp.pus
16、h_back(ai+1); j=j+2; else if(b=) temp.push_back(b); temp.push_back(b); else temp.push_back(b); string s; s=; temp.push_back(s); n=1; if(ai+1=) temp.push_back(ai+1); temp.push_back(ai+1); else temp.push_back(ai+1); j=j+2; print(temp,a);void jieya(string a) /解压算法 vector data; /保存数据 vector loca; /保存标志的
17、位置 vector len; /保存数据的长度 vector zhi; for(int i=0;i2) if(ai=&ai+1=&ai+2=) data.push_back(); loca.push_back(i+2); i=i+2; else if(ai=&ai+1!=) data.push_back(ai+1); loca.push_back(i+1); else if(ai=&ai+1=&ai+2=) data.push_back(); loca.push_back(i+2); i=i+2; else if(ai=&ai+1!=) data.push_back(ai+1); loca.p
18、ush_back(i+1); for(int j=0;jdata.size();j+) if(data.size()=1) if(locaj=a.length()-1&dataj!=) len.push_back(1); else if(locaj=a.length()-1&dataj=) len.push_back(1); else int lensi=0; for(int k=locaj+1;k=0&ak=9) zhi.push_back(int)ak-48); if(zhi.size()=0) lensi=1; else for(int l=0;lzhi.size();l+) int z
19、=zhi.size()-l-1; lensi=lensi+zhil*pow(float)10,z); len.push_back(lensi); lensi=0; zhi.clear(); else if(j=data.size()-1) if(a.length()-locaj=0) len.push_back(1); else int lensi1=0; for(int k=locaj+1;k=0&ak=9) zhi.push_back(int)ak-48); if(zhi.size()=0) lensi1=1; else for(int l=0;lzhi.size();l+) int z=zhi.size()-l-1; lensi1=lensi1+zhil*pow(float)10,z); len.push_back(lensi1);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1