费诺编码的C语言实现实验论文

更新时间:2023-11-17 23:07:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

#include //头文件 #include #include

#define Bmax 10 //最长码长度 #define Smax 20 //数组最大长度

/************定义\位\的结构**********/ struct Bit { char b[Bmax]; //定义码长度数组的数据类型 字符型 组成成员 int last; };

/***********定义符号的结构**********/

typedef struct symbol //共用体结构 { char c; //定义信源符号c为字符型 float probability; //定义符号概率probality为浮点型 struct Bit bit; //嵌套的结构体 }sbl;

sbl s[Smax]; //S数组最大容量符号 /********输入符号的符号概率********/ void input(int n) { int i; //定义变量i类型 整型 int c; //定义变量c类型 还是整型的好,字符型的也可以 printf(\请输入符号及符号概率\\n\ //打印出提示语\请输入符号及符号概率\ c=getchar(); for(i=0;i

/***********用冒泡法排序**********/ void sort(int n) { float t; //定义变量t为浮点型 char a; //定义变量a为字符型 int i,j; //定义循环变量i,j为整型 for(i=1;i

引进的变量a和t分别交换其符号和概率 {t=s[j].probability; a=s[j].c; s[j].probability=s[j+1].probability; s[j].c=s[j+1].c; s[j+1].probability=t; s[j+1].c=a; } //因此,此函数实现了各符号和其所对应的概率,按照概率的大小,从大到小排序 }

/************分组函数************/

void group(int n) //定义函数,无返回值 { int i,pmid,plow,phigh; //定义变量为整型 pmid=phigh=n; //给两个变量赋值为n plow=0; //给变量赋值为0 for(i=0;i

/**依次将按排好序的符号概率进行近似1:1分成两大组**/

void group1(int low,int mid,int high) //定义函数(低位,中位,高位) { float d,dmin; //定义变量d,dmin为浮点数 d=0; //给d赋初值为0 int i; //定义循环变量i为整型 if(high==low+1) //如果低位和高位只相差1,也就是它们两相邻 return; //则返回 for(i=low;i

dmin=d-2*s[low].probability; //dmin= for(i=low+1;i=dmin,则跳出整个for循环,要尽量使两组的差为0,才最接近1:1 break; } 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;i

/*****输出符号,符号概率及编码****/

void output(int n) { int i,j; printf(\请输出符号,符号概率及编码\\n\ 符号,符号概率及编码\ for(i=0;i

/***********译码函数**************/

void decode(int n,char a[100]) { int i=0,j; char s2[100]; s2[0]='\\0'; while(i

//如果i小于中间的数 //则给这组数赋值为\ //否则就给这组数赋值为\ //输出编码函数,n为整型 //定义循环变量i,j //打印提示语\请输出 //i从0到n,大循环执行n-1次 //每次的大循环都输出一个 //输出编码 //译码 //定义变量整型。并给i赋初值=0 //数组s2,字符型 //数组s2的第一个元素为\\n //当i<数组a的长度时,执行以下程序

{ char temp[2]; //定义数组temp,字符型 temp[0]=a[i]; temp[1]='\\0'; strcat(s2,temp); for(j=0;j

void main() //主函数 { int n; //定义变量 char a[100]; //数组最大人容量为100 printf(\请注意当显示器再次输出“请输入符号个数时”说明输入的n值有误!\\n\ do{ printf(\请输入符号个数0Smax或者n<=0时,输入有误 scanf(\ //键盘输入符号个数 }while(n>Smax||n<=0); input(n); //分别调用输入、排序、分组、输出函数,并执行 sort(n); group(n); output(n); printf(\请输入要译的二进制代码\\n\ //打印提示语\请输入要译的二进制代码\ scanf(\ //键盘输入要译的二进制代码 printf(\输出译码结果\\n\ //打印提示语\输出译码结果\ decode(n,a); //调用译码函数输出结果 }

本文来源:https://www.bwwdw.com/article/d4vv.html

Top