📄 doc3.cpp
字号:
/*问题描述
利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,
降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码
,在接收端将传来的数据进行译码。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编/译码系统。
基本要求
一个完整的系统应具有以下功能:
(1)I:初始化(Initialization)。从终端读入字符集大小n,
以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。
(2)E:编码(Encoding)。利用已经建好的哈夫曼树(如不在内存,则从文件hfmTree中读入),
对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。
(3)D:译码(Decoding)。利用已经建好的哈夫曼树将文件CodeFile中的代码进行译码,
结果存入文件TextFile中。
(4)P:打印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。
同时将此字符形式的编码文件写入文件CodePrint中。
(5)T:显示哈夫曼树(Treeprinting)。
将已经在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,
同时将此字符形式的哈夫曼树写入文件TreePrint中。
*/
#include<iostream.h>
#include"Haff.h"
void menu();//anounce
void main()
{
int go_out=1;//标记退出
int number;
cout<<"请输入编码个数:";
cin>>number;
//输入编码的个数
HuffManTree hfmtree(number);
//创建哈夫曼树
cout<<"现在你可以初使化哈夫曼树了"<<endl;
cout<<"编码元素是字符型的。如果你输入f3则,f为编码元素3为权值"<<endl;
hfmtree.initialization();//初始化哈夫曼树
cout<<"初使化哈夫曼树已经完成,文件hfmTree已在你的硬盘里了"<<endl;
cout<<"在编码之前请确定ToBeTran文件已存在于你的电脑里了。\a"<<endl;
char choice;//输入指令载体
do
{
menu();
cout<<endl<<"请输入选项";
cin>>choice;
switch(choice)
{
case'e':
case'E':
hfmtree.Encoding();
cout<<"编码完成,文件ToBeTran的编码结果已存入文件CodeFile"<<endl;
break;
case'd':
case'D':
hfmtree.Decoding();
cout<<"译码完成,文件TextFile已经在你的硬盘里了"<<endl;
break;
case'p':
case'P':
hfmtree.Print();
cout<<endl<<"编码文件已写入CodePrin"<<endl;
break;
case't':
case'T':
cout<<endl;
FILE * fp;
fp=fopen("TreePrint.txt","w");
hfmtree.printTree(hfmtree.head,0,fp);
fclose(fp);
cout<<"打印完成,你可以在文件TreePrin中查看该哈夫曼树"<<endl;
break;
case'q':
case'Q':
cout<<"你已经成功退出"<<endl;
go_out=0;
break;
default:
cout<<"没有提供这个选项,请重新输入"<<endl;
}//匹配指令并调用相应函数
}while(go_out!=0);
}
void menu()
{
cout<<"编码译码请输入 :e(E)"<<endl;
cout<<"译码请输入 :d(D)"<<endl;
cout<<"打印代码文件请输入:p(P)"<<endl;
cout<<"打印哈夫曼请输入 :t(T)"<<endl;
cout<<"退出请输入 :q(Q)"<<endl;
}//菜单函数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -