数据结构课设报告哈夫曼编译器C语言源码_第1页
数据结构课设报告哈夫曼编译器C语言源码_第2页
数据结构课设报告哈夫曼编译器C语言源码_第3页
数据结构课设报告哈夫曼编译器C语言源码_第4页
数据结构课设报告哈夫曼编译器C语言源码_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

1、中南大学数据结构课程设计报告题 目 哈夫曼编译器 学生姓名 孙毅 指导教师 杨希 学 院 信息科学与工程学院 专业班级 信息安全1401班 二一六 年 十一 月目录一、课程设计目的3二、课程设计的内容32.1、问题描述32.2、基本要求3三、 问题描述,解决的方法33.1从键盘读入字符集大小n , 以及n个字符和权值,建立哈夫曼树。33.2利用已建好的哈夫曼树对文件正文进行编码,将结果存入相关文件中。53.3利用已建好的哈夫曼树将编码文件中的代码进行译码,结果存入文件中。63.4输出代码文件,以紧凑格式显示。73.5以直观的方式输出哈夫曼树,同时将此字符形式的哈夫曼树写入文件中。7四、 程序模

2、块功能,程序设计组成框图、流程图84.1程序模块功能84.2程序设计框图84.3流程图9五、 调试与测试。调试方法,测试结果的分析与讨论,遇到的主要问题及采取的解决措施。105.1调试方面105.2测试结果方面10六、测试结果,用几组测试数据进行测试算法设计的正确性106.1第一组数据如下106.2第二组测试数据如下:14七、 本次课程设计的心得体会16八、 附录:源程序清单17一、课程设计目的数据结构是计算机专业的核心课程,是计算机科学的算法理论基础和软件设计的技术基础,实践性强,课程设计是加强学生实践能力的一个重要手段。课程设计要求学生在完成程序设计的同时能够写出规范的设计报告,培养学生分

3、析问题、解决问题,提高学生软件设计能力。二、课程设计的内容哈夫曼编译器2.1、问题描述利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码。对于双向传输信息的信道,每端都需要一个完整的编译码系统。为这样的信息收发站编写哈夫曼编译系统。2.2、基本要求(1)从键盘读入字符集大小n , 以及n个字符和权值,建立哈夫曼树。(2)利用已建好的哈夫曼树对文件正文进行编码,将结果存入相关文件中。(3)利用已建好的哈夫曼树将编码文件中的代码进行译码,结果存入文件中。(4)输出代码文件,以紧凑格式显示。(5

4、)以直观的方式输出哈夫曼树,同时将此字符形式的哈夫曼树写入文件中。3、 问题描述,解决的方法 3.1从键盘读入字符集大小n , 以及n个字符和权值,建立哈夫曼树。 a.首先设计一个结构体,成员有权值、左右儿子、以及字符本身,再设计一个输入函数,函数中要求输入字符集大小n,以及这n个字符和他们各自对应的权值。b.再根据以上的各种输入结合建立哈夫曼树的思想原理建立起哈夫曼树,设计的函数包括有两个,一个是选中最小权值的两棵树,另一个是创建哈夫曼树。3.2利用已建好的哈夫曼树对文件正文进行编码,将结果存入相关文件中。 a.第一步是要求用户输入待编码文件的路径,再根据路径读取待编码文件里的内容,再利用哈

5、夫曼树将内容编码。b.将编码的结果存入文件中,文件起名为编码结果.txt,这个工作已经在编码路径的同时并完成了。3.3利用已建好的哈夫曼树将编码文件中的代码进行译码,结果存入文件中。 a.跟(2)是一样的,先是要求用户输入待译码文件的路径,再根据路径读取待译码文件里的内容,再利用哈夫曼树将内容进行译码,只是这里的待译码文件即是前面的编码结果.txt。b.在将译码结果打印到窗口的同时写进文件里面,文件命名为译码结果.txt3.4输出代码文件,以紧凑格式显示。 这一步在将编码或者译码结果进行写文件的同时已经将结果打印到了窗口。3.5以直观的方式输出哈夫曼树,同时将此字符形式的哈夫曼树写入文件中。

6、挨个将各个节点的内容的值打印到窗口以及写入文件,文件名为哈夫曼树.txt。4、 程序模块功能,程序设计组成框图、流程图 4.1程序模块功能 本编译器本人给简单的设计为四个模块,分别是:输入字符相关内容并建立哈夫曼树、根据哈夫曼树对文件内容进行编码、根据哈夫曼树对文件内容进行译码以及退出功能。4.2程序设计框图开始从键盘输入字符相关内容并建立哈夫曼树编码译码退出 4.3流程图显示译码结果并写入文件输入待编码文件路径输入待译码文件路径i=1i=2i!=0开始输入字符集大小n输入这n个字符以及权值输入序号i进行编码与译码及退出的选择结束 no yes noYesno显示编码结果并写入文件yes5、

7、调试与测试。调试方法,测试结果的分析与讨论,遇到的主要问题及采取的解决措施。 5.1调试方面 本次程序用的语言是C,在文件读写方面多多少少有些忘记了,所以本人此次的代码编写部分就大概分为两个阶段来完成的,第一个阶段就是完成建立哈夫曼树、写好编码以及译码函数,和主函数;第二部分呢就是完成读写文件。 在第一阶段完成后,利用键盘输入的方式进行了编码与译码,测试还算顺利,在多次对比之下结果也鉴定为正确。 在第二阶段的读写文件代码编写过程中,读文件的相关操作还算顺利,但就是在写文件上出了不少的岔子,首先第一个问题出在字符串的定义上,开始是俩字符串死活接不上,后来字符串的定义方式改成了这样:。可算是成功的

8、接上了两个字符串,但是后来发现,起始一个文件在打开之后关闭之前,写的内容是不会被覆盖的,只是在再次打开并进行写操作是才会被覆盖掉,所以后来也就没有对两个字符串进行连接,只是依次写入了文件而已。 这只是在进行编码过程中的写文件的一个小坎坷,后来在写译码函数时的写文件时,那是死活都写不进去,尽管是效仿编码时的写法与否,都不行,后来是将文件的打开与关闭放在了函数的外面才可行的,但应该不是直接的原因,具体是怎么样现在也想不起来了,所以现在开始意识到在写代码的过程中写一份记录程序进程文档是很有必要的。 5.2测试结果方面 在测试结果这方面,由于完完全全是一步一步的按照课程设计的要求来写的所以也不存在一些

9、意想不到的错误,出了在写文件上花了些脑筋意外,测试还算顺利。六、测试结果,用几组测试数据进行测试算法设计的正确性 6.1第一组数据如下 字符集大小n=3; 字符本身以及权值分别为:a,b,c和2,1,3; 待编码文件内容为:aaaaaabbbbbbcccccc。哈夫曼树.txt的内容为:选择编码并输入带编码文件的路径:按回车键进行编码:查看待编码以及编码结果两个文件的内容进行验证:选择译码并输入带编码文件的路径:按回车键进行译码:查看译码结果文件夹进行验证:选择3看有什么情况:选择退出:6.2第二组测试数据如下: 字符集大小n=6; 自负本身以及权值分别是:a,b,c,d,e,f和9,0,1,

10、3,2,5; 待编码文件内容为:aaabbbcccdddeeefff。查看哈夫曼树.txt文件:选择1编码并输入待编码文件的路径:回车进行编码:查看待编码和编码结果俩个文件进行验证:选择2译码并输入待译码文件的路径:回车进行译码:查看译码结果文件进行验证:7、 本次课程设计的心得体会本次课程设计的心得主要是在文件的相关操作的学习上,之前是没有怎么学文件的相关操作,通过本次的课程设计,本人对C语言的文件的相关操作有了相当的了解,并成功的完成了课程设计所要求的文件的读写功能,可以说是有很大的收获的,不仅仅是在文件操作的这一单方面。在完成一个课题之前,要仔细理解课题要求。我在此次课程设计中犯的最严重

11、的错误,应该算没有仔细审题。课题的要求是用读取文件的方式输入需要编码字符,译码所需的编码代号也要用文本方式输入。我在拿到这个课题的时候,因为没有仔细理解这些要求,就采用了键盘输入字符进行编码和译码的方式,以致走了不少弯路。 另外,这次课程设计充分暴露了我的惰性思想。在拿到这个课题后,因为对哈夫曼编码这个知识点理解比较到位,所以没花多少时间就完成了课题要求实现的功能。然而,在此之后,我由于自我感觉良好和惰性,没有积极地去寻找改进程序的方法,也没对程序运行的界面进行美化,使其拥有良好的用户使用体验。最终在答辩的时候,交给老师的是一个界面简陋的程序。  通过这次课程设计,我更加深入了理解了

12、哈夫曼编码的过程,以及利用哈夫曼编码对数据进行压缩的优越性,并且使我能够更熟练地运用树形的数据结构。并且体会到了在学习中,要严格要求自己,不能因为一点点的成功就骄傲自满,停止不前。  8、 附录:源程序清单#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXLEN 100typedef struct int weight; int lchild; int rchild; int parent; char key;htnode;typedef htnode hfmtMA

13、XLEN;int n;void inithfmt(hfmt t)/对结构体进行初始化 int i; printf("n"); printf("-n"); printf("*输入区*n"); printf("n请输入字符集大小n="); scanf("%d",&n); getchar(); for(i=0;i<2*n-1;i+)/对结构体进行初始化 ti.weight=0; ti.lchild=-1; ti.rchild=-1; ti.parent=-1; printf("

14、n");void inputweight(hfmt t)/输入函数 int w;/w表示权值 int i; char k;/k表示获取的字符 for(i=0;i<n;i+) printf("请输入第%d个字符:",i+1); scanf("%c",&k); getchar(); ti.key=k; printf("请输入第%d个字符的权值:",i+1); scanf("%d",&w); getchar(); ti.weight=w; printf("n"); vo

15、id selectmin(hfmt t,int i,int *p1,int *p2)/选中两个权值最小的函数 long min1=999999; long min2=999999; int j; for(j=0;j<=i;j+)/选择最小权值字符的下标返回 if(tj.parent=-1) if(min1>tj.weight) min1=tj.weight; *p1=j; for(j=0;j<=i;j+)/选择次小权值字符的下标还回 if(tj.parent=-1) if(min2>tj.weight && j!=(*p1)/注意 j!=(*p1) mi

16、n2=tj.weight; *p2=j; void creathfmt(hfmt t)/创建哈夫曼树的函数 int i,p1,p2; inithfmt(t); inputweight(t); for(i=n;i<2*n-1;i+) selectmin(t,i-1,&p1,&p2); tp1.parent=i; tp2.parent=i; ti.lchild=p1; ti.rchild=p2; ti.weight=tp1.weight+tp2.weight; void printhfmt(hfmt t)/打印哈夫曼树 FILE *f1; char str10000; cha

17、r *s; int i; if(f1=fopen("哈夫曼树.txt","w")!=NULL) printf("-n"); s = "-n" fprintf(f1,"%s",s); printf("*哈夫曼树关系结构*n"); s = "*哈夫曼树关系结构*n" fprintf(f1,"%s",s); printf("tt权重t父母t左孩子t右孩子t字符t"); s = "tt权重t父母t左孩子t右孩子t字

18、符t" fprintf(f1,"%s",s); for(i=0;i<2*n-1;i+) printf("n"); printf("tt%dt%dt%dt%dt%c",ti.weight,ti.parent,ti.lchild,ti.rchild,ti.key); fprintf(f1,"ntt%dt%dt%dt%dt%c",ti.weight,ti.parent,ti.lchild,ti.rchild,ti.key); printf("n-n"); s = "n-n&q

19、uot; fprintf(f1,"%s",s); fclose(f1); printf("已将哈夫曼树存入文件,文件名为:哈夫曼树nn"); char ch;FILE *f2;void hfmtpath(hfmt t,int i,int j)/编码的重要哈夫曼树路径递归算法 int a,b; a=i; b=j=ti.parent; if(tj.parent!=-1) i=j; hfmtpath(t,i,j); if(tb.lchild=a) printf("0"); fputc('0',f2); else printf

20、("1"); fputc('1',f2); void phfmnode(hfmt t)/对字符进行初始编码 int i,j,a; printf("n-n"); printf("*哈夫曼编码*"); printf("ntt字符t权值t编码结果"); for(i=0;i<n;i+) j=0; printf("n"); printf("tt%ct%dt",ti.key,ti.weight); hfmtpath(t,i,j); printf("n-n&

21、quot;);void encoding(hfmt t)/对用户输入的文件的内容进行编码 FILE *f3; char r1000,h1000;/用来存储输入的字符串 int i,j; printf("nn请输入需要编码的文件路径:"); gets(h); f3=fopen(h,"r"); fgets(r,1000,f3); printf("n待编码文件正文内容为:%sn",r); printf("编码结果为:"); for(j=0;rj!='0'j+) for(i=0;i<n;i+) if(

22、rj=ti.key) hfmtpath(t,i,j); fclose(f3); printf("nn已将编码结果存入文件,文件名为:编码结果nn");FILE *f5;void decoding(hfmt t)/对用户输入的密文进行译码 FILE *f4; char r1000,h1000; int i,j,len; j=2*n-2;/j初始从树的根节点开始 printf("nn请输入需要译码的文件路径:"); gets(h); f4=fopen(h,"r"); fgets(r,1000,f4); len=strlen(r); pri

23、ntf("n待译码文件中的代码为:%sn",r); printf("译码的结果是:"); /f5=fopen("译码结果.txt","w"); for(i=0;i<len;i+) if(ri='0') j=tj.lchild; if(tj.lchild=-1) printf("%c",tj.key); fputc(tj.key,f5); j=2*n-2; else if(ri='1') j=tj.rchild; if(tj.rchild=-1) printf

24、("%c",tj.key); fputc(tj.key,f5); j=2*n-2; fclose(f4); /fclose(f5); printf("nn已将译码结果存入文件,文件名为:译码结果nn");int main() int i,j; hfmt ht; char flag; printf(" |-|n"); printf(" | 信安1401-孙毅-CSU |n"); printf(" |*|n"); printf(" | 哈夫曼编码课程设计 |n"); printf(" |*|n"); printf(" |

温馨提示

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

评论

0/150

提交评论