




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程设计报告一. 需求分析1、一个完整的系统应具有以下功能:(1) I :初始化(Initialization )。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件 hfmTree 中。(2) E:编码(Encoding )。利用已建好的哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件 ToBeTran 中的正文进行编码,然后将结果存入文件 CodeFile 中。(3) D :译码(Decoding )。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件 TextFile 中。(4) P:印代码文件(Print )。将文件 Code
2、File以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件中。(5) T:印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。2、利用哈夫曼编译码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传 输成本。3、 用户界面可以设计为“菜单”方式:显示上述功能符号,再加上“Q”,表示退出运 行 Quito 。请用户键入一个选择功能符。此功能执行完毕后再显示此菜单,直至某次用户选择了“ Q”为止。4、 在程序的一次执行过程中,第一次执行I,D或C命令之后,哈夫
3、曼树已经在内存 了,不必再读入。每次执行中不一定执行 I命令,因为文件hfmTree可能早已建好。二、概要设计1 、部分函数1 ) 树与编码类型struct HTNode2) 选两个最小的树组成二叉树Void Select(HNode *HT,int I,int &s1,int &s2)3) 初始化哈夫曼树void Initialization(HTNode *&HT,HuffmanCode *&HC,int *&w,char *&x,int &n)4) 输出哈夫曼树void TreePrint(HTNode *HT,int n)5) 输出哈夫曼编码void CodePrint(Huffman
4、Code *HC,int n)2、主函数void main()初始化 ;Switch() end;3、模块之间的调用关系三、详细设计1、树的结构体的建立struct HTNodeint weight,parent,lchild,rchild;char zifu;struct HuffmanCodechar *code;char zifu;int size;2、部分编码void Select(HTNode *HT,int i,int &s1,int &s2) int k;for(k=1;k=i;k+)if(HTk.parent=0) s1=k; break; for(k=k+1;k=i;k+)
5、if(HTk.parent=0) s2=k; break; for(k=k+1;k=i;k+) if(HTk.parent=0) if(HTk.weightHTs1.weight) if(HTk.weightHTs2.weight) if(HTs2.weightHTs1.weight) s1=s2; s2=k; else s2=k; else s1=s2; s2=k; else if(HTk.weightHTs2.weight) s2=k;void HuffmanCoding(HTNode *&HT,HuffmanCode *&HC,char *x,int *w,int n) if(n=1)r
6、eturn;int m=2*n-1,i,s1,s2;HTNode *p;HT=(HTNode *)malloc(m+1)*sizeof(HTNode);for(p=HT+1,i=1;iweight=*w,p-parent=0,p-lchild=0,p-rchild=0,p-zifu=*x;for(;iweight=0,p-parent=0,p-lchild=0,p-rchild=0,p-zifu=N;for(i=n+1;i=m;i+)Select(HT,i-1,s1,s2);HTs1.parent=i;HTs2.parent=i;HTi.lchild=s1;HTi.rchild=s2;HTi.
7、weight=HTs1.weight+HTs2.weight;char *CD;int k,j;CD=(char *)malloc(n*sizeof(char);for(i=1;i=n;i+)j=i;k=0;while(HTj.parent!=0)if(HTHTj.parent.lchild=j)CDk=0;elseCDk=1;k+;j=HTj.parent;HCi-1.code=(char *)malloc(k+1)*sizeof(char);HCi-1.codek=0;k-;int m=k;HCi-1.size=m;for(int l=0;l=m;l+)HCi-1.codel=CDk; k
8、-;HCi-1.zifu=HTi.zifu;free(CD);int Strsize(char *d) int i=0; while(*d!=0)d+; i+; return i;char* Bianma(HuffmanCode *&HC,char *d) / 哈夫曼树编码int n=Strsize(d),i,k,j,sum=0; char *a;a=(char *)malloc(10*n)*sizeof(char); for(i=0;in;i+)k=0;while(*d!=HCk.zifu) k+;j=0; while(HCk.codej!=0) asum=HCk.codej; j+;sum
9、+; d+; asum=0; return a;void Yima(HTNode *HT,char *&a,char *b,int n)int k=2*n-1,i=0;int m=k; while(*b!=0)if(*b=0) if(HTHTm.lchild.lchild=0) ai=HTHTm.lchild.zifu;i+; b+; m=k;else m=HTm.lchild; b+;else if(HTHTm.rchild.lchild=0) ai=HTHTm.rchild.zifu;i+;b+;m=k;else m=HTm.rchild; b+; ai=0;void Initializa
10、tion(HTNode *&HT,HuffmanCode *&HC,int *&w,char *&x,int &n) / 初始化哈夫曼树printf( 输入字符集大小 nn);scanf(%d,&n);fflush(stdin);w=(int *)malloc(n*sizeof(int);x=(char *)malloc(n*sizeof(char);for(int i=0;in;i+)printf( 输入第 %d 个字符和权值 :n,i+1);scanf(%c %d,&xi,&wi); fflush(stdin);HC=(HuffmanCode *)malloc(n*sizeof(Huffm
11、anCode); HuffmanCoding(HT,HC,x,w,n);void TreePrint(HTNode *HT,int n)/ 输出哈夫曼树for(int i=1;i(2*n);i+)printf(%c %d %d %d %dn,HTi.zifu,HTi.weight,HTi.parent,HTi.lchild,HTi.rchild);void CodePrint(HuffmanCode *HC,int n)/ 输出哈夫曼编码for(int i=0;in;i+)printf(%c ,HCi.zifu);puts(HCi.code);3、主程序void main()HTNode *H
12、T;HuffmanCode *HC;int n,*w;char *x,*y,Z;char *a,*b;a=(char *)malloc(100*sizeof(char);b=(char *)malloc(100*sizeof(char);start:printf(”初始化i,编码e,译码d,印哈夫曼码 p,印哈夫曼树t,退出q。n); scanf(%c,&Z);fflush(stdin);switch(Z)case i:Initialization(HT,HC,w,x,n);goto start;case e:gets(a);fflush(stdin); y=Bianma(HC,a);puts
13、(y);goto start;case d:gets(b);fflush(stdin); Yima(HT,a,b,n);puts(a);goto start;case p:CodePrint(HC,n); goto start;case t:TreePrint(HT,n);goto start;case q:goto end; end:4、函数的调用关系图四、设计和调试分析1、禾U用哈夫曼编译码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传 输成本。2、 在程序的一次执行过程中,第一次执行I, D或C命令之后,哈夫曼树已经在内存了,不必再读入。每次执行中不一定执行I命令,因为文件hf
14、mTree可能早已建好。3、在译码时,由于对程序的不是很了解,把两个循环搞错,最后导致无法正确译码。五、用户手册1、 本程序的运行环境为Windows操作系统,执行文件为:Untitled1.exe2、进入演示程序后,按要求键入。3、之后即显示文本方式的用户界面:4、进入“初始化命令”后,即提示输入字符的大小,字符以及权值。5、进入“印代码文件”命令后,终端显示哈夫曼编码6、进入“印哈夫曼树”命令后,终端显示哈夫曼树。六、测试结果七、附录#in clude#in cludestruct HTNodeint weight,pare nt,lchild,rchild;char zifu;;stru
15、ct Huffma nCodechar *code;char zifu;int size;void Select(HTNode *HT,int i,int &s1,int &s2) int k;for(k=1;k=i;k+)if(HTk.pare nt=O) s1=k; break; for(k=k+1;k=i;k+)if(HTk.parent=0)s2=k;break; for(k=k+1;k=i;k+)if(HTk.parent=0)if(HTk.weightHTs1.weight) if(HTk.weightHTs2.weight) if(HTs2.weightHTs1.weight)s
16、1=s2;s2=k;elses2=k;elses1=s2;s2=k;else if(HTk.weightHTs2.weight)s2=k;void HuffmanCoding(HTNode *&HT,HuffmanCode *&HC,char *x,int *w,int n)if(n=1)return;int m=2*n-1,i,s1,s2;HTNode *p;HT=(HTNode *)malloc(m+1)*sizeof(HTNode); for(p=HT+1,i=1;iweight=*w,p-parent=0,p-lchild=0,p-rchild=0,p-zifu=*x; for(;iw
17、eight=0,p-parent=0,p-lchild=0,p-rchild=0,p-zifu=N; for(i=n+1;i=m;i+)Select(HT,i-1,s1,s2);HTs1.parent=i;HTs2.parent=i;HTi.lchild=s1;HTi.rchild=s2;HTi.weight=HTs1.weight+HTs2.weight;char *CD;int k,j;CD=(char *)malloc(n*sizeof(char);for(i=1;i=n;i+)j=i;k=0;while(HTj.parent!=0)if(HTHTj.parent.lchild=j)CD
18、k=0;elseCDk=1;k+;j=HTj.parent;HCi-1.code=(char *)malloc(k+1)*sizeof(char);HCi-1.codek=0;k-;int m=k;HCi-1.size=m;for(int l=0;l=m;l+)HCi-1.codel=CDk; k-;HCi-1.zifu=HTi.zifu; free(CD);int Strsize(char *d)int i=0;while(*d!=0)d+;i+;return i;char* Bianma(HuffmanCode *&HC,char *d)int n=Strsize(d),i,k,j,sum
19、=0;char *a;a=(char *)malloc(10*n)*sizeof(char);for(i=0;in;i+)k=0;while(*d!=HCk.zifu)k+;j=0;while(HCk.codej!=0)asum=HCk.codej;j+;sum+;d+;asum=0;return a;void Yima(HTNode *HT,char *&a,char *b,int n)int k=2*n-1,i=0;int m=k; while(*b!=0) if(*b=0) if(HTHTm.lchild.lchild=0) ai=HTHTm.lchild.zifu; i+; b+; m
20、=k;else m=HTm.lchild; b+;else if(HTHTm.rchild.lchild=0) ai=HTHTm.rchild.zifu;i+;b+;m=k;else m=HTm.rchild; b+; ai=0;void Initialization(HTNode *&HT,HuffmanCode *&HC,int *&w,char *&x,int &n) printf( 输入字符集大小 nn); scanf(%d,&n);fflush(stdin);w=(int *)malloc(n*sizeof(int);x=(char *)malloc(n*sizeof(char);for(int i=0;in;i+)printf( 输入第 %d 个字符和权值 :n,i+1);scanf(%c %d,&xi,&wi); fflush(stdin);HC=(HuffmanCode *)malloc(n*sizeof(HuffmanCode); HuffmanCoding(HT,HC,x,w,n);void TreePrint(HTNode *HT,int n)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 游戏化教学在小学课堂的有效性
- 艺术课程思政协同化教学体系的策略及实施路径
- 2024年玉林市陆川县公安局招聘警务辅助人员真题
- 2024年马鞍山在安徽定向选调生中开展人才引进真题
- 混合现实技术在职业教育中的应用与策略
- 甘肃省兰州大学第一医院招聘笔试真题2024
- 信托组织管理制度
- 信访信箱管理制度
- 采购总监岗位月度绩效考核表
- 公司l车间管理制度
- 2025国开电大《个人与团队管理》形考任务1-10答案
- 湖南2024生地会考试卷及答案
- 2024小学语文教学及说课课件:六年级上册《只有一个地球》
- 墙面干挂瓷砖技术交底
- 运输设备(铁路车辆、轨道平车)专项安全检查记录表
- PLC装配流水线模拟控制课程设计
- biggs学习策略问卷SPQ-英文版
- 新闻发布系统-需求规格说明书
- (完整word版)最新防雷装置检测工程质量管理手册
- DL_5000-2000_火力发电厂设计技术规程
- 四害密度监测工作实施方案
评论
0/150
提交评论