行程编码应用软件实验报告.docx
- 文档编号:24902506
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:22
- 大小:114.26KB
行程编码应用软件实验报告.docx
《行程编码应用软件实验报告.docx》由会员分享,可在线阅读,更多相关《行程编码应用软件实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
行程编码应用软件实验报告
行程编码小软件实验报告
一、实验目的
设计一个微型软件以实现用行程编码的思想压缩/还原文本内容并可写入文件。
二、实验方法(算法及实现原理)
软件功能
利用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 { 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 { 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. /// /// 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 行程 编码 应用软件 实验 报告