⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 o.c

📁 用C实现hamming压缩编解码
💻 C
字号:
#include "stdio.h"
#include "math.h"
#include"stdlib.h"
#include "time.h" 


void main()
{   int aa[10000];
	int i;                      
	int N; 
	////////////////////////
	int b[4][7]={{1,0,0,0,1,0,1},{0,1,0,0,1,1,1},{0,0,1,0,1,1,0},{0,0,0,1,0,1,1}};//定义生成矩阵
    int y=0,s=0;
	int j,k,m;
	int a[4],q[7],rr[10000/4*7];
    //////////////////////////
	int p,D=0;
	int cc[2500],dd[2500];
	int e[8][7]={{1,0,0,0,0,0,0},{0,1,0,0,0,0,0},{0,0,1,0,0,0,0},{0,0,0,1,0,0,0},{0,0,0,0,1,0,0},
	{0,0,0,0,0,1,0},{0,0,0,0,0,0,1},{1,1,0,0,0,0,0}};//定义错误图样
    int w[10000/4*7];
    ////////////////////////////
	int H[7][3]={{1,0,1},{1,1,1},{1,1,0},{0,1,1},{1,0,0},{0,1,0},{0,0,1}};
    int A=0,M=0,L=8;
	int f[3];
	int ww[10000/4*7];

printf("汉明(7,4)码的编码与译码:\n");
printf("请输入你想产生的二进制个数(至少四个但不超过1万):");
scanf("%d",&N);                                    //输入想产生的信源的个数
while(N<4) 
{
  printf("输入无效,请重新输入    ");
 printf("请输入你想产生的二进制个数(至少四个):");
  scanf("%d",&N);
}

    printf("随机产生的二进制序列为:\n");
     srand( (unsigned)time( NULL ) );                //产生一个随机序列,并把它放入a[]中
	for(i=0;i<N;i++)
	{
		aa[i]=rand()%2;
	     printf("%d",aa[i]);
	}
	printf("\n");
	////////////////////////////////////////////////
	//////////////////////////////////
	printf("编码后变为:\n");//编码生成码字
	for(m=0;m<N/4;m++)
	{   
	  for(i=y;i<(y+4);i++)
		{
		
		  a[i-y]=aa[i];
		  
	  }                     ////取出4位出来
		
		  for (j=0;j<7;j++)
		  { 
			q[j]=0;
			for(k=0;k<4;k++)
			
				q[j]+=a[k]*b[k][j];/////与生成矩阵相乘
			 }
      
		  for(i=s;i<(s+7);i++)
		{rr[i]=0;
		
		 rr[i]=q[i-s]%2;
		 printf("%d",rr[i]);////将生成的放入rr[]中
		 
		}
		
       y=y+4;////向后移动4位
	   s=s+7;///向后移动7位
        printf("\n");
	
	}
	
		
	/////////////////////////////////////
//////////////////////////////////
printf("经过信道后变为:\n");
srand( (unsigned)time( NULL ) );
for(j=0;j<N/4;j++)
{     
	cc[j]=rand()%100;////产生一个0~99的随机数
	
if(cc[j]<9)////当随机数小于9时,一个码字产生2个错误
{
		for(i=D;i<(D+7);i++)
			  {w[i]=0;
			w[i]=(rr[i]+e[7][i-D])%2;
		
		printf("%d",w[i]);}
}
else if((cc[j]>=9)&&(cc[j]<=30))///当随机数在9~30时,一个码字产生一个错误
{
	dd[j]=rand()%7;
         p=dd[j];           ///随机产生一个0~6的数,以确定是码字一个错误的位置
		for(i=D;i<(D+7);i++)
		{w[i]=0;
			w[i]=(rr[i]+e[p][i-D])%2;
          
		printf("%d",w[i]);}
}
else                    //////当随机数在30~99时,不发生错误
{
	for(i=D;i<(D+7);i++)
		{w[i]=0;
		w[i]=rr[i];
	
         printf("%d",w[i]);}
		
}
	D=D+7;////向后移动7位
printf("%6d",cc[j]);/////进行跟踪,以确定码字错几位
	printf("\n");
}

///////////////////////////
/////////////////////////////
printf("经过译码后变为: \n");
for(i=0;i<N/4;i++)
{
	for(j=0;j<3;j++)
	{
		f[j]=0;
		for(k=A;k<A+7;k++)
			f[j]+=w[k]*H[k-A][j];/////计算伴随式
	}
	for(m=0;m<7;m++)
	{
		for(j=0;j<3;j++)
	        if((f[j]%2)==H[m][j])M=M+1;
	    if(M==3)L=m ;
		M=0;//清零
	}                     ///根据伴随式找到出错的位置
    for(m=0;m<7;m++)
	{
		if(m==L)
		{
			ww[A+m]=(w[A+m]+1)%2;//将出错的地方更正
       printf("%d",ww[A+m]);
		}
	else
	{
		ww[A+m]=w[A+m];
	printf("%d",ww[A+m]);//没有出错的地方
	}
	}
	
 A=A+7;//向后移动7位
  L=8;//复位
 M=0;///清零,复位
printf("\n");
}

getchar();getchar();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -