行程编码应用软件实验报告.docx

上传人:b****2 文档编号:11764938 上传时间:2023-06-02 格式:DOCX 页数:22 大小:114.26KB
下载 相关 举报
行程编码应用软件实验报告.docx_第1页
第1页 / 共22页
行程编码应用软件实验报告.docx_第2页
第2页 / 共22页
行程编码应用软件实验报告.docx_第3页
第3页 / 共22页
行程编码应用软件实验报告.docx_第4页
第4页 / 共22页
行程编码应用软件实验报告.docx_第5页
第5页 / 共22页
行程编码应用软件实验报告.docx_第6页
第6页 / 共22页
行程编码应用软件实验报告.docx_第7页
第7页 / 共22页
行程编码应用软件实验报告.docx_第8页
第8页 / 共22页
行程编码应用软件实验报告.docx_第9页
第9页 / 共22页
行程编码应用软件实验报告.docx_第10页
第10页 / 共22页
行程编码应用软件实验报告.docx_第11页
第11页 / 共22页
行程编码应用软件实验报告.docx_第12页
第12页 / 共22页
行程编码应用软件实验报告.docx_第13页
第13页 / 共22页
行程编码应用软件实验报告.docx_第14页
第14页 / 共22页
行程编码应用软件实验报告.docx_第15页
第15页 / 共22页
行程编码应用软件实验报告.docx_第16页
第16页 / 共22页
行程编码应用软件实验报告.docx_第17页
第17页 / 共22页
行程编码应用软件实验报告.docx_第18页
第18页 / 共22页
行程编码应用软件实验报告.docx_第19页
第19页 / 共22页
行程编码应用软件实验报告.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

行程编码应用软件实验报告.docx

《行程编码应用软件实验报告.docx》由会员分享,可在线阅读,更多相关《行程编码应用软件实验报告.docx(22页珍藏版)》请在冰点文库上搜索。

行程编码应用软件实验报告.docx

行程编码应用软件实验报告

行程编码小软件实验报告

一、实验目的

设计一个微型软件以实现用行程编码的思想压缩/还原文本内容并可写入文件。

二、实验方法(算法及实现原理)

软件功能

利用C#语言进行简单软件编写,此软件设置四个关键按钮(分别表示压缩、解压、从文本中读入文件、将压缩后文本写入文件),两个文本框(一个显示原文本,另一个显示压缩后文本),一个文本可变标签(显示压缩比)以及一个显示样例按钮。

用户可以通过单击“读入原码文件”按钮读入原文文本,本程序中为了简化操作,规定文本为放在与应用程序同一目录下的名为“Original.txt”,也可以直接单击文本框输入数据。

单击“压缩”后执行行程编码算法,其具体内容见本节最后。

生成的压缩后字符串显示在压缩后文本框中。

单击“还原”后执行行程编码逆向算法,具体实现同见本节最后部分。

最后生成的原码显示在原码的文本框中。

单击“写入压缩文件”会在与该应用程序同目录下创建一个名为“compress”的文件,该文件内容即为压缩后的文本框显示的内容。

单击“产生随机字串”会产生随机长度、大小的字串原码于第一个文本框中。

算法部分

经过严谨的推理,得出若要使压缩程序支持所有字符编码格式,当某些关键字符长度为1时,压缩后文件内容必超过1,以下为详细证明过程:

∵行程编码的定义为任何重复的字符序列可被一个短格式取代

∴若某些字符长度为1时仍用该字符而不对字符进行拓展时,

则一定存在某些原码能构成该短格式的形式同时保证压缩后

不改变字串,但解压时由于为指定格式而转化成其他字串。

例1:

固定格式为‘/’+个数+‘\’+单字符,存在如“/123\a”形式的原文,在解压后仍保持不变,但还原回去时会变为123个a的字串。

例2:

固定格式为‘/’+单字符+个数,存在如“/a5”的原文,使得解压后文本不变而还原回去时会变成“aaaaa”。

等等。

同理,可证有2-4位的字符串时,无法将某些特定的字符串(如数字、标记符号等)按原码直接输出到压缩后文件中,课本中ppt上内容存在漏洞。

以下为文字证明过程:

当该字符为标记符号时,在标记符号只有1位时,由之前证明得必然至少需要两位编码来代替该字符,因此2位字符压缩码代表的会是1位原码,同理,对于更多位的标记字符也是如此。

当该字符为数字时,如例1的格式不会出问题,而例2的格式则无法识别个数与字符(串)的差别,如:

“2/222/1”中间的“222”指代不明。

综上所述,我认为不应该采取上课ppt中所叙述的内容,在字符串处理时不按照4位为标准来编码。

应该保证在压缩过程中保持同一种编码形式(但其中有部分无关字符可按照直接输出的形式输出,提高压缩比率),以下是我本人自己写的方法:

以‘/’为标记符号,固定格式为(‘/’)+单字符+个数,对所有长度、所有字符均有效,其中改进之处为当原文为单个独立字母或非标记字符外其他字符时,输出直接为该字符而不用此格式,由于这些字符在此时为无关字符,可以直接输出,减少压缩后冗余。

解码时先读入单字符(若为标记符号则表示字符为下一位),之后向后查找,若不为数字,则直接输出该字符;若为数字,则依次遍历乘10相加,得出重复次数。

最后通过for循环来达到还原的功能。

三、实验结果

打开该应用将出现如图1所示界面

图1

单击“产生随机字串”字段将于原码文本框中产生随机文本,如图2所示

图2

单击“读入原码文件”按钮,如果同目录下存在名为“Original.txt”的文件,则读入文件内容于原码文本框中,然则弹出提示框如图3、4所示

图3图4

单击“压缩”按钮,则程序在后台对文本进行处理,将压缩后文本显示于压缩后文本框中,同时计算出压缩比如图5所示

图5

清空原码文本框,在压缩后文本框中输入任意压缩后字串,单击“还原”按钮,将会在原码框中显示原文,也同时计算出压缩比如图6所示

图6

单击“写入压缩文件”按钮,程序会在同目录下创建名为“compress”的文件,由于文件内容与压缩后文本框内容一致,不予截图重复显示,程序会提示保存成功,如图7所示

图7

对于本实验,本程序可以支持所有编码类型,使程序在各种情况下均可以正常运行。

五、遇到的问题及解决方法

问题1:

在思考行程编码算法时发现某些单字符只出现一遍时无法直接打印,会在还原时出错,具体证明详见第二大点的算法部分。

解决方案为当出现单一的该类特殊字符时,需要稍稍增加文本长度对该类字符做一个解释作用。

问题2:

为了支持所有编码的格式,同时本程序不同于其他console环境界面,对字串可以直接一并读入并对如中文等字符直接分割,不采取按4位(char)的方式读取内容。

采用字串的形式并利用控件自动转字串功能对文本进行分词。

四、总结

通过该实验让我对行程编码有了个较为全面的认识,行程编码自身是不存在最优解的,因此无法得出行程编码的最优压缩方案,任何方案都存在或小或大的漏洞或问题,本人几经考虑后决定采用了一种无漏洞(支持所有字符的所有形式)但在某些特殊情况下压缩比并不理想的方案。

【证明部分详见第二大点算法部分】

五、实验代码

以下为部分关键代码

//简易行程编码软件.cs

usingSystem;

usingSystem.Collections.Generic;

usingSystem.ComponentModel;

usingSystem.Data;

usingSystem.Drawing;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Threading.Tasks;

usingSystem.IO;

usingSystem.Text;

usingSystem.Windows.Forms;

namespace行程编码

{

publicpartialclass简易行程编码软件:

Form

{

public简易行程编码软件()

{

InitializeComponent();

}

privatevoidbutton1_Click(objectsender,EventArgse)

{

strings=textBox1.Text.ToString(),ans="";

for(inti=0;i

{

charc=s[i];

if((i+3

{

intcnt=4;

i+=3;

while(i+1

{

i++;

cnt++;

}

i++;

if(c>='0'&&c<='9'||c=='/')

ans+="/"+c.ToString()+cnt.ToString();

else

ans+=c.ToString()+cnt.ToString();

}

else

{

if(c>='0'&&c<='9'||c=='/')

ans+="/"+c.ToString();

else

ans+=c.ToString();

i++;

}

}

textBox2.Text=ans;

if(ans=="")

label4.Text="内容为空!

";

else

{

doublescale=ans.Length/(s.Length*1.0)*100;

label4.Text=scale.ToString("0.00")+"%";

}

}

privatevoidbutton2_Click(objectsender,EventArgse)

{

strings=textBox2.Text.ToString(),ans="";

for(inti=0;i

{

charc;

intcnt=0;

if(s[i]=='/')

{

c=s[i+1];

i+=2;

while(i='0'&&s[i]<='9')

{

cnt=cnt*10+(int)(s[i]-'0');

i++;

}

if(cnt==0)cnt=1;

for(intt=0;t

ans+=c.ToString();

}

else

{

c=s[i++];

while(i='0'&&s[i]<='9')

{

cnt=cnt*10+(int)(s[i]-'0');

i++;

}

if(cnt==0)cnt=1;

for(intt=0;t

ans+=c.ToString();

}

}

textBox1.Text=ans;

if(ans=="")

label4.Text="内容为空!

";

else

{

doublescale=s.Length/(ans.Length*1.0)*100;

label4.Text=scale.ToString("0.00")+"%";

}

}

privatevoidbutton3_Click(objectsender,EventArgse)

{

FileStreamfs=newFileStream("compress",FileMode.OpenOrCreate,FileAccess.ReadWrite);

StreamWritersw=newStreamWriter(fs);

sw.Write(textBox2.Text.ToString());

sw.Close();

MessageBox.Show("保存成功!

");

}

privatevoidlabel5_Click(objectsender,EventArgse)

{

stringstr="";

Randomrandom=newRandom();

intn=random.Next(3,20),m=random.Next(5,50);

intcnt=random.Next(0,128);

for(inti=0;i

{

for(intj=0;j

str+=((char)cnt).ToString();

cnt=random.Next(0,128);

m=random.Next(5,50);

}

textBox1.Text=str;

}

privatevoidbutton4_Click(objectsender,EventArgse)

{

stringstrLine;

try

{

FileStreamaFile=newFileStream("Original.txt",FileMode.Open);

StreamReadersr=newStreamReader(aFile);

strLine=sr.ReadLine();

while(strLine!

=null)

{

textBox1.Text+=strLine;

strLine=sr.ReadLine();

}

sr.Close();

}

catch(IOExceptionex)

{

MessageBox.Show("找不到名为‘Original.txt’的文件!

");

}

}

}

}

/**************************简易行程编码软件.Designer.cs****************************/

namespace行程编码

{

partialclass简易行程编码软件

{

///

///Requireddesignervariable.

///

privateSystem.ComponentModel.IContainercomponents=null;

///

///Cleanupanyresourcesbeingused.

///

///trueifmanagedresourcesshouldbedisposed;otherwise,false.

protectedoverridevoidDispose(booldisposing)

{

if(disposing&&(components!

=null))

{

components.Dispose();

}

base.Dispose(disposing);

}

#regionWindowsFormDesignergeneratedcode

///

///RequiredmethodforDesignersupport-donotmodify

///thecontentsofthismethodwiththecodeeditor.

///

privatevoidInitializeComponent()

{

System.ComponentModel.ComponentResourceManagerresources=newSystem.ComponentModel.ComponentResourceManager(typeof(简易行程编码软件));

this.label1=newSystem.Windows.Forms.Label();

this.button4=newSystem.Windows.Forms.Button();

this.label5=newSystem.Windows.Forms.Label();

this.label4=newSystem.Windows.Forms.Label();

this.label3=newSystem.Windows.Forms.Label();

this.button3=newSystem.Windows.Forms.Button();

this.button2=newSystem.Windows.Forms.Button();

this.textBox2=newSystem.Windows.Forms.TextBox();

this.textBox1=newSystem.Windows.Forms.TextBox();

this.label2=newSystem.Windows.Forms.Label();

this.button1=newSystem.Windows.Forms.Button();

this.SuspendLayout();

//

//label1

//

this.label1.AutoSize=true;

this.label1.Location=newSystem.Drawing.Point(73,28);

this.label1.Margin=newSystem.Windows.Forms.Padding(4,0,4,0);

this.label1.Name="label1";

this.label1.Size=newSystem.Drawing.Size(56,16);

this.label1.TabIndex=1;

this.label1.Text="原文:

";

//

//button4

//

this.button4.Location=newSystem.Drawing.Point(232,321);

this.button4.Margin=newSystem.Windows.Forms.Padding(4,4,4,4);

this.button4.Name="button4";

this.button4.Size=newSystem.Drawing.Size(127,31);

this.button4.TabIndex=20;

this.button4.Text="读入原码文件";

this.button4.UseVisualStyleBackColor=true;

this.button4.Click+=newSystem.EventHandler(this.button4_Click);

//

//label5

//

this.label5.AutoSize=true;

this.label5.ForeColor=System.Drawing.Color.FromArgb(((int)(((byte)(0)))),((int)(((byte)(192)))),((int)(((byte)(0)))));

this.label5.Location=newSystem.Drawing.Point(39,101);

this.label5.Margin=newSystem.Windows.Forms.Padding(4,0,4,0);

this.label5.Name="label5";

this.label5.Size=newSystem.Drawing.Size(104,16);

this.label5.TabIndex=19;

this.label5.Text="产生随机字串";

this.label5.TextAlign=System.Drawing.ContentAlignment.MiddleCenter;

this.label5.Click+=newSystem.EventHandler(this.label5_Click);

//

//label4

//

this.label4.ForeColor=System.Drawing.Color.Red;

this.label4.Location=newSystem.Drawing.Point(13,336);

this.label4.Margin=newSystem.Windows.Forms.Padding(4,0,4,0);

this.label4.Name="label4";

this.label4.RightToLeft=System.Windows.Forms.RightToLeft.No;

this.label4.Size=newSystem.Drawing.Size(107,16);

this.label4.TabIndex=18;

this.label4.Text="100%";

this.label4.TextAlign=System.Drawing.ContentAlignment.MiddleRight;

//

//label3

//

this.label3.AutoSize=true;

this.label3.ForeColor=System.Drawing.SystemColors.ControlText;

this.label3.Location=newSystem.Drawing.Point(39,300);

this.label3.Margin=newSystem.Windows.Forms.Padding(4,0,4,0);

this.label3.Name="label3";

this.label3.Size=newSystem.Drawing.Size(88,16);

this.label3.TabIndex=17;

this.label3.Text="压缩比为:

";

//

//button3

//

this.button3.Location=newSystem.Drawing.Point(232,360);

this.button3.Margin=newSystem.Windows.Forms.Padding(4,4,4,4);

this.button3.Name="button3";

this.button3.Size=newSystem.Drawing.Size(127,31);

this.button3.TabIndex=16;

this.button3.Text="写入压缩文件";

this.button3.UseVisualStyleBackColor=true;

this.button3.Click+=newSystem.EventHandler(this.button3_Click);

//

//button2

//

this.button2.Location=newSystem.Drawing.Point(151,360);

this.button2.Margin=newSystem.Windows.Forms.Padding(4,4,4,4);

this.button2.Name="button2";

this.button2.Size=newSystem.Drawing.Size(73,31);

this.button2.TabIndex=15;

this.button2.Text="还原";

this.button2.UseVisualStyleBackColor=true;

this.button2.Click+=newSystem.EventHandler(this.button2_Click);

//

//textBox2

//

this.textBox2.Location=newSystem.Drawing.Point(149,160);

this.te

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

当前位置:首页 > 幼儿教育 > 唐诗宋词

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2