ImageVerifierCode 换一换
格式:DOCX , 页数:56 ,大小:311.02KB ,
资源ID:6838427      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6838427.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(软件开发环境试验精编.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

软件开发环境试验精编.docx

1、软件开发环境试验精编电 子 科 技 大 学实 验 报 告学生姓名:郭小明 学 号:2011060100010 一、实验室名称: 主楼A2-412 二、实验项目名称:软件开发环境试验-Huffman编码实验3、实验原理:2.1 分割函数的三项原则分割函数的三项原则包括:与其写注释,不如写函数;重复就是罪恶;函数不要超过50行至70行。关于分割函数三原则的具体含义,请见教材和课堂教学PPT关于电话本的内容。这里不再赘述。2.2 Huffman编码的基本原理 本实验要求使用Huffman编码算法,实现对文件的压缩和解压。因此,我们首先介绍huffman的编码算法。 Huffman编码是一种可变长编码

2、方式,是由美国数学家David Huffman创立的,是二叉树的一种特殊转化形式。编码的基本原理是:将使用次数多的代码转换成长度较短的编码,而使用次数少的代码则可以使用较长的编码,并且保持编码的唯一可解性。指导书试验原理部分较多,在这里就不做粘贴复制了。四、实验目的:本实验总体目的是,通过使用huffman编码算法从而实现文件的压缩和解压,以达到使学生掌握并灵活运用分割函数的三项原则。5、实验内容:本实验要求实现一个exe程序。这个程序按照huffman编码方式,同时包含了压缩功能和解压功能。用户通过以下命令进行压缩:C:test.exe c uncompress_filename compr

3、ess_filename上述命令中,test.exe是程序名,-c表示要进行压缩。uncompress_filename是要压缩的文件名,可以包含路径信息,而compress_filename是压缩之后的文件名,同样可以包含路径信息。用户可以通过如下命令进行解压:C:test.exe u compress_filename uncompress_filename上述命令中,-u表示要执行解压命令。compress_filename是要解压的文件名,可以包含路径信息;uncompress_filename就是解压后所得到的文件,同样可以包含路径信息。提示:在实现test.exe程序时,需要考虑如

4、何存储huffman树或者编码表或者词频表等等。本实验要求实现两个版本的test.exe程序,一是C语言版本的,二是C+版本的。对这两个版本的要求如下: 对于每一个版本的程序,需要在实验报告中给出函数调用关系图、流程处理关系图以及它们的文字说明等内容; 对于每一个版本的程序,都需要在实验报告中给出源代码。为了便于查重,代码中注释的比例要占到总行数的20%; C+版本的程序,需要给出类关系图。实验报告的评分标准,包括以下几个方面: 实验报告是否规范 实验报告内容是否详实 实验报告中是否包含了函数调用图、流程图、类图以及它们的文字说明 实验报告中的代码注释是否达到要求 程序是否正确无误 程序是否严

5、格按照分函数的原则编写 C+版本的程序类关系的耦合度如何 程序实现是否考虑了大文件情况六、实验器材(设备、元器件):PC机,vs 2008软件平台。七、实验数据及结果分析: 代码见附件。huffmanForC 文件中函数列表如下: /统计词频时用于查找是否已经记录过,记录过的话返回下标,没有则返回0 int isInNode(int value) /获取文件词频,记录在Node huffmanNode260的节点数组当中 void calWeight(char *file) /*得到待压缩文件的总字节数,权值为几就代表着有多少个字节*/ int getSumBytes() /获取压缩后文件的总

6、bit数 int getSumBits() /建立huffman树 根据huffman树的特性,具有n个节点的huffman树的具有2n-1个节点 /n值由全局变量count值来确定,该函数主要用来初始化Huffman树的所有节点信息 void createHufmanTree(Node * huffmanTree) /*字符编码,从构建好的Huffman树当中读取每个叶子节点的huffman编码, 并将叶子节点的信息放入到code中*/ HCode * getHuffmanCode(Node * huffmanTree,HCode *HC,int code) /* 将编码表写入默认文件当中,

7、并在结尾存入叶子节点数(count)与压缩后文件的总bit数 1111000 27 . . #sum_bit#count# */ void freToFile(int code,HCode *HC)/由于词频表是按照字符串方式存储的叶子节点信息,读取出来的字符串需要转换成int值再使用 int powmy(int a,int b) /*从编码表文件读取相应信息以用来解压文件,读取信息包括编码和叶子信息*/ HCode* freFromFile(int code,HCode *HC) /*压缩文件*/ void compress_file(char* file1,char*file2) /*用于

8、在解压的时候将读取到的ASCII码转换为二进制数*/ int swap(int data) /*进行文件的解压*/ void uncompress_file(char* file1,char* file2) /主函数 int main(int argc, char *argv)函数关系调用图: 向下箭头为顺序依次调用 ,斜线为函数内调用 输入-c argv2 argv3 获取argv2文件中的词频信息根据词频信息建立Huffan树 获取Huffman编码 将argv2文件使用编码压缩成argv3将编码信息写入编码表文件,以备解压使用 输入 -u argv2 argv3 从词频表当中读取编码信息

9、将argv2文件解压为argv3文件代码见附件。上面操作实现了将file.txt 压缩成out.txt (同时生成了默认词频表文件dic.txt),然后实现了解压缩功能。 实验文件列表:file.txt 为源文件,out.txt 为压缩文件,out1.txt 为解压出来的文件下面是dic.txt的部分信息,存放的依次是Huffman编码,对应的ASCII码压缩后产生的文件,确实是乱码解压后的文件,与压缩前的文件,大小内容完全一致。C+Controll类class Controll /:public HuffmanTreepublic: void compress_file(const char

10、 *,const char *,const char *); void uncompress_file(const char *,const char *,const char *); void freFromFile(const char *,char *,char *,int *); int powmy(int,int);HuffmanNode类class HuffmanNode public: char info; /结点信息 double weight; /结点权值 int parent, lchild, rchild; /父亲结点,左右孩子结点 HuffmanNode() paren

11、t=lchild=rchild=-1; HuffmanNode(const char &data, const double &wt, const int &pa=-1, const int &lch=-1, const int &rch=-1) info=data; weight=wt; parent=pa; lchild=lch; rchild=rch; ; /class HuffmanNode endCode类/*现在我把它调出来为的就是在controlll类当中使用这个类*/class Code public: Code():length(10) ptr=new charlength;

12、 Code() delete ptr; char *ptr; const int length;HuffmanTree类class HuffmanTree public: HuffmanTree(const int &s=100) maxSize=(s100?s:100); arrayTree=new HuffmanNodemaxSize; currentSize=0; codeArray=0; HuffmanTree() delete arrayTree; if (codeArray!=0) delete codeArray; void run(const char*, const char

13、*); int getSumBytes();/定义待压缩文件的总bytes数 int currentSize; /当前数组大小 HuffmanNode *arrayTree; /哈夫曼结点数组 Code *codeArray; /数组大小为currentSize int sum_bits;/定义压缩后文件的总bit数private: int maxSize; /数组最大值 /int sum_bytes; void insert(const char&, const double&); /插入结点 void createHuffmanTree(); /创建哈夫曼树 void createHuff

14、manCode(); /创建哈夫曼编码 void writeCodeToFile(const char *);/将Huffman编码写入到词频表文件当中 int findPosition(const char &) const; /返回字符在arrayTree中的位置 int isEqual(const char *s) const; /判断s是否存在于编码系统中,若存在则返回s在编码系统中的位置,否则返回-1 void reverse(char arr); /class HuffmanTree end类关系图C+版本的实验过程总体类似C语言的实验过程,截图类似上面。两程序 总体程序设计思想:

15、 压缩文件命令:(1)首先读取待压缩文件,建立词频信息的存储。(2)然后根据存储的词频信息,建立Huffman树。(3)然后根据建立后的Huffman树,生成编码表信息。(4)根据编码表信息再次逐字节的的读取带压缩文件并且压缩文件。(5)最后将编码表信息和相关文件信息写进存储文件,以备解压使用。解压命令(1)从编码表存储文件当中读出编码信息。(2)根据相关编码信息对压缩文件进行解码,生成解压缩文件。两份源代码打包一并交到了系统里面,以备老师查看! 电 子 科 技 大 学 实 验 报 告学生姓名:郭小明 学 号:2011060100010 一、实验室名称: 主楼A2-412 二、实验项目名称:软

16、件开发环境实验二:流程控制语句反汇编三、实验原理:VS 2008 的反汇编调试和反汇编代码规律。四、实验目的: 本实验总体目的是,通过使用Visual Studio 2008查看if、if/else、do/while/for等类型语句的反汇编代码,以达到掌握流程控制语句识别的目的。五、实验器材(设备、元器件): PC机,VS2008 反汇编编码调试软件六、实验步骤:2.2 if语句的反汇编在实验报告中需要给出代码清单2的解释。代码清单2int _tmain(int argc, _TCHAR* argv) int i = 3; if(i3) i = 4; return 0;反汇编代码 int i

17、 = 3;00DD138E mov dword ptr ebp-8,3 if(i3)00DD1395 cmp dword ptr ebp-8,3 00DD1399 jle 00DD13A2 i = 4;00DD139B mov dword ptr ebp-8,4 return 0;00DD13A2 xor eax,eax 反汇编代码清单2,下面进行解释:int i = 3;00DD138E mov dword ptr ebp-8,3 由课上讲述的结论:在使用了EBP寻址的函数中,ebp-偏移量就是局部变量的地址。我们在程序当中定义了一个局部变量int i = 3。int _tmain(int

18、argc, _TCHAR* argv) 00DD1370 push ebp 00DD1371 mov ebp,esp 以上是该程序入口处的反汇编代码,看得出来程序首先将ebp压栈,然后将现在的栈顶指针esp赋值给ebp(由于栈是由高到低的顺序生长的,所以此时ebp-n就可以表示ebp后面n字节的地址了),然后我们再定义int i = 3;刚好压栈后存储在ebp的后面,并且由于VS2008为了防止溢出攻击,在ebp后面空出了4个字节,然后再分配四个字节存放i变量,于是i变量的地址就变成了ebp - 8,并且int类型变量是4个字节,所以就在ebp - 8加上dword ptr 用来指明数据的字节

19、数00DD1395 cmp dword ptr ebp-8,3 同上dword ptr ebp-8是指明数据字节数,获取i数据值,cmp是将i值与3进行比较,其实就是执行i - 3,然后在标志寄存器(PSW-Program Status Word)的各位反应比较的结果。00DD1399 jle 00DD13A2 jle(jle,jump if light or equal)的含义是第一个操作数小于或等于第二个操作数时跳转(当然此时就是通过标志寄存器(PSW-Program Status Word)中的数值来判断)。然后我们观察跳转地址 00DD13A2 其实就是 00DD13A2 xor ea

20、x,eax 最后一句return 0 的代码。i = 4;00DD139B mov dword ptr ebp-8,4 这是if条件语句里面的代码,将i值赋值为4,同理,dword ptr ebp-8 是通过ebp -8 找寻到i的地址单元,然后dword ptr 说明字节数,mov指令将4赋给这个地址(就是i的存放地址);return 0;00DD13A2 xor eax,eax 程序返回 0 eax清零代 码 清 单 3int _tmain(int argc, _TCHAR* argv) int i = 3; if(i3) i = 4; return 0;下面是代码清单3的反汇编代码和解释

21、。 int i = 3;0122138E mov dword ptr ebp-8,3 if(i3)01221395 cmp dword ptr ebp-8,3 01221399 jge 012213A2 i = 4;0122139B mov dword ptr ebp-8,4 return 0;012213A2 xor eax,eax *int i = 3;0122138E mov dword ptr ebp-8,3 定义一个int型的变量i,赋值为3,ebp-8 ebp - 8 是i变量地址, ebp-8 是i变量, dword ptr 是指明该地址数据由4字节构成,然后通过mov指令将3赋

22、值给i。 if(i3)01221395 cmp dword ptr ebp-8,3 dword ptr ebp-8是指明数据字节数,获取i数据值(ebp-8 是i变量的地址,ebp-8 是i变量),cmp是将i值与3进行比较,其实就是执行i - 3,然后在标志寄存器(PSW-Program Status Word)的各位反应比较的结果。01221399 jge 012213A2 通过与代码清单2的比较我们可以得出,jge(jge,jump if greater or equal )是当第一个操作数大于或者等于第二个操作数的时候进行跳转。且跳转地址就是return 0代码的地址。 i = 4;0

23、122139B mov dword ptr ebp-8,4 这是if条件语句里面的代码,将i值赋值为4,同理,dword ptr ebp-8 是通过ebp -8 找寻到i的地址单元,然后dword ptr 说明字节数,mov指令将4赋给这个地址(就是i的存放地址);012213A2 xor eax,eax 程序返回 0 eax清零代码清单4int _tmain(int argc, _TCHAR* argv) int i = 3; if(i=3) i = 4; return 0;下面是代码清单4的反汇编代码及解释 int i = 3;002B138E mov dword ptr ebp-8,3

24、if(i = 3)002B1395 cmp dword ptr ebp-8,3 002B1399 jne 002B13A2 i = 4;002B139B mov dword ptr ebp-8,4 return 0;002B13A2 xor eax,eax *int i = 3;002B138E mov dword ptr ebp-8,3 定义一个int型的变量i,赋值为3,ebp-8 ebp - 8 是i变量地址, ebp-8 是i变量, dword ptr 是指明该地址数据由4字节构成,然后通过mov指令将3赋值给i。 if(i = 3)002B1395 cmp dword ptr ebp

25、-8,3 dword ptr ebp-8是指明数据字节数,获取i数据值(ebp-8 是i变量的地址,ebp-8 是i变量),cmp是将i值与3进行比较,其实就是执行i - 3,然后在标志寄存器(PSW-Program Status Word)的各位反应比较的结果。002B1399 jne 002B13A2 通过与代码清单2的比较我们可以得出,jne(jne,jump if not equal )是当第一个操作数不等于第二个操作数的时候进行跳转。且跳转地址就是return 0代码的地址。 i = 4;002B139B mov dword ptr ebp-8,4 这是if条件语句里面的代码,将i值

26、赋值为4,同理,dword ptr ebp-8 是通过ebp -8 找寻到i的地址单元,然后dword ptr 说明字节数,mov指令将4赋给这个地址(就是i的存放地址);002B13A2 xor eax,eax 程序返回 0 eax清零 实验有要求:另外,还可以自行实验=时的情况。在实验报告中,给出这些情况的反汇编代码及解释。最后,在实验报告中,总结出条件判断语句的反汇编代码规则。下面是在=情况下的反汇编代码: int i = 3;00CF138E mov dword ptr ebp-8,3 /if(i = 3) if(i=3)00CF1395 cmp dword ptr ebp-8,3 0

27、0CF1399 jl 00CF13A2 i = 4;00CF139B mov dword ptr ebp-8,4 return 0;00CF13A2 xor eax,eax *下面只是解释这句不同的代码:00CF1399 jl 00CF13A2 通过与代码清单2的比较我们可以得出,jl(jne,jump if less )是当第一个操作数小于第二个操作数的时候进行跳转。且跳转地址就是return 0代码的地址。 下面是=3) if(i=3)008C1395 cmp dword ptr ebp-8,3 008C1399 jg 008C13A2 i = 4;008C139B mov dword p

28、tr ebp-8,4 return 0;008C13A2 xor eax,eax *008C1399 jg 008C13A2 通过与代码清单2的比较我们可以得出,jg(jne,jump if greater )是当第一个操作数大于第二个操作数的时候进行跳转。且跳转地址就是return 0代码的地址。条件判断语句的反汇编代码规则:由两条汇编指令构成:cmp 操作数1 操作数2 和jXX 地址cmp用于条件判断比较Jxx 用于在不符合判断的情况下跳转到后面的代码处 jg(jne,jump if greater )jl(jne,jump if less )jne(jne,jump if not equal )jge(jge,jump if greater or equal )jle(jle,jump if light or equal)2.3 if/else语句的反汇编代码清单5int _tmain(int argc, _TCHAR* argv) int i = 3; if(i3) i = 4; el

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

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