哈弗曼编码译码C实现解析.docx
- 文档编号:9610230
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:29
- 大小:118.21KB
哈弗曼编码译码C实现解析.docx
《哈弗曼编码译码C实现解析.docx》由会员分享,可在线阅读,更多相关《哈弗曼编码译码C实现解析.docx(29页珍藏版)》请在冰点文库上搜索。
哈弗曼编码译码C实现解析
数据结构(C++实现)
实训报告
题目:
哈弗曼编码与译码
专业:
信息管理
班级:
12512201
学生:
吴昊翀
学号:
1251220117
指导老师:
黄建灯
目录
一、实训要求4
二、课题分析和设计4
1.基本需求分析4
2.对应的结构体或类5
三、主要功能界面7
1.主界面7
2.读取文章并对字符编码8
3.哈弗曼编码信息9
4.文章编码10
四、总结12
五、附录13
一、实训要求
⏹输入为:
一段英文或中文的文章(原文)
⏹对输入的文章构造哈夫曼树
⏹生成对应的编码
⏹输出为:
原文所对应的编码(译文)
⏹根据已经生成的编码表,输入任意的译文可以得到对应的原文
二、课题分析和设计
1.基本需求分析
1.在通信过程中,为了提高信道利用率,缩短信息传输时间降低传输成本,需要一编码译码器。
2.此哈弗曼编码译码器应具有编码译码的双向功能,即在发送端通过编码系统对传入的数据进行编码。
3.在接收端将数据译码,将具有两项功能的编码译码器用于双工信道就可满足,双工信道的双向编译功能。
4.输入某段报文是,系统将自己完成编译输出。
1.程序设计流程
(1)文字表述
开始进入功能选择界面,包含五种操作:
1.读取文章并对字符编码。
2.哈夫曼编码信息。
3.文章编码。
4.文章译码。
5.退出程序。
(2)操作
1:
给定一篇文章,统计字符出现的概率,并根据概率建立哈弗曼树,并利用哈弗曼树对字符进行哈弗曼编码。
2:
显示哈弗曼编码信息,包括字符,字符出现的概率,哈弗曼编码。
3:
对文章进行译码,显示译码信息,并保存。
4:
对文章进行译码,显示并保存
(3)流程图
程序开始
程序主界面
哈弗曼编码信息
读取文章并对文章编码
退出程序
文章译码
文章编码
保存译码
显示译码
返回主界面
返回主界面
保存编码
显示编码
2.对应的结构体或类
(1)定义
classHtnote{
public:
charname;//字符名
doubleweight;//权重
intlchild;//左孩子
intrchild;//右孩子
intparent;//父亲
Htnote(){
weight=0;
lchild=-1;
parent=-1;
rchild=-1;
}
};
(2)定义字符和出现的次数
className{
public:
intnum;//字符出现的次数
charpname;//字符名
doublelweight;//权值
Name(){
num=0;
lweight=0;
}
};
(3)定义字符种类总数和存储信息
classGetName{
public:
charnamef[max2];
intn;//字符的种类
intsum;//字符的总数
Nameletter[max1];//存储字符信息的类的数组
GetName(){
sum=0;
n=0;
}
(4)定义编码类
classCodeNode//编码类
{
public:
charch;//存储字符
charbits[max1];//存储编码
};
classFunction{
public:
GetNameL;
intfn;//定义哈夫曼数组大小
HtnoteHuffmanT[max3];//哈夫曼数组
CodeNodeCode[max1];//字符编码数组
Function(){
fn=0;
}
三、主要功能界面
1.主界面
2.读取文章并对字符编码
3.哈弗曼编码信息
4.文章编码
5.文章译码
4、总结
为期两个星期的课程设计终于完美落下帷幕,回想起前前后后还是有苦有甜。
当拿到课题是感觉还行!
结果前几天做程序的代码时一点都不会做,课本也看不懂课程进度可以说是原地踏步!
只能怪自己吧!
老师讲的有时能听懂有时就听不懂,到头来今天的局面,当时以为自己完成不了任务。
过程中甜的是有老师和同学的帮忙,总算圆满完成任务。
通过本次实训让我重新学习了算法和数据结构这门课程,也懂得了用代码来建立哈弗曼树,编码译码双向功能!
上机实验,将理论的知识与实际结合起来。
增强了自己的动手能力,觉的任何知识都不是轻而易举的学懂,必须花点心思去学,必须要付出努力。
以后上课就不能像以前那样,要好好学习这样不辜负老师对我们的心意。
最后衷心感谢帮助我完成程序设计的老师和同学表示感谢!
五、附录
全部代码:
#ifndefHUFFMANFUNCTION_H
#defineHUFFMANFUNCTION_H
#include
#include
#include
#include
#definemax1150
#definemax250
#definemax3256
usingnamespacestd;
classHtnote{
public:
charname;//字符名
doubleweight;//权重
intlchild;//左孩子
intrchild;//右孩子
intparent;//父亲
Htnote(){
weight=0;
lchild=-1;
parent=-1;
rchild=-1;
}
};
className{
public:
intnum;//字符出现的次数
charpname;//字符名
doublelweight;//权值
Name(){
num=0;
lweight=0;
}
};
classGetName{
public:
charnamef[max2];
intn;//字符的种类
intsum;//字符的总数
Nameletter[max1];//存储字符信息的类的数组
GetName(){
sum=0;
n=0;
}
voidGetWeight()//得到字符的权值
{
for(inti=0;i letter[i].lweight=(double)letter[i].num/sum;//出现的次数除总数得到权值 } } intReadLetter(){ ifstreaminput; cout<<"请输入文件名: "< cin>>namef; input.open(namef);//打开文件 if(input.fail()){ cout<<"该文件不存在! "< return0; } charch; ch=input.get(); letter[0].pname=ch; letter[0].num++; sum++; while(! input.eof()){//读取文件中的所有字符 inttag=0; ch=input.get(); for(inti=0;i if(letter[i].pname==ch){ letter[i].num++; sum++; tag=1; } } if(tag==0){ n++; letter[n].pname=ch; letter[n].num++; sum++; } } sum--; input.close(); GetWeight();//得到字符权值 } }; classCodeNode//编码类 { public: charch;//存储字符 charbits[max1];//存储编码 }; classFunction{ public: GetNameL; intfn;//定义哈夫曼数组大小 HtnoteHuffmanT[max3];//哈夫曼数组 CodeNodeCode[max1];//字符编码数组 Function(){ fn=0; } voidCharHuffmanTCoding()//编码功能实现 { inti,f,c; charcd[1000];//暂时存储编码的数组 intstart;//编码读取起始位置 cd[L.n]='\0'; for(i=0;i Code[i].ch=HuffmanT[i].name;//字符信息 start=L.n;//起始位置 c=i; while((f=HuffmanT[c].parent)>=0){ if(HuffmanT[f].lchild==c)//如果为左孩子,为'0' { cd[--start]='0'; }else//如果为右孩子,为'1' { cd[--start]='1'; } c=f; } strcpy(Code[i].bits,&cd[start]);//将结果存入对应的编码数组中 } } voidOutputHuffmanTCode(){ cout<<"哈夫曼编码: "< cout<<"----------------------"< cout<<"字符\t权值\t\t哈夫曼编码"< for(inti=0;i { cout<<"----------------------"< cout< cout< cout< } cout<<"----------------------"< } voidInitHT()//哈夫曼初始化 { L.ReadLetter(); fn=(L.n)*2-1; for(inti=0;i if(i HuffmanT[i].name=L.letter[i].pname; HuffmanT[i].weight=L.letter[i].lweight; } } } voidSelectMin(intm,int&p1,int&p2)//选择最小的两个节点 { inti,j; doublem1,m2; m1=m2=1; p1=p2=-1; for(i=0;i if(HuffmanT[i].parent==-1&&HuffmanT[i].weight { m2=m1; p2=p1; m1=HuffmanT[i].weight; p1=i; }elseif(HuffmanT[i].parent==-1&&HuffmanT[i].weight { m2=HuffmanT[i].weight; p2=i; } } } voidCreatHT()//建立哈夫曼树 { inti,p1,p2; InitHT(); for(i=L.n;i SelectMin(i,p1,p2); HuffmanT[p1].parent=HuffmanT[p2].parent=i; HuffmanT[i].lchild=p1; HuffmanT[i].rchild=p2; HuffmanT[i].weight=HuffmanT[p1].weight+HuffmanT[p2].weight; } } intOutArticleCode()//显示文章编码 {//文章编码操作 ifstreaminput; input.open(L.namef); if(input.fail()){ cout<<"文件不存在! "< return0; } charch; cout<<"文章编码如下: "< while(! input.eof()){ ch=input.get(); for(inti=0;i if(Code[i].ch==ch) cout< } } cout< input.close(); } intSaveArticleCode()//保存文章编码 { ofstreamoutput; ifstreaminput; charnamef1[max2]; input.open(L.namef); if(input.fail()){ cout<<"该文件不存在! "< return0; } cout<<"请输入保存文章编码的文件名: "< cin>>namef1; output.open(namef1); charch; while(! input.eof()){ ch=input.get(); for(inti=0;i if(Code[i].ch==ch){ for(intj=0;j output.put(Code[i].bits[j]); } } } } input.close(); output.close(); cout<<"保存完毕! "< } intOutTransCode(){//文章译码操作 ifstreaminput; charnamef[max2]; cout<<"请输入保存文章编码的文件名: "< cin>>namef; input.open(namef); if(input.fail()){ cout<<"该文件不存在! "< return0; } charch; ch=input.get(); intc=2*L.n-2; while(! input.eof()){ if(ch=='0')//遇0搜索左子树 { if(HuffmanT[c].lchild>=0){ c=HuffmanT[c].lchild; } if(HuffmanT[c].lchild==-1)//判断是否到叶子 { cout< c=2*L.n-2;//返回根节点 } } if(ch=='1')//遇1搜索右子树 { if(HuffmanT[c].rchild>=0){ c=HuffmanT[c].rchild; } if(HuffmanT[c].rchild==-1)//判断是否到叶子 { cout< c=2*L.n-2;//返回根节点 } } ch=input.get(); } cout< input.close(); } }; #endif/*HUFFMANFUNCTION_H*/ #include #include"HUFFMANFUNCTION.h" usingnamespacestd; intmain(intargc,char**argv) { Function*a=newFunction; while (1) {//主界面显示 cout< cout<<"<<==================功能选择===============>>"< cout<<"【1】读取文章并对字符编码"< cout<<"【2】哈夫曼编码信息"< cout<<"【3】文章编码"< cout<<"【4】文章译码"< cout<<"【5】退出程序"< cout<<"========================================================="< charch; cout<<"====>>请选择功能: "; cin>>ch; switch(ch) { case'1': //读取文章并对字符编码 { deletea; a=newFunction; system("cls"); a->CreatHT(); a->CharHuffmanTCoding(); cout<<"操作完毕! "< system("pause"); system("cls"); break; } case'2': //哈夫曼编码信息 { system("cls"); a->OutputHuffmanTCode(); system("pause"); system("cls"); break; } case'3': //文章编码 { system("cls"); while (1) { cout< cout<<"========>>1.显示文章编码"< cout<<"========>>2.保存文章编码"< cout<<"========>>3.返回上一界面"< charch1; cout< "; cin>>ch1; switch(ch1) { case'1': //显示文章编码 { system("cls"); a->OutArticleCode(); system("pause"); system("cls"); continue; } case'2': //保存文章编码 { system("cls"); a->SaveArticleCode(); system("pause"); system("cls"); continue; } case'3': //返回上一界面 { break; } default: { system("cls"); cout<<"输入错误,请重新输入! "< continue; } } system("cls"); break; } break; } case'4': //文章译码 { system("cls"); while (1) { cout< cout<<"========>>1.显示文章编码的译码"< cout<<"========>>2.返回上一界面"< charch1; cout< "; cin>>ch1; switch(ch1) { case'1': //显示文章编码的译码 { system("cls"); a->OutTransCode(); system("pause"); system("cls"); continue; } case'2': //返回上一界面 { break; } default: { system("cls"); cout<<"输入错误,请重新输入! "< continue; } } system("cls"); break; } break; } case'5': { return0; } default: { system("cls"); cout<<"功能选择错误,请重新输入! "< break; } } } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈弗曼编码译码C 实现解析 哈弗曼 编码 译码 实现 解析
![提示](https://static.bingdoc.com/images/bang_tan.gif)