c语言简单译码(huffman编码译码的c语言实现)

本文目录
- huffman编码译码的c语言实现
- 用C语言编写一个简单翻译程序
- c语言 密码 译码 中文
- C语言 编写一个译码程序,把一个英语句子译成数字代码
- 请用C语言编写一个译码函数,把一个英语句子译成数字代码译码规则是
- 如何用C语言译码,要求用原来字母前面的第四个字母代替原来的字母
- 求助能够实现LDPC编译码的c语言程序,急用,谢谢!
huffman编码译码的c语言实现
留个脚印,晚上回去看看
#include 《iostream.h》
#include 《iomanip.h》
#include 《string.h》
#include 《malloc.h》
#include 《stdio.h》
//typedef int TElemType;
const int UINT_MAX=1000;
char str;
typedef struct
{
int weight,K;
int parent,lchild,rchild;
}HTNode,* HuffmanTree;
typedef char **HuffmanCode;
//-----------全局变量-----------------------
HuffmanTree HT;
HuffmanCode HC;
int w,i,j,n;
char z;
int flag=0;
int numb=0;
// -----------------求赫夫曼编码-----------------------
struct cou{
char data;
int count;
}cou;
int min(HuffmanTree t,int i)
{ // 函数void select()调用
int j,flag;
int k=UINT_MAX; // 取k为不小于可能的值,即k为最大的权值1000
for(j=1;j《=i;j++)
if(t.parent==0)
k=t.weight,flag=j;
t.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,并求出n个字符的赫夫曼编码HC
int 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(i=n+1;i《=m;++i) // 建赫夫曼树
{ // 在HT中选择parent为0且weight最小的两个结点,其序号分别为s1和s2
select(HT,i-1,s1,s2);
HT.parent=i;
HT.lchild=s1;
HT.rchild=s2;
HT.weight;
}
// 从叶子到根逆向求每个字符的赫夫曼编码
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
// 分配n个字符编码的头指针向量(不用)
cd=(char*)malloc(n*sizeof(char)); // 分配求编码的工作空间
cd=’\0’; // 编码结束符
for(i=1;i《=n;i++)
{ // 逐个字符求赫夫曼编码
start=n-1; // 编码结束符位置
for(c=i,f=HT.parent)
// 从叶子到根逆向求编码
if(HT.lchild==c)
cd=’0’;
else
cd=’1’;
HC=(char*)malloc((n-start)*sizeof(char));
// 为第i个字符编码分配空间
strcpy(HC); // 从cd复制编码(串)到HC
}
free(cd); // 释放工作空间
}
//---------------------获取报文并写入文件---------------------------------
int InputCode()
{
//cout《《"请输入你想要编码的字符"《《endl;
FILE *tobetran;
if((tobetran=fopen("tobetran.txt","w"))==NULL)
{
cout《《"不能打开文件"《《endl;
return 0;
}
cout《《"请输入你想要编码的字符"《《endl;
gets(str);
fputs(str,tobetran);
cout《《"获取报文成功"《《endl;
fclose(tobetran);
return strlen(str);
}
//--------------初始化赫夫曼链表---------------------------------
void Initialization()
{ int a,k,flag,len;
a=0;
len=InputCode();
for(i=0;i《len;i++)
{k=0;flag=1;
cou;
cou.count=1;
while(i》k)
{
if(str)
{
a++;
flag=0;
}
k++;
if(flag==0)
break;
}
if(flag)
{
for(j=i+1;j《len;j++)
{if(str)
++cou.count;}
}
}
n=len-a;
for(i=0;i《n;i++)
{ cout《《cou.data《《" ";
cout《《cou.count《《endl;
}
for(i=0;i《=n;i++)
{*(z+i)=cou.data;
*(w+i)=cou.count;
}
/* 原来未修改的初始化程序段:
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《《"个字符(字符型):"《《endl;
char base;
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《《"个权值:"《《endl;
for(i=0;i《=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++)
{
puts(HC);
}
//--------------------------将赫夫曼编码写入文件------------------------
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(htmTree,"%6d",*(w+i));
fputs(r,htmTree);
}
for(i=1;i《=n;i++)
{
fputs(HC,htmTree);
fputs(r,htmTree);
}
fclose(htmTree);
cout《《"已将字符与对应编码写入根目录下文件htmTree.txt中"《《endl《《endl;
}
//---------------------编码函数---------------------------------
void Encoding()
{
cout《《"下面对目录下文件tobetran.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*)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(HC,codefile);
if(j》n)
{
cout《《"字符错误,无法编码!"《《endl;
break;
}
}
}
}
}
cout《《"编码工作完成"《《endl《《"编码写入目录下的codefile.txt中"《《endl《《endl;
fclose(tobetran);
fclose(codefile);
free(tran);
}
//-----------------译码函数---------------------------------
void Decoding()
{
cout《《"下面对根目录下文件codefile.txt中的字符进行译码"《《endl;
FILE *codef,*txtfile;
if((txtfile=fopen("txtfile.txt","w"))==NULL)
{
cout《《"不能打开文件"《《endl;
}
if ((codef=fopen("codefile.txt","r"))==NULL)
{
cout《《"不能打开文件"《《endl;
}
char *work,*work2,i2;
int i4=0,i,i3;
unsigned long 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-1)!=’\0’;i++)
{
i2=*(work+i);
if(HT.lchild==0)
{
*(work2+i4)=*(z+i3-1);
i4++;
i3=2*n-1;
i--;
}
else if(i2==’0’) i3=HT.lchild;
else if(i2==’1’) i3=HT.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中编码字符"《《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(char));
do
{
if(fgets(work3,51,codefile)==NULL)
{
cout《《"不能读取文件"《《endl;
break;
}
fputs(work3,CodePrin);
puts(work3);
}while(strlen(work3)==50);
free(work3);
cout《《"打印工作结束"《《endl《《endl;
fclose(CodePrin);
fclose(codefile);
}
//-------------------------------打印译码函数---------------------------------------------
void Code_printing1()
{
cout《《"下面打印根目录下文件txtfile.txt中译码字符"《《endl;
FILE * CodePrin1,* txtfile;
if((CodePrin1=fopen("CodePrin1.txt","w"))==NULL)
{
cout《《"不能打开文件"《《endl;
return;
}
if((txtfile=fopen("txtfile.txt","r"))==NULL)
{
cout《《"不能打开文件"《《endl;
return;
}
char *work5;
work5=(char*)malloc(51*sizeof(char));
do
{
if(fgets(work5,51,txtfile)==NULL)
{
cout《《"不能读取文件"《《endl;
break;
}
fputs(work5,CodePrin1);
puts(work5);
}while(strlen(work5)==50);
free(work5);
cout《《"打印工作结束"《《endl《《endl;
fclose(CodePrin1);
fclose(txtfile);
}
//------------------------打印赫夫曼树的函数-----------------------
void coprint(HuffmanTree start,HuffmanTree HT)
{
if(start!=HT)
{
FILE * TreePrint;
if((TreePrint=fopen("TreePrint.txt","a"))==NULL)
{cout《《"创建文件失败"《《endl;
return;
}
numb++;//该变量为已被声明为全局变量
coprint(HT+start-》rchild,HT);
cout《《setw(5*numb)《《start-》weight《《endl;
fprintf(TreePrint,"%d\n",start-》weight);
coprint(HT+start-》lchild,HT);
numb--;
fclose(TreePrint);
}
}
void Tree_printing(HuffmanTree HT,int w)
{
HuffmanTree p;
p=HT+w;
cout《《"下面打印赫夫曼树"《《endl;
coprint(p,HT);
cout《《"打印工作结束"《《endl;
}
//------------------------主函数------------------------------------
void main()
{
char choice;
while(choice!=’q’)
{ cout《《"\n******************************"《《endl;
cout《《" 欢迎使用赫夫曼编码解码系统"《《endl;
cout《《"******************************"《《endl;
cout《《"(1)要初始化赫夫曼链表请输入’i’"《《endl;
cout《《"(2)要编码请输入’e’"《《endl;
cout《《"(3)要译码请输入’d’"《《endl;
cout《《"(4)要打印编码请输入’p’"《《endl;
cout《《"(5)要打印赫夫曼树请输入’t’"《《endl;
cout《《"(6)要打印译码请输入’y’"《《endl;
if(flag==0)cout《《"\n请先初始化赫夫曼链表,输入’i’"《《endl;
cin》》choice;
switch(choice)
{
case ’i’:
Initialization();
break;
case ’e’:
Encoding();
break;
case ’d’:
Decoding();
break;
case ’p’:
Code_printing();
break;
case ’t’:
Tree_printing(HT,2*n-1);
break;
case ’y’:
Code_printing1();
break;
default:
cout《《"input error"《《endl;
}
}
free(z);
free(w);
free(HT);
}
用C语言编写一个简单翻译程序
LZ 的那种方法 可以实现 ,但很显然是不实用,因为那样记录的也太多了吧,,,
我觉得,你可以记录下常用的特殊短语 像: hello China就可以了,因为很大一部分就是按照顺序翻译的,“有道”也经常出现这种问题的,以下是自己在用参考“有道”的时候的实现的一些想法,可以作为参考:
如果想智能点的话,你就得“教会”这个 【 英语和汉语 】这两门课 教的方法,就是把你会的东西全都教给他,比如说:
首先,你可以为每个单词定义一个struct数据结构,里面包含的是这个单词的 1. 【字义】(一个单词总不止一个意思吧)2.【词性】(你学习语法的时候要用到吧)3.【其他】(词组了什么的,有发音功能的话还得记录音标吧、、呵呵)
然后,要教它语法吧、、、这其实是最难的,语法就相当于你的算法了,程序的灵魂所在;
这也许就是C一直吸引着我们的地方,将抽象变为具体,呵呵、、祝你学习愉快、、、
c语言 密码 译码 中文
这个多简单啊,就是把偶数的放任第一个字符串,奇数的放入第二个字符串
char a;
int i,j,k,n;
gets(a);
n=strlen(a);
for(i=0,j=0,k=0;i《n;i++)
{
if(i%2)
b;
esle
c;
}
C语言 编写一个译码程序,把一个英语句子译成数字代码
#include 《stdio.h》
int main ()
{
char c;
while ((c = getchar()) != ’\n’)
{
if(c==’ ’)
{
printf("*");
continue;
}
c-=64;
if (c!=-32)
printf ("%d ",c);
}
printf (".");
return 0;
}
试试看符不符合你的要求
请用C语言编写一个译码函数,把一个英语句子译成数字代码译码规则是
#include 《stdio.h》
int main ()
{
char c;
while ((c = getchar()) != ’\n’)
{
if(c==’ ’)
printf("*");
else
{
if(c》=97&&c《=122)
printf ("%d ", c-=96);
else
{
if(c》=65&&c《=90)
printf ("%d ", c-=38);
else
printf ("%c", c);
}
}
}
return 0;
}
如何用C语言译码,要求用原来字母前面的第四个字母代替原来的字母
#include 《stdio.h》
void main()
{
char c; while ((c=getchar())!=’\n’)
{
if ((c》=’a’&&c《=’z’)||(c》=’A’&& c《=’Z’)) //c为小写字母a-z或者大写字母A-Z
{
c=c+4; //把c变成其后面的第4个字母
if(c》’Z’&&c《=’Z’+4||c》’z’) //若c为小写字母时若大于z即-26,若c为大写时大于Z并且c同时小于等于Z+4
{
c=c-26;
}
}
printf("%c",c);
} printf("\n");
}
求助能够实现LDPC编译码的c语言程序,急用,谢谢!
我回答你的问题啊!呵呵,你怎么不给分啊????实验命令:clc;clear all;
N=input(’N=’);%输入信源符号的个数
s=0;l=0;H=0;
for i=1:N
fprintf(’第%d个’,i);
p(i)=input(’p=’);%输入信源符号概率分布矢量,p(i)《1
if p(i)《=0
error(’不符合概率分布’)
end
s=s+p(i)
H=H+(- p(i)*log2(p(i)));%计算信源信息熵
end
if (s《=0.999999||s》=1.000001)
error(’不符合概率分布’)
end
tic;
for i=1:N-1 %按概率分布大小对信源排序
for j=i+1:N
if p(i)《p(j)
m=p(j);p(j)=p(i);p(i)=m;
end
end
end
x=f1(1,N,p,1);
for i=1:N %计算平均码长
L(i)=length(find(x(i,:)));
l=l+p(i)*L(i);
end
n=H/l; %计算编码效率
fprintf(’按概率降序排列的码字:\n’);
disp(x) %显示按概率降序排列的码字
fprintf(’平均码长:\n’);
disp(l)% 显示平均码长
fprintf(’信源信息熵:\n’);
disp(H)%显示信源信息熵
fprintf(’编码效率:\n’);
disp(n) %显示编码效率
fprintf(’计算耗时time= %f\n’,toc);
再建立两个M文件:%函数f1存放于f1.m
function x=f1(i,j,p,r)
global x;
x=char(x);
if(j《=i)
return;
else
q=0;
for t=i:j %对于区间自上而下求累加概率值
q=p(t)+q;y(t)=q;
end
for t=i:j%把所有自上而下的累加概率值与该区间总概率值减该累加概率值之差取绝对值存在一数组
v(t)=abs(y(t)-(q-y(t)));
end
for t=i:j
if(v(t)==min(v)) %求该数组中最小的一个值来确定分界点位置
for k=i:t %赋值码字
x(k,r)=’0’;
end
for k=(t+1):j
x(k,r)=’1’;
end
d=t;
f1(i,d,p,r+1); %递归调用及相互调用
f2(d+1,j,p,r+1);
f1(d+1,j,p,r+1);
f2(i,d,p,r+1);
else
end
end
end
return;第二个:%函数f2存放于f2.m
function x=f2(i,j,p,r)
global x;
x=char(x);
if(j《=i)
return;
else
q=0;
for t=i:j %对于区间自上而下求累加概率值
q=p(t)+q;y(t-i+1)=q;
end
for t=1:j-(i-1)%把所有自上而下的累加概率值与该区间总概率值减该累加概率值之差取绝对值存在一数组
v(t)=abs(y(t)-(q-y(t)));
end
for t=1:j-(i-1)
if(v(t)==min(v)) %求该数组中最小的一个值来确定分界点位置
d=t+i-1;
for k=i:d %赋值码字
x(k,r)=’0’;
end
for k=(d+1):j
x(k,r)=’1’;
end
f2(d+1,j,p,r+1);%递归调用及相互调用
f1(i,d,p,r+1);
f2(i,d,p,r+1);
f1(d+1,j,p,r+1);
else
end
end
end
return;

更多文章:
html网页模板(网页制作设计模板-旅游网页该如何设计模板)
2025年9月29日 04:45
this love歌词taylor(求Taylor Swift的Love Story的歌词的中文翻译~)
2025年6月19日 16:30
span标签有内容却不显示(定义一个CSS,但是只有DIV可以显示出来,span等都无法显示)
2026年7月29日 21:00
void sort是什么意思(请各位说说void sort里的算法是什么意思)
2025年6月20日 00:15
学电脑软件开发哪个学校好(电脑软件开发去什么学校学习比较好)
2026年8月16日 18:45
subject都有什么意思(“subject ”是什么意思)
2026年8月15日 06:00
莫奈的网络解释莫奈的网络解释是什么?莫奈的解释莫奈的解释是什么
2025年7月29日 02:00
网页模板停用不能上报怎么办(请教一下,关于网页模板显示不出来的问题~~)
2025年10月22日 22:45
dateadd函数的语法参数(在VB6.0中,DateAdd函数中,用“w“,“y“与“d“,我怎么感觉都一样呀,都是天)
2026年2月21日 15:30
springfestival用in oron(the Spring Festival前用in还是on)
2026年8月28日 02:45
acquaintance歌曲(新年快乐英文歌除了happy new year还有那些)
2026年4月19日 03:15
constantly continuously(constantly怎么读)
2025年8月8日 18:15









