会哈夫曼编码的大虾请帮帮忙啊!

michel138 2008-12-16 10:04:26
各位大虾大家好,小生最近遇到一大难题,就是要求用C++编一个信源编码译码程序,具体要求是:输入一串字符比如ABCDSFSAFDS,那么编码后能输出各字符的编码和整串字符串的编码还有译码输出。就是这个问题了,请各位大虾能帮助小弟解决这个问题,谢谢各位了~~~
...全文
93 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
michel138 2008-12-18
  • 打赏
  • 举报
回复
谢谢哥哥的帮忙,但是好像不是我要的,而且还有错误,不过还是十分感谢这位大虾,继续跪求.....
jojotom 2008-12-16
  • 打赏
  • 举报
回复
只是部分代码了
jojotom 2008-12-16
  • 打赏
  • 举报
回复
//从键盘输入建立哈夫曼树,并写入文件hfmtree.dat
//******************************************************
void HuffmanTree::createhuffmantreefromkeyboard() {
int num;
cout<<"\n请输入源码字符集的个数:";
cin>>num;
if (num<=1) {
cout<<"无法建立少于2个叶子结点的哈夫曼树\n";
return;
}
leafnum=num;
node=new HuffmanTreenode[2*num-1];
info=new char[num];
for (int i=0;i<num;i++) {
cout<<"请输入第"<<i+1<<"个字符值";
getchar(); //cin>>info[i]不能读入空格
info[i]=getchar();
getchar();
cout<<"请输入该字符的权值或频度";
cin>>node[i].weight;
}
for (int i=num;i<2*num-1;i++) { //循环建立哈夫曼树内部结点
int pos1=-1,pos2=-1;
int min=32767,max=32767;

for (int j=0;j<i;j++) { //在所有子树的根结点中,选权重最小的两个根结点
if (node[j].parent==-1) {
if (node[j].weight<min) {
max=min;
min=node[j].weight;
pos2=pos1;
pos1=j;
}
else if (node[j].weight<max) {
max=node[j].weight;
pos2=j;
}
}
}
node[i].weight=node[pos1].weight+node[pos2].weight;//在下标i处新构造一个哈夫曼树的内部结点,其左、右孩子就是以上pos1、pos2所指向的结点
node[i].lchild=pos1;
node[i].rchild=pos2;
node[i].parent=-1;
node[pos1].parent=node[pos2].parent=i;
}
cout<<"哈夫曼树已成功构造完成"<<endl;
char choice;
cout<<"是否要替换已有的哈夫曼树文件(y/n)"<<endl; //把建立好的哈夫曼树写入文件hfmTree.dat
cout<<"请选择:";
cin>>choice;
if (choice=='n') return;
ofstream outfile;
outfile.open("hfmtree.dat",ios::out|ios::binary|ios::trunc);
/*
if (outfile.fail()) {
cout<<"哈夫曼树文件打开失败,无法将哈夫曼树写入hfmtree。dat文件"<<endl;
return;
}
*/
outfile.write((char *)&num,sizeof(num));
for (int i=0;i<num;i++) {
outfile.write((char *)&info[i],sizeof(info[i]));
flush(cout);
}
for (int i=0;i<2*num-1;i++) {
outfile.write((char *)&node[i],sizeof(node[i]));
flush(cout);
}
outfile.close();
cout<<"\n哈夫树已成功写入hfmtree。dat文件\n";
}

//使用建立好的哈夫曼树对文件tobetran.txt中的正文进行编码,并将码文写入文件codefile.dat中
//******************************************************
void HuffmanTree::encoder() {
if (node==NULL) {
createhuffmantreefromfile();
if (leafnum<=1) {
cout<<"内存无哈夫曼树。操作撤销。\n\n";
return;
}
}

char *sourcetext; //字符串数组,用于存放源文
char choice;
cout<<"从文件中读入源文(按1),从键盘输入源文(按2)"<<endl;
cout<<"请选择:";
cin>>choice;
if (choice=='1') {
ifstream file1;
file1.open("tobetran.txt",ios::in);
if (file1.fail()) {
cout<<"源文件打开失败!"<<endl;
return;
}
char ch;
int k=0;
while (file1.get(ch)) k++;//第一次读文件只统计文件中有多少个字符,将字符数存入k
file1.close();
sourcetext=new char[k+1]; //最后一个char空间存放字符串结束符
ifstream file2;
file2.open("tobetran.txt",ios::in);
k=0; //重置为0
while (file2.get(ch)) sourcetext[k++]=ch; //k++为后加
sourcetext[k]='\0';
cout<<"源文件为:"<<sourcetext<<endl;
file2.close();
}
else {
string s;
cout<<"请输入需要编码的源文(任意长度):"<<endl;
cin>>s;
int k=s.size ();
sourcetext=new char[k+1];

for (int i=0;i<k;i++) sourcetext[i]=s[i];
sourcetext[k]='\0';
}
//开始编码
ofstream fop("codefile.dat",ios::trunc);
char *code=new char[leafnum]; //存放一个源文字符的编码
int k=0;

while (sourcetext[k]!='\0') {
int i,j,x=0;
for (i=0;i<leafnum;i++) { //通过源文字符集info[]找到当前要编码的源文的字符在哈夫曼树node[]中的下标
if (sourcetext[k]==info[i]) break;
if (i>=leafnum-1) {
cout<<"源码中出现不能编码的字符"<<endl;
return;
}
}
j=i;
while (node[j].parent!=-1) { //从叶结点开始往根结点走,每往上走一层,就产生一位编码存入code[]
if (node[node[j].parent].lchild==i) code[x++]='0';
else code[x++]='1';
i=j=node[j].parent;
}
code[x]='\0'; //置串结束符
for (i=0;i<x/2;i++) { //由于code[]中的编码是叶子到根的路径编码,需要逆置成从根到叶结点的路径编码
choice=code[i];
code[i]=code[x-1-i];
code[x-1-i]=choice;
}
//将源文的当前字符的对应编码写入码文文件
i=0;
while (code[i]!='\0') {
fop<<code[i];
//cout<<code[i];
i++;
}
k++;
}
fop.close();
cout<<"\n已完成编码,码文已写入文件codefile.dat中。\n";
}
内容概要:本文详细介绍了基于无刷直流电机的电子机械制动执行器的MATLAB/Simulink仿真模型,重点构建并深入分析了其非线性动力学特性。该模型深度融合了无刷直流电机的电磁动力学与制动执行机构的机械传动动力学,通过引入高精度的Stribeck摩擦模型,有效提升了对系统在启动、停止及低速运行等工况下复杂动静态摩擦行为的模拟能力,从而实现了对整个执行器系统动态响应特性、控制性能及瞬态过程的高保真仿真,为下一代线控刹车(Brake-by-Wire)系统的研发、控制算法验证与优化提供了强大的数字化设计与验证平台。; 适合人群:具备一定电机控制理论、汽车电子工程、自动化或机电一体化背景的研究生、高校科研人员及从事电驱动系统、汽车底盘控制系统开发的工程师。; 使用场景及目标:①用于电子机械制动(EMB)系统总体方案的设计、可行性验证与动态性能评估;②作为开发与在环测试(HIL/SIL)先进控制器(如高鲁棒性PID、滑模变结构控制、模型预测控制MPC等)的核心仿真平台;③深入研究电机与精密丝杠等机械部件之间的强耦合效应,以及非线性摩擦对系统控制精度、响应延迟和稳态误差的影响机制。; 阅读建议:学习者应熟练掌握MATLAB/Simulink软件操作,并具备电机学、经典与现代控制理论、机械动力学等相关基础知识,建议在理解模型架构的基础上,通过调整关键参数(如摩擦系数、转动惯量、传动比)和施加不同的指令信号与负载扰动,系统性地探究系统各环节的动态响应规律,进而进行模型的二次开发与优化。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧