编译器实验报告.doc_第1页
编译器实验报告.doc_第2页
编译器实验报告.doc_第3页
编译器实验报告.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

篇一:编译器实验报告甘肃政法学院本科学生实验报告姓名 学院 专业 班级试验时间 2012 年 12 月 20日 指导教师及职称实验成绩 开课时间 2012-2013 学年 1学期实验课程名称 编译原理甘肃政法学院实验管理中心印制篇二:编译器测试实验报告深 圳 大 学 实 验 报 告课程名称:实验项目名称:学院:计算机与软件学院班级:实验时间:实验报告提交时间:教务处制2342、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。5篇三:哈弗曼编译器实验报告实习报告题目:哈弗曼编译码器班级:电信系 通信工程0902班完成日期:2010.11一、 需求分析1、编写哈弗曼编译码器,其主要功能有(1)i:初始化(initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树。(2)e:编码(encoding)。利用已建好的哈夫曼树),对从终端输入的正文进行编码,然后从终端输出。(3)d:译码(decoding )。利用已建好的哈夫曼树将从终端输入的代码进行译码,结果从终端输出。(4)p:印哈夫曼树(print)。将已编码的的哈夫曼树显示在终端上,同时将此字符形式的哈夫曼树。2、测试数据:输入的字符=a, b, c, d, e其对应的权值=5,29,7,8,14二、 概要设计1、二哈弗曼树的抽象数据类型定义为:adt huffmantree数据对象d:d是具有相同性质的数据元素的集合数据关系r:若d=,则r= ,哈弗曼树为空若d,则r= h,h是如下二元关系:(1) 在d中存在唯一的称为根的数据元素root,它在关系h下无前驱(2) 若d-root,则存在d-root=dl,dr。且dldr=(3) 若dl,则dl中存在唯一的数据元素xl,<root, xl>属于h,且存在dl上的关系h1属于h。若dr,则dr中存在唯一的数据元素xr,<root, x>属于h,且存在dr上的关系hr属于hh=<root, xl>,<root, x>,hl,hr;(4) (dl,hl)是一棵符合本定义的哈弗曼树,称为根的左子树。(dr,hr)是一棵符合本定义的哈弗曼树,称为根的右子树。基本操作:huffmancoding(&ht, &hc, &sum)操作结果:建立哈弗曼树并进行编码将编码存放在hc中,并返回字符的个数。encoding(ht, hc, sum)操作结果:利用已建立的哈弗曼树对字符进行编码decoding(huffmantree ht,huffmancode hc,int sum)操作结果:对输入的密码进行翻译print(ht, hc, sum)操作结果:打印建立好的哈弗曼树adt huffmantree三、 详细设计(1)哈弗曼树每个节点的定义:typedef structunsigned int weight;unsigned int parent,lchild,rchild;char elemt20;htnode,*huffmantree;(2)定义指向哈弗曼树的指针,用于动态分配空间typedef char *huffmancode;(3)哈弗曼树的基本操作void huffmancoding(huffmantree &ht, huffmancode &hc, int *w, intn)/建立哈弗曼树,求出哈弗曼编码if (n<=1)return;m=2*n-1; /n 个叶子的huffmantree共有2n-1个结点ht=(huffmantree)malloc(m+1)*sizeof(htnode);for(p=ht+1,i=0; i<n; +i,+p,+w)*p=*w,0,0,0;/给前n个单元初始化for(;i<=m; +i,+p)*p =0,0,0,0; /从叶子之后的存储单元清零 for(i=n+1;i<=m; +i)/建huffman树(从n个叶子后开始存内结点)select(ht, i-1, s1, s2);/选择parent为0且weight最小的两个结点,hts1.parent=i; hts2.parent=i; /给双亲分量赋值hti.lchild=s1; hti.rchild=s2; /给合并后的内结点赋孩子值hti.weight=hts1.weight+ hts2.weight;/以上建立了哈弗曼树,以下求哈弗曼编码hc=(huffmancode)malloc(n+1)*sizeof(char*);/分配n个字符编码的头指针向量(一维数组)cd=(char*) malloc(n*sizeof(char); /分配求编码的临时最长空间cdn-1=“0”; /编码结束符(从cd0cdn-1为合法空间)for(i=1;i<=n;+i) /逐个字符求huffman编码start=n-1;/编码结束符位置for(c=i,f=hti.parent;f!=0;c=f, f=htf.parent)/从叶子到根逆向求编码if(htf.lchild=c) cd-start=“0”;else cd-start=“1”;hci=(char*)malloc(n-start)*sizeof(char);/为第i个字符编码分配空间,并以数组形式存放各码串指针strcpy(hci,&cdstart); /从cd复制编码串到hc所指空间free(cd); /释放临时空间/huffmancodingfor(i=0; i<n; +i)start=n-1;/编码结束符位置for(c=i, f=hti.parent;f!=0;c=f, f=htf.parent) if(htf.lchild=c) cd-start=“0”;else cd-start=“1”; / /从叶子到根逆向求编码/ huffmancodingvoid encoding(huffmantree ht,huffmancode hc,int sum)/利用已经建立的哈弗曼树对输入的字符进行哈弗曼编码for(int i=0;ai!=0;i+)/依次判断字符的对应的哈弗曼编码for(int n=0;htn.elemt0;n+)/查找ai在哈弗曼树中的位置strcpy(p,hcn);p=p+strlen(hcn);break;/把编码复制接到code后i=0;printf(得到的编码是:n);while(codei!=0) /输出字符对应的哈弗曼编码printf(%c,codei+);/ encodingvoid decoding(huffmantree ht,huffmancode hc,int sum) /译码while(code1i!=0)if(code1i=0) b=htb.lchild;/当遇到0时指向哈弗曼树的左子树else if(code1i=1) b=htb.rchild;/当遇到1时指向哈弗曼树的右子树if(htb.lchild=0&&htb.rchild=0)/当左右子树均为空时表明已找到对应的字符a1n+=htb.elemt0;b=2*sum-2;/将对应的字符放在数组a1中并重新设置b的值继续翻译i+;/ decodingvoid print(huffmantree ht,huffmancode hc,int sum)/打印哈弗曼树for(int i=0;i<2*sum-1;i+)/从首元素开始,逐个输入哈弗曼树的各项数据printf(%d%c%d%d%d,i,hti.elemt0,hti.parent,hti.lchild,hti.rchild);/ print四、调试分析1、由于书上有详细的建立哈弗曼树的算法,编码,译码,打印哈弗曼树的算法比较简单,程序的模块比较简单,所以整体的思路比较清晰,但是在将算法,写为c语言的过程中,出现了很多的语法和逻辑上的错误,所以用了很多的时间调试,修改错误。2本本次试验吸取上第一次试验的经验教训,注意了对挡板的设置,程序能够对出现的错误进行适

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论