c语言实现香农编码和译码_香农编码码长

c语言实现香农编码和译码_香农编码码长1、设计思想     为了设计的方便,我们需要在这个程序里设计一个结构体,以用来存储信源符号、信源符号概率等参数,将每一组参数看成一个结构体来看待,这样我们就可以随时地调用。2、设计流程     主函数部分,我们先接收要输入的信源符号个数,再接收每个信源符号的名称以及他的概率。    主函数设计好后,我们将各功能的函数分成几个模块来写,第一个是排序函数,如果你坚持从大到小输入则可以不用写;第二个…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

1、设计思想

     为了设计的方便,我们需要在这个程序里设计一个结构体,以用来存储信源符号、信源符号概率等参数,将每一组参数看成一个结构体来看待,这样我们就可以随时地调用。

2、设计流程

     主函数部分,我们先接收要输入的信源符号个数,再接收每个信源符号的名称以及他的概率。

     主函数设计好后,我们将各功能的函数分成几个模块来写,第一个是排序函数,如果你坚持从大到小输入则可以不用写;第二个函数计算前几个符号概率的累加;第三个函数计算每个符号码字长度;第四个函数将累加概率转换为二进制。各个函数分工完成的话,问题就变得简单多了。

    我们来简单绘制一下其流程图:

    c语言实现香农编码和译码_香农编码码长

3、设计程序

#include <stdio.h>
#include <math.h>
#include <string.h>
int i,j,n,k,b;
float a;
char bitw[20];

 struct shan
 {
	char s[20];
  	float p;
  	float pa;
  	float l_f;
  	int l;
  	char w[20];
 }data[12];

void sequ(struct shan x[],int n)
{
 	struct shan temp;
 	for(i=0;i<n;i++)
	for(j=i;j<n;j++)
  {
  	if(x[i].p<x[j].p)
   {
  		temp=x[j];
 		x[j]=x[i];
  		x[i]=temp;
   } 
  }
}

void countpa(struct shan x[],int n)
{ 
  	a=0;
	x[0].pa=0;
  	for(i=0;i<n;i++)
  	{
 		a+=x[i].p;
 		x[i+1].pa=a;
  	}
}

void count_l(struct shan x[],int n)
{
	for(i=0;i<n;i++)
 	{
 		x[i].l_f=-log(x[i].p)/log(2);
    	if((x[i].l_f-(int)x[i].l_f)>0) 
  		{
  			x[i].l=(int)x[i].l_f+1;	
		}
 		else x[i].l=(int)x[i].l_f;
  	}
}

void covbit(float d,int lc)
{
  	for(j=0;j<lc;j++)
  	{  
  	 	b=(int)(d*2);
   		bitw[j]=b+48;
   		d=2*d-int(d*2);
  	}
 }

main()
{
	printf("please input the number of symbols of source(n<=10):n=");
 	scanf("%d",&n);
 	printf("please input the the source symbols and their probabilities\n");
 	for(i=0;i<n;i++)
 	{
 		scanf("%s",data[i].s);
 	}
 	for(i=0;i<n;i++)
 	{
	 	printf("P(%s)=",data[i].s);
		scanf("%f",&data[i].p);
 	}
 	sequ(data,n);
 	countpa(data,n);
 	count_l(data,n);
 	for(i=0;i<n;i++)
	{
 		covbit(data[i].pa,data[i].l);
 		strcpy(data[i].w,bitw);
 	}
 	for(i=0;i<n;i++)
 	printf("p(%s)=%f padd=%f l=%d w=%s\n",data[i].s,data[i].p,data[i].pa,data[i].l,data[i].w);
}

4、设计结果

 c语言实现香农编码和译码_香农编码码长

参考:https://blog.csdn.net/keyhn/article/details/5185806

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195149.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 灰色关联度分析(Grey Relation Analysis,GRA)原理详解[通俗易懂]

    灰色关联度分析(Grey Relation Analysis,GRA)原理详解[通俗易懂]释名灰色关联度分析(GreyRelationAnalysis,GRA),是一种多因素统计分析的方法。简单来讲,就是在一个灰色系统中,我们想要了解其中某个我们所关注的某个项目受其他的因素影响的相对强弱,再直白一点,就是说:我们假设以及知道某一个指标可能是与其他的某几个因素相关的,那么我们想知道这个指标与其他哪个因素相对来说更有关系,而哪个因素相对关系弱一点,依次类推,把这些因素排个序,得到一个…

    2022年7月17日
    14
  • 西天取经意义初探_show concern about

    西天取经意义初探_show concern about构建DirectShow应用程序  本章节描述构建DirectShow应用程序所需的头文件和库。WindowsSDK中提供了最新的DirectShow头文件和库。头文件    所有的DirectShow应用程序都需要Dshow.h头文件,一些DirectShow接口可能还需要额外的头文件。库文件    调试版和发布版都是用相同的.lib文件。 F…

    2022年10月12日
    0
  • idea2021.11激活(注册激活)

    (idea2021.11激活)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1M3Q9SD5XW-eyJsaWN…

    2022年3月28日
    81
  • 两种方式实现java Md5加密

    两种方式实现java Md5加密一、加盐方式/***生成32位md5码*@parampassword*@return*/publicstaticStringmd5Password(Stringpassword){try{//得到一个信息摘要器MessageDigestdigest=

    2022年7月15日
    16
  • jasypt库的使用[通俗易懂]

    jasypt库的使用[通俗易懂]jasypt库的使用1.简介Jasypt是一个Java简易加密库,用于加密配置文件中的敏感信息,如数据库密码。jasypt库与springboot集成,在实际开发中非常方便。2.添加依赖jasypt开发者开发了starter,添加jasypt-spring-boot-starter依赖就可以了。该库中有使用到slf4j依赖,若单独测试,需添加相应依赖,或直接添加spring-boot-st…

    2022年9月26日
    0
  • Jmeter—正则表达式提取器:模板&匹配数字详解「建议收藏」

    Jmeter—正则表达式提取器:模板&匹配数字详解「建议收藏」目录一、相关理论1.正则表达式2.模板3.匹配数字二、例子1.【模板&匹配数字】2.【例-贪婪&非贪婪】3.【例-普通】一、相关理论1.正则表达式():要提取的内容.:匹配任意单个字符串*:匹配(之前的符号)0次或多次+:匹配(+之前的符号)1次或多次?:不要太贪婪,在找到第一个匹配项后停止。.:匹配连续0个/多个字符.+:匹配连续1个/多个字符\:转义,.表示匹配字符.本身2.模板表示取哪几个括号中的值若模板为:000,则为整个表达式匹配到的内容(这里为整个响

    2022年9月10日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号