费诺编码的C语言实现实验论文.doc_第1页
费诺编码的C语言实现实验论文.doc_第2页
费诺编码的C语言实现实验论文.doc_第3页
费诺编码的C语言实现实验论文.doc_第4页
费诺编码的C语言实现实验论文.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include /头文件#include#include#define Bmax 10 /最长码长度#define Smax 20 /数组最大长度/*定义位的结构*/struct Bitchar bBmax; /定义码长度数组的数据类型 字符型 组成成员int last;/*定义符号的结构*/typedef struct symbol /共用体结构char c; /定义信源符号c为字符型float probability; /定义符号概率probality为浮点型struct Bit bit; /嵌套的结构体sbl;sbl sSmax; /S数组最大容量符号/*输入符号的符号概率*/void input(int n)int i; /定义变量i类型 整型int c; /定义变量c类型 还是整型的好,字符型的也可以printf(请输入符号及符号概率n); /打印出提示语请输入符号及符号概率 c=getchar();for(i=0;in;i+) /用for循环为符号及符号概率赋值scanf(%c,&si.c); /用scanf函数输入符号scanf(%f,&bability); /用scanf函数输入符号概率c=getchar();/*用冒泡法排序*/void sort(int n)float t; /定义变量t为浮点型char a; /定义变量a为字符型int i,j; /定义循环变量i,j为整型for(i=1;in;i+) /嵌套for循环 i从1到n-1 大循环n-1次for(j=0;jn-i;j+) /从下标为0的第一个符号概率开始与其之后的概率依次比较if(babilitysj+1.probability) /如果后者大于前者,则通过引进的变量a和t分别交换其符号和概率t=bability;a=sj.c;bability=sj+1.probability;sj.c=sj+1.c;sj+1.probability=t; sj+1.c=a; /因此,此函数实现了各符号和其所对应的概率,按照概率的大小,从大到小排序/*分组函数*/void group(int n) /定义函数,无返回值int i,pmid,plow,phigh; /定义变量为整型pmid=phigh=n; /给两个变量赋值为nplow=0; /给变量赋值为0for(i=0;in;i+) /for循环n次si.bit.last=0; /给符号的位赋值为0 group1(plow,pmid,phigh); /调用依次分组函数/*依次将按排好序的符号概率进行近似1:1分成两大组*/void group1(int low,int mid,int high) /定义函数(低位,中位,高位)float d,dmin; /定义变量d,dmin为浮点数d=0; /给d赋初值为0int i; /定义循环变量i为整型if(high=low+1) /如果低位和高位只相差1,也就是它们两相邻return; /则返回for(i=low;imid;i+) /否则就进入循环,i=低位开始到中间数位d+=bability; /每次循环d的概率就是前几个符号概率的累加和 dmin=d-2*bability; /dmin=for(i=low+1;ihigh;i+) /进入后半循环,i从低位加一开始到高位d=fabs(dmin-2*bability); /给d赋值,绝对值if(ddmin) /如果d=dmin,则跳出整个for循环,要尽量使两组的差为0,才最接近1:1break;mid=i; /给中间数位赋值i code(low,mid,high);group1(low,mid,mid); /将一组分为了两组,中间为零界mid group1(mid,high,high);/*对各组赋予一个二进制码元“0”和“1”*/void code(int low,int mid,int high) /编码int i; /定义循环变量i为整型for(i=low;ihigh;i+) /循环if(imid) /如果i小于中间的数si.bit.bsi.bit.last=0; /则给这组数赋值为0 si.bit.last+;elsesi.bit.bsi.bit.last=1; /否则就给这组数赋值为1si.bit.last+;/*输出符号,符号概率及编码*/void output(int n) /输出编码函数,n为整型int i,j; /定义循环变量i,jprintf(请输出符号,符号概率及编码n); /打印提示语请输出符号,符号概率及编码for(i=0;in;i+) /i从0到n,大循环执行n-1次printf(%ct%ft,si.c,bability); /每次的大循环都输出一个符号和其相对应的概率for(j=0;jsi.bit.last;j+)printf(%c,si.bit.bj); /输出编码printf(n);/*译码函数*/void decode(int n,char a100) /译码int i=0,j; /定义变量整型。并给i赋初值=0char s2100; /数组s2,字符型s20=0; /数组s2的第一个元素为nwhile(istrlen(a) /当i数组a的长度时,执行以下程序char temp2; /定义数组temp,字符型temp0=ai;temp1=0;strcat(s2,temp);for(j=0;jn;j+)if(strcmp(s2,sj.bit.b)=0)printf(%c,sj.c);s20=0;break;i+;printf(n);void main() /主函数int n; /定义变量char a100; /数组最大人容量为100printf(请注意当显示器再次输出“请输入符号个数时”说明输入的n值有误!n);doprintf(请输入符号个数0nSmax或者nSmax|n=0);input(n); /分别调用输入、排序、分组、输出函数,并执行sort(n);gro

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论