循环码系统与非系统编码的C语言实现:
#include "stdio.h"
#include <stdlib.h>
#define N 10
//系统编码实现
void X(int g[N],int c[N],int r,int n)
{int degg,degc,i,k,t,j,e,u,sum=0;
int d[N][2*N]={0},C[N],R[N],a[N][2*N],q[N];
degg=r;
//求信息多项式的次幂
for(i=0;i<=n-r-1;i++)
{
if(c[i]!=0)
{degc=n-i-1;
break;
}
}
for(i=0;i<N;i++)
{q[i]=g[i];
R[i]=c[i];
}
k=degc-degg;
e=k;
//二进制除法实现
for(j=0;j<N;j++)
{
for(i=0;i<N;i++)
{
q[i]=g[i];
}
for(i=n-1;i>=e;i--)
{
t=q[i];q[i]=q[i-e];q[i-e]=t;
}
for(i=0;i<=n-1;i++)
{
c[i]=(c[i]+q[n-1-i])%2;
}
for(i=0;i<=n-1;i++)
{
if(c[i]!=0)
{degc=n-i-1;
break;
}
}
e=degc-degg;
u=j;
if(e<0){break;}
}
for(i=0;i<=n-1;i++)
{
C[i]=(R[i]+c[i])%2;
}
//输出
printf("系统编码的结果为:/n");
printf("/t");
for(j=0;j<=n-1;j++)
printf("%d ",C[j]);
printf("/n");
}
//非系统编码实现
void UX(int g[N],int c[N],int r,int n)
{int a[N][2*N],x[N];
int i,j,k,sum=0;
//二进制乘法
for(j=0;j<=n-r-1;j++)
{for(i=0;i<j;i++)
a[j][i]=0;
for(i=0;i<=n-1;i++)
a[j][i+j]=c[j]*g[i];
for(k=i+j;k<=2*n-r-2;k++)
a[j][k]=0;
}
for(j=0;j<=2*n-r-2;j++)
{sum=0;
for(i=0;i<=n-r-1;i++)
sum=(a[i][j]+sum)%2;
x[j]=sum;
}
//输出
printf("非系统编码的结果:/n");
printf("/t");
for(j=0;j<=n-1;j++)
printf("%d ",x[j]);
printf("/n");
}
void main()
{int i,n,m,t,r;
int g[N]={0},c[N]={0};
printf("****循环码编码方法(码长n<=10)****/n");
printf("/t输入码长n:");
scanf("%d",&m);
n=m;
switch(n)
{case 1 :printf("输入校验位r<=%d:",n-1);
scanf("%d",&r);
switch(r)
{case 0:g[0]=1;break;
} break;
case 2 :printf("输入校验位r<=%d:",n-1);
scanf("%d",&r);
switch(r)
{case 0:g[0]=1;break;
case 1:g[0]=1;g[1]=1;break;
} break;
case 3 :printf("输入校验位r<=%d:",n-1);
scanf("%d",&r);
switch(r)
{case 0:g[0]=1;break;
case 1:g[0]=1;g[1]=1;break;
case 2:g[0]=1;g[1]=1;g[2]=1;break;
} break;
case 4 :printf("输入校验位r<=%d:",n-1);
scanf("%d",&r);
switch(r)
{case 0:g[0]=1;break;
case 1:g[0]=1;g[1]=1;break;
case 2:g[0]=1;g[1]=0;g[2]=1;break;
case 3:g[0]=1;g[1]=1;g[2]=1;g[3]=1;break;
} break;
case 5 :printf("输入校验位r=0,1,4:");
scanf("%d",&r);
switch(r)
{case 0:g[0]=1;break;
case 1:g[0]=1;g[1]=1;break;
case 4:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;break;
} break;
case 6 :printf("输入校验位r<=%d:",n-1);
scanf("%d",&r);
switch(r)
{case 0:g[0]=1;break;
case 1:g[0]=1;g[1]=1;break;
case 2:g[0]=1;g[1]=1;g[2]=1;break;
case 3:g[0]=1;g[1]=0;g[2]=0;g[3]=1;break;
case 4:g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1;break;
case 5:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;break;
} break;
case 7 :printf("输入校验位r=0,1,3,4,6:");
scanf("%d",&r);
switch(r)
{case 0 :g[0]=1;break;
case 1 :g[0]=1;g[1]=1;break;
case 3 :g[0]=1;g[1]=1;g[2]=0;g[3]=1;break;
case 4 :g[0]=1;g[1]=1;g[2]=1;g[3]=0;g[4]=1;break;
case 6 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1; g[6]=1;break;
} break;
case 8 :printf("输入校验位r<=%d:",n-1);
scanf("%d",&r);
switch(r)
{case 0 :g[0]=1;break;
case 1 :g[0]=1;g[1]=1;break;
case 2 :g[0]=1;g[1]=0;g[2]=1;break;
case 3 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;break;
case 4 :g[0]=1;g[1]=0;g[2]=0;g[3]=0;g[4]=1;break;
case 5 :g[0]=1;g[1]=1;g[2]=0;g[3]=0;g[4]=1;g[5]=1;break;
case 6 :g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1;g[5]=0; g[6]=1;break;
case 7 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;g[6]=1; g[7]=1;break;
} break;
case 9 :printf("输入校验位r<=%d:",n-1);
scanf("%d",&r);
switch(r)
{case 0 :g[0]=1;break;
case 1 :g[0]=1;g[1]=1;break;
case 2 :g[0]=1;g[1]=0;g[2]=1;break;
case 3 :g[0]=1;g[1]=0;g[2]=0;g[3]=1;break;
case 4 :g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1;break;
case 5 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;break;
case 6 :g[0]=1;g[1]=1;g[2]=0;g[3]=1;g[4]=0;g[5]=1; g[6]=1;break;
case 7 :g[0]=1;g[1]=0;g[2]=1;g[3]=1;g[4]=1;g[5]=1; g[6]=0;g[7]=1;break;
case 8 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;g[6]=1; g[7]=1;g[8]=1;break;
} break;
case 10 :printf("输入校验位r=0,1,2,,4,5,6,8,9:");
scanf("%d",&r);
switch(r)
{case 0 :g[0]=1;break;
case 1 :g[0]=1;g[1]=1;break;
case 2 :g[0]=1;g[1]=0;g[2]=1;break;
case 4 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;break;
case 5 :g[0]=1;g[1]=0;g[2]=0;g[3]=0;g[4]=0;g[5]=1;break;
case 6 :g[0]=1;g[1]=1;g[2]=0;g[3]=0;g[4]=0; g[5]=1;g[6]=1;break;
case 8 :g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1; g[5]=0;g[6]=1;g[7]=0;g[8]=1;break;
case 9 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1; g[6]=1;g[7]=1;g[8]=1;g[9]=1;break;
} break;
}
printf("生成多项式系数矩阵为(幂次从低到高):/n");
for(i=0;i<=n-1;i++)
printf("%d ",g[i]);
printf("/n");
printf("输入信源信息向量c(%d位):/n",n-r);
for(i=0;i<=n-r-1;i++)
scanf("%d",&c[i]);
while(1)
{
printf("/t*****选择编码方式及命令*****/n");
printf("/t 1:系统编码/n");
printf("/t 2:非系统编码/n");
printf("/t 3:退出程序!!!/n");
printf("/t***************************/n");
scanf("%d",&t);
switch(t)
{case 1 :X(g,c,r,n);break;
case 2 :UX(g,c,r,n);break;
case 3 :printf("退出程序〉〉〉");exit(0);break;
}
printf("/n");
}
}