




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、哈夫曼编译码器代码课程设计具体要求描述设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。【基本要求】1) 将权值数据存放在数据文件(文件名为data.txt,位于执行程序的当前目录中) 2) 分别采用动态和静态存储结构3) 初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;4) 编码:利用建好的哈夫曼树生成哈夫曼编码;5) 输出编码;6) 设字符集哈夫曼编译码器代码课程设计哈夫曼编译码器代码课程设计具体要求描述设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。【基本要求】1) 将权值数据存放在数据文件(文件名为d
2、ata.txt,位于执行程序的当前目录中) 2) 分别采用动态和静态存储结构3) 初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;4) 编码:利用建好的哈夫曼树生成哈夫曼编码;5) 输出编码;6) 设字符集及频度如下表:字符 空格 A B C D E F G H I J K L M频度 186 64 13 22 32 103 21 15 47 57 1 5 32 20字符 N O P Q R S T U V W X Y Z 频度 57 63 15 1 48 51 80 23 8 18 1 16 1 【进一步完成内容】1)对任意输入的一段字符,统计字符出现的频度,完成哈夫曼编码;
3、2)译码功能;3)显示哈夫曼树;4)界面设计的优化。哈夫曼编译码器 需求分析: (1)再通信过程中,为了提高信道利用率,缩短信息传输时间降,低传输成本 ,需要一编译码器。 (2)此哈夫曼编/译码器应具有编和译的双向功能,即在发送端通过编码系统对传入的数据进行编码, 在接受端将数据译码.将具有这两项功能的编译码器用于双工信道,就可满足 双工信道的双向编译功能. (3)输入某段报文时,系统将自动完成编译输出. 要求: 1:I:初始化。从中端读入字符集大小n,以及n个字符和n各权值 ,建树,并存于hfmTree中 2:E:编码。利用已建好的树(如不在内存,则从文件hfmTree中读入),对文件 To
4、BeTran中的正文进行编码, 然后将结果存入文件CodeFile . 3:D:译码。利用已建好的树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。 4: P:印代码文件CodeFile。将文件以紧凑格式显示在终端上,每行50个代码 。 同时将此字符形式的编码文件写入文件CodePrin中。 5 T:印哈夫曼树。将已在内存中的树以直观的方式(树或凹入表形式)显示在终端,同时将此字符形式 的哈夫曼树写入文件TreePrin中。 以上是题目要求# define max 50 struct a int weight; int parent,lchild,rchild; ; s
5、truct b char cdmax; int start; ; main() struct a ht2*max; struct b hcdmax,d; int i,j,k,n,c,s1,s2,m1,m2,f; printf("shu ru n: "); scanf("%d",&n); for(i=1;i<=n;i+) printf("shu ru quan zhi :"); scanf("%d",&hti.weight); hti.parent=0; for(;i<=2*n-1;i+)
6、 hti.parent=hti.lchild=hti.rchild=0; for(i=n+1;i<=2*n-1;i+) m1=m2=30000; s1=s2=0; for(k=1;k<=i-1;k+) if(htk.parent=0 && htk.weight<m1) m2=m1; s2=s1; m1=htk.weight; s1=k; else if(htk.parent=0 && htk.weight<m2) m2=htk.weight; s2=k; hts1.parent=hts2.parent=i; hti.lchild=s1;
7、hti.rchild=s2; hti.weight=hts1.weight+hts2.weight; for(i=1;i<=n;i+) d.start=n-1; c=i; f=hti.parent; while(f) if(htf.lchild=c)d.cd-d.start='0' else d.cd-d.start='1' c=f; f=htf.parent; hcdi=d; printf("shu chu ha fu bian ma "); for(i=1;i<=n;i+) printf("%d ",hti
8、.weight); for(k=hcdi.start;k<n-1;k+) printf("%c",hcdi.cdk); printf(" "); 程序设计方案2哈夫曼编/译码器(课程设计)#include <iomanip.h>#include <string.h>#include <malloc.h>#include <stdio.h>/typedef int TElemType;const int UINT_MAX=1000;typedef structint weight;int parent,
9、lchild,rchild;HTNode,* HuffmanTree;typedef char *HuffmanCode;/-全局变量-HuffmanTree HT;HuffmanCode HC;int *w,i,j,n;char *z;int flag=0;int numb=0;/ -求赫夫曼编码-int min(HuffmanTree t,int i) / 函数void select()调用int j,flag;int k=UINT_MAX; / 取k为不小于可能的值for(j=1;j<=i;j+)if(tj.weight<k&&tj.parent=0)k=tj
10、.weight,flag=j;tflag.parent=1;return flag;/-slect函数-void select(HuffmanTree t,int i,int &s1,int &s2) / s1为最小的两个值中序号小的那个int j;s1=min(t,i);s2=min(t,i);if(s1>s2)j=s1;s1=s2;s2=j;/ -算法6.12-void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n) / w存放n个字符的权值(均>0),构造赫夫曼树HT,并求
11、出n个字符的赫夫曼编码HCint m,i,s1,s2,start;/unsigned c,f;int c,f;HuffmanTree p;char *cd;if(n<=1)return;/检测结点数是否可以构成树m=2*n-1;HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode); / 0号单元未用for(p=HT+1,i=1;i<=n;+i,+p,+w)p->weight=*w;p->parent=0;p->lchild=0;p->rchild=0;for(;i<=m;+i,+p)p->parent=0;for(
12、i=n+1;i<=m;+i) / 建赫夫曼树 / 在HT1i-1中选择parent为0且weight最小的两个结点,其序号分别为s1和s2select(HT,i-1,s1,s2);HTs1.parent=HTs2.parent=i;HTi.lchild=s1;HTi.rchild=s2;HTi.weight=HTs1.weight+HTs2.weight;/ 从叶子到根逆向求每个字符的赫夫曼编码HC=(HuffmanCode)malloc(n+1)*sizeof(char*);/ 分配n个字符编码的头指针向量(0不用)cd=(char*)malloc(n*sizeof(char); /
13、分配求编码的工作空间cdn-1='0' / 编码结束符for(i=1;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'elsecd-start='1'HCi=(char*)malloc(n-start)*sizeof(char);/ 为第i个字符编码分配空间strcpy(HCi,&cdstart); / 从cd复制编码(串)到HCfre
14、e(cd); / 释放工作空间/-初始化赫夫曼链表-void Initialization()flag=1;int num;int num2;cout<<"下面初始化赫夫曼链表"<<endl<<"请输入结点的个数n:"cin>>num;n=num;w=(int*)malloc(n*sizeof(int);z=(char*)malloc(n*sizeof(char);cout<<"n请依次输入"<<n<<"个字符(字符型)n注意:必须以回车结束
15、:"<<endl;char base2;for(i=0;i<n;i+)cout<<"第"<<i+1<<"个字符:"<<endl;gets(base);*(z+i)=*base;for(i=0;i<=n-1;i+)cout<<setw(6)<<*(z+i);cout<<"n请依次输入"<<n<<"个权值(n注意:必须以回车结束):"<<endl;for(i=0;i&
16、lt;=n-1;i+)cout<<endl<<"第"<<i+1<<"个字符的权值:"cin>>num2;*(w+i)=num2;HuffmanCoding(HT,HC,w,n);/-打印编码-cout<<"字符对应的编码为:"<<endl;for(i=1;i<=n;i+)/cout<<"字符"<<*(z+i-1)<<"的编码"puts(HCi);/-将赫夫曼编码写入文件-
17、cout<<"下面将赫夫曼编码写入文件"<<endl<<"."<<endl;FILE *htmTree;char r=' ','0' if(htmTree=fopen("htmTree.txt","w")=NULL)cout<<"can not open file"<<endl;return;fputs(z,htmTree);for(i=0;i<n+1;i+)fprintf(htmTre
18、e,"%6d",*(w+i);fputs(r,htmTree);for(i=1;i<=n;i+)fputs(HCi,htmTree);fputs(r,htmTree);fclose(htmTree);cout<<"已将字符与对应编码写入根目录下文件htmTree.txt中"<<endl<<endl;/-获取报文并写入文件-void InputCode()/cout<<"请输入你想要编码的字符"<<endl;FILE *tobetran;char str100;if(to
19、betran=fopen("tobetran.txt","w")=NULL)cout<<"不能打开文件"<<endl;return;cout<<"请输入你想要编码的字符"<<endl;gets(str);fputs(str,tobetran);cout<<"获取报文成功"<<endl;fclose(tobetran);/-编码函数-void Encoding()cout<<"下面对目录下文件tobetr
20、an.txt中的字符进行编码"<<endl;FILE *tobetran,*codefile;if(tobetran=fopen("tobetran.txt","rb")=NULL)cout<<"不能打开文件"<<endl;if(codefile=fopen("codefile.txt","wb")=NULL)cout<<"不能打开文件"<<endl;char *tran;i=99;tran=(char*)
21、malloc(100*sizeof(char);while(i=99)if(fgets(tran,100,tobetran)=NULL)cout<<"不能打开文件"<<endl;break;for(i=0;*(tran+i)!='0'i+)for(j=0;j<=n;j+)if(*(z+j-1)=*(tran+i)fputs(HCj,codefile);if(j>n)cout<<"字符错误,无法编码!"<<endl;break;cout<<"编码工作完成&qu
22、ot;<<endl<<"编码写入目录下的codefile.txt中"<<endl<<endl;fclose(tobetran);fclose(codefile);free(tran);/-译码函数-void Decoding()cout<<"下面对根目录下文件codefile.txt中的字符进行译码"<<endl;FILE *codef,*txtfile;if(txtfile=fopen("Textfile.txt","w")=NULL)cou
23、t<<"不能打开文件"<<endl;/txtfile=fopen("Textfile.txt","w");if (codef=fopen("codefile.txt","r")=NULL)cout<<"不能打开文件"<<endl;/codef=fopen("codefile.txt","r");char *work,*work2,i2;int i4=0,i,i3;unsigned long
24、 length=10000;work=(char*)malloc(length*sizeof(char);fgets(work,length,codef);work2=(char*)malloc(length*sizeof(char);i3=2*n-1;for(i=0;*(work+i)!='0'i+)i2=*(work+i);if(HTi3.lchild=0) *(work2+i4)=*(z+i3-1);i4+;i3=2*n-1;i-;else if(i2='0') i3=HTi3.lchild;else if(i2='1') i3=HTi3.
25、rchild;*(work2+i4)='0'fputs(work2,txtfile);cout<<"译码完成"<<endl<<"内容写入根目录下的文件txtfile.txt中"<<endl<<endl;free(work);free(work2);fclose(txtfile);fclose(codef);/-打印编码的函数-void Code_printing()cout<<"下面打印根目录下文件CodePrin.txt中编码字符"<<
26、;endl;FILE * CodePrin,* codefile;if(CodePrin=fopen("CodePrin.txt","w")=NULL)cout<<"不能打开文件"<<endl;return;if(codefile=fopen("codefile.txt","r")=NULL)cout<<"不能打开文件"<<endl;return;char *work3;work3=(char*)malloc(51*sizeof
27、(char);doif(fgets(work3,51,codefile)=NULL)cout<<"不能读取文件"<<endl;break;fputs(work3,CodePrin);puts(work3);while(strlen(work3)=50);free(work3);/* int iNum=2,num=2;while(num=fscanf(codefile,"%d",iNum)!=NULL)printf("%d",iNum);fprintf(CodePrin,"%d",iNum);
28、*/cout<<"打印工作结束"<<endl<<endl;fclose(CodePrin);fclose(codefile);/-打印赫夫曼树的函数-void coprint(HuffmanTree start,HuffmanTree HT)if(start!=HT)FILE * TreePrint;if(TreePrint=fopen("TreePrint.txt","a")=NULL)cout<<"创建文件失败"<<endl;return;numb+;
29、/该变量为已被声明为全局变量coprint(HT+start->rchild,HT);cout<<setw(5*numb)<<start->weight<<endl;fprintf(TreePrint,"%dn",start->weight);coprint(HT+start->lchild,HT);numb-;fclose(TreePrint);void Tree_printing(HuffmanTree HT,int w)HuffmanTree p;p=HT+w;cout<<"下面打印赫夫
30、曼树"<<endl;coprint(p,HT);cout<<"打印工作结束"<<endl;/-主函数-void main()char choice;while(choice!='q') cout<<"n*"<<endl;cout<<" 欢迎使用赫夫曼编码解码系统"<<endl;cout<<"*"<<endl;cout<<"(1)要初始化赫夫曼链表请输入'
31、i'"<<endl;cout<<"(2)输入要编码的字符'w'"<<endl;cout<<"(3)要编码请输入'e'"<<endl;cout<<"(4)要译码请输入'd'"<<endl;cout<<"(5)要打印编码请输入'p'"<<endl;cout<<"(6)要打印赫夫曼树请输入't'&
32、quot;<<endl;cout<<"(7)要离开请输入'q'"<<endl;if(flag=0)cout<<"n请先初始化赫夫曼链表,输入'i'"<<endl;cin>>choice;switch(choice)case 'i':Initialization();break;case 'w':InputCode();break;case 'e':Encoding();break;case 'd&
33、#39;:Decoding();break;case 'p':Code_printing();break;case 't':Tree_printing(HT,2*n-1);break;case 'q':break;default:cout<<"input error"<<endl;free(z);free(w);free(HT);利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本,但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于
34、双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一哈夫曼编/译码系统。基本要求:(1)初始化:从终端输入字符集的大小n,以及n个字符和n个权值,建立哈夫曼树。(2)输出哈夫曼树,及各字符对应的编码。(3)编码:利用建好的哈夫曼树,对输入的待发送电文进行编码。同时输入原文及编码串。(4)译码:利用建好的哈夫曼树,对输入的已接收电文进行译码。同时输入编码串及原文#include<iomanip.h>#include<iostream.h>#include<string.h>#define MAX 99char cha
35、MAX;char hcMAX-1MAX;int s1,s2; /设置全局变量,以便在方法(函数)select中返回两个变量typedef struct /huffman树存储结构unsigned int weight;/权值int lchild,rchild,parent;huftree;void select(huftree tree,int k) /找寻parent为0,权最小的两个节点int i;for (i=1;i<=k && treei.parent!=0 ;i+); s1=i;/初始化s1for (i=1;i<=k;i+)if (treei.parent
36、=0 && treei.weight<trees1.weight) s1=i;/把最小值赋给s1for (i=1; i<=k ; i+)if (treei.parent=0 && i!=s1) break; s2=i;/初始化s2for (i=1;i<=k;i+)if ( treei.parent=0 && i!=s1 && treei.weight<trees2.weight) s2=i;/把最小值赋给s2void huffman(huftree tree,int *w,int n) /生成huffman
37、树 int m,i;if (n<=1) return;m=2*n-1;for (i=1;i<=n;i+)/给tree中每个结点权值赋值,且分别给左右孩子及双亲初始化 treei.weight=wi; treei.parent=0;treei.lchild=0; treei.rchild=0; for (i=n+1;i<=m;i+)/给除了叶子结点下的其它结点初始化 treei.weight=0; treei.parent=0;treei.lchild=0; treei.rchild=0; for (i=n+1;i<=m;i+)/最终结果 select(tree, i-1
38、);trees1.parent=i;trees2.parent=i;treei.lchild=s1;treei.rchild=s2; treei.weight =trees1. weight+ trees2.weight;void huffmancode(huftree tree,char code,int n)/输出huffman编码int start,c,i,f;cout<<"哈夫曼树:"<<endl;/输出hufftreefor(i=1;i<=2*n-1;i+)cout<<setw(5)<<i<<set
39、w(5)<<treei.weight<<setw(5)<<treei.parent<<setw(5)<<treei.lchild<<setw(5)<<treei.rchild<<endl;coden-1='0'/cout<<"哈夫曼编码:"<<endl;for(i=1;i<=n;i+)start=n-1;for(c=i,f=treei.parent;f!=0;c=f,f=treef.parent)/输出huffman编码if(treef.lchild=c)code-start='0'/把编码存入codeelse code-start='1'strcpy(hci,&codestart);/把code分别复制给hccout<<chai<<"->"<<hci<<endl;/分别输出编码 for是满足条件进入void tohuffmancode(int n)/编码部分int i=0,j;char anychar9999;cout<<"请输入你要编码的字符
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物料质量保障合同范本
- 解除双方公司合同范本
- 活动板房施工合同范本
- 美甲店出资入股合同范本
- 代销商品合同范本
- 大酒店施工合同范本
- 私人借款正规合同范本
- 工厂内销合同范本
- 房产佣金协议合同范本
- 软装订单合同范本
- 2024可信数据服务多方数据价值挖掘体系框架
- 故事绘本一园青菜成了精
- 卫健系统消防安全培训课件
- 转氨酶升高患者护理查房
- 读后续写:万能升华主旨句3-脱险型(解析版)-新高考英语读后续写满分攻略
- 初中英语导学案名词 公开课教学设计
- 个人业绩相关信息采集表
- 模具维护保养记录表
- 003-04-PFMEA第五版表格模板-(带实例)-2020.2.3
- 电大行政管理毕业论文细谈我国选人用人机制存在的问题及对策
- 加气站罩棚专项施工方案
评论
0/150
提交评论