行程编码实验报告.docx

上传人:b****8 文档编号:29992600 上传时间:2023-08-04 格式:DOCX 页数:25 大小:77.24KB
下载 相关 举报
行程编码实验报告.docx_第1页
第1页 / 共25页
行程编码实验报告.docx_第2页
第2页 / 共25页
行程编码实验报告.docx_第3页
第3页 / 共25页
行程编码实验报告.docx_第4页
第4页 / 共25页
行程编码实验报告.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

行程编码实验报告.docx

《行程编码实验报告.docx》由会员分享,可在线阅读,更多相关《行程编码实验报告.docx(25页珍藏版)》请在冰豆网上搜索。

行程编码实验报告.docx

行程编码实验报告

行程编码以vc方式实现

实验目的:

了解行程算法的压缩和解压过程,学会计算压缩比以及与行程算法相关的问题。

实验平台:

在vc2010下以c++代码的形式完成。

软件设计说明:

该程序主要是为了实现压缩和解压的功能。

压缩算法相对较为简单,主要是对输入的要压缩的数据进行遍历,遍历并同时记录相同的数据的数目,当遍历到不相同的数据后停止遍历并将数据和数目压入到vector中保存,考虑到可能会在数据间产生误差,我加入’\’用于区分不同的两个数据,还有若数据的长度为1时,我不将1保存到vector中,以此方式尽可能的减少压缩数据的长度,增加压缩的效果。

函数中使用了中的功能,其作用为将int转换为string的类型,便于储存数据,其功能函数如下:

voidyasuo(vectora)//a传入要压缩的数据

{

intlength=a.size();//原数据的长度

vectortemp;//保存压缩后的数据

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)

{

vectordata;//记录数据

vectorloca;//记录标志的位置

vectorlen;//记录个数据的长度

vectorzhi;//记录每个数据的各个位上的数值

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&temp,vector&a)//输出解压后的数据

{

doublerate;

cout<<"压缩后的数据为:

"<

for(intk=0;k

cout<

cout<

cout<<"压缩前的长度为:

"<

cout<<"压缩后的长度为:

"<

rate=a.size()/(temp.size()*1.0);

cout<<"压缩率为:

"<

}

voidprint2(vector&a,vector&b)//输出压缩后的数据

{

cout<<"解压后的数据为:

"<

for(inti=0;i

for(intj=0;j

cout<

}

voidyasuo(vectora)//压缩算法

{

intlength=a.size();

vectortemp;

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);

}

voidjieya(stringa)//解压算法

{

vectordata;//保存数据

vectorloca;//保存标志的位置

vectorlen;//保存数据的长度

vectorzhi;

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);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1