栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【课程设计|C++】设计一个哈夫曼编码器/译码器设计

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【课程设计|C++】设计一个哈夫曼编码器/译码器设计

目录
  • 前言
  • 设计一个哈夫曼编码器/译码器设计
    • 【基本功能】
    • 【基本要求】
  • 代码
  • 实验结果
  • 结语

前言

Hello!
非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~
 
自我介绍 ଘ(੭ˊᵕˋ)੭
昵称:海轰
标签:程序猿|C++选手|学生
简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研。
学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!
 
唯有努力
 

知其然 知其所以然!

设计一个哈夫曼编码器/译码器设计 【基本功能】

将哈夫曼编码应用于通讯系统时,在发送端对待发电文进行编码,在接收端对收到的电文进行译码。对于双工通讯,每端都需要一个编码器和译码器。请设计一个哈夫曼编码器/译码器。

【基本要求】

(1)初始化:键盘输入n个字符和n个权值,建立哈夫曼树;
(2)编码:利用已建立的huffman树生成huffman编码 ;
(3)译码:利用已建立的哈夫曼树对一段代码进行译码。

代码
#include
#include 
#include
const int maxsize=1000;
using namespace std;
struct element
{
	double weight;
	int lchild,rchild,parent;
	int flag;
	char ch;
};
struct Code
{
	char bits[maxsize];
	char ch;
	int size;
 };
class Huff
{
	private:
		int n;
		element hufftree[maxsize];
		Code code[maxsize];
		char d[maxsize];
	public:
		void unit();
		void menu();
		void Huffmantree();
		void Select(int *i1,int *i2,int k);
		void Encode();
		void Decode(char *d);
		void Output();
};

void Huff::Output()
{
	cout<
		cout<
	double min1=99999998,min2=99999999;
	int i;
	for( i=0;i
		if(hufftree[i].parent==-1)
		{
			if((hufftree[i].weight
				min1=hufftree[i].weight;
				*i1=i;
			}
		}
	}	
	hufftree[*i1].flag=1;
	for(i=0;i
		if(hufftree[i].parent==-1)
		{
			if((hufftree[i].weight
				min2=hufftree[i].weight;
				*i2=i;
			}
		}
	}
	hufftree[*i2].flag=1;	
}

//构造哈夫曼树
void Huff::Huffmantree()
{
	int i,k;
	cout<<"                           ┏━━━━━━━━━━━━━━━━━━━━┓"<>i;
	switch(i)
	{
		case 1:
			{
				cout<<"请输入编码字符个数:";
				cin>>n;
				for(i=0;i
					cin.sync();
					cin.ignore();
					cout<<"请输入第"<>hufftree[i].weight;
				}
				break;
			}
		case 2:
			{
				fstream fi;
				fi.open("HuffTree.txt",ios::in);
				if(!fi)
				{
					cout<<"ttt文件打开失败,请重新选择写入方式!";
					goto A;
				}
				else
				{ 
				    i=0;
					while(!fi.eof())
					{
						fi>>hufftree[i].ch>>hufftree[i].weight;
						i++;
					}
				}
				n=i;
				fi.close();
				break;
			}
		default:
		{
			cout<<"输入不合法!请重新输入!"<
		hufftree[i].parent=-1;
		hufftree[i].lchild=-1;
		hufftree[i].rchild=-1;
		hufftree[i].flag=0;
		hufftree[i].weight=0;
	}
	for(k=n;k<2*n-1;k++)
	{
		int i1,i2;
		Select(&i1,&i2,k);
		hufftree[i1].parent=k;
		hufftree[i2].parent=k;
		hufftree[k].weight=hufftree[i1].weight+hufftree[i2].weight;
		hufftree[k].lchild=i1;
		hufftree[k].rchild=i2;
	}
}

//为哈夫曼树编码
void Huff::Encode() 
{
	char CD[10000];
	int k,j;
	for(int i=0;i
		j=i;
		k=0;
		while(hufftree[j].parent!=-1)
		{
			if(hufftree[hufftree[j].parent].lchild==j)
			CD[k]='0';
			else
			CD[k]='1';
			 k++;
			 j=hufftree[j].parent;
		}
		code[i].bits[k]='';
		k--;
		int m=k;
		code[i].size=m;
		for(int l=0;l
			code[i].bits[l]=CD[k];
			k--;
		}
		code[i].ch=hufftree[i].ch;
	}
	Output();
	system("pause");
}

//为哈夫曼树译码
void Huff::Decode(char *d)
{ 
	int flag=0;
	char s[maxsize];
	cin.sync();
	cin.ignore();
	cin.getline(s,maxsize);
	char *r1=d;
	char *r2=s;
	while(*r2!='')
	{
	   int parent=2*n-1-1;
		while(hufftree[parent].lchild!=-1)
		{
			if(*r2=='')
			{
			 	flag=1;
				break;
			}
			else 
			{	
				if(*r2=='0')
				parent=hufftree[parent].lchild;
				else
				parent=hufftree[parent].rchild;
			}	
			r2++;
		}
		if(flag!=1)
		{
			*d=hufftree[parent].ch;
			d++;
		}
	}
	cout<<"翻译后的代码为:"<
		cout<<*r1;
		r1++;
	}	
	system("pause");
}
void Huff::menu()
{
    cout<<"tttt";
	while(1)
	{
		system("cls");
		cout<<"〓〓〓〓〓〓〓〓〓〓  ☆     哈 夫 曼 编/译 码 器       ☆  〓〓〓〓〓〓〓〓〓〓"<>k; 
		switch(k)
		{
		    case 1:
				{
					Huffmantree();
					Encode();
					break;
				 } 
			 case 2:
			 	{
					 Decode(d);
					 break;	
				 }
			 case 3:
			 	{
			 		Output();
					break;
				 }
			 case 6:
			 	{
			 		exit(0);
			 		break;
				 }
				 	
			default:
				cout<<"输入有误,请输入1~3选择功能"<
	Huff myHuff;
	myHuff.menu();
	return 0;
}

HuffTree.text

E	1.25
T	9.41
A	8.19
O	7.26
I	7.10
N	7.06
R	6.85
S	6.36
H	4.57
D	3.91
C	3.83
L	3.77
M	3.34
P	2.89
U	2.58
F	2.26
G	1.71
W	1.59
Y	1.8
B	1.47
K	0.41
J	0.14
V	1.09
X	0.1
Q	0.09 
Z	0.08
实验结果

菜单

编码

  • 键盘输入
  • 文件导入


译码

结语

文章仅作为个人学习笔记记录,记录从0到1的一个过程

希望对您有一点点帮助,如有错误欢迎小伙伴指正

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/980481.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号