自己写的有关海明码的代码,求批评!!
程序代码:#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <malloc.h>
#define N 100
int faSongFang(int* a);
int panDuanJaoYanWeiGeShu(int i);
void chaRuJiaoYanWei(int* a,int r,int i);
void houYiShuZu(int* a,int i,int s);
void jiSuanJiaoYanWei(int* a,int r,int i);
int jiSuanCiFang(int r);
int jiSuanCiFang(int r)
{
int i,a=1;
for (i=0;i<r;i++)
{
a*=2;
}
return a;
}
/*该函数为了计算校验码的数值,因为要改变数组的值所以要传递指针过去!!!*/
void jiSuanJiaoYanWei(int* a,int r,int i)
{
int *b,j,f,t,k;//在这的b是为了储存数的编号所引进的数组,由于数组大小不定所以用malloc得到,j和t是控制循环的变量,f是控制校验位的变量,为了方便判断所引进的变量。
b=(int *) malloc(sizeof(int)*(i+r));
/*下面的循环为了记录数值编号,如果是校验位的编号,因为其不参与运算,所以将其值赋值为零,其它值变为其对应下标加一*/
for (f=0;f<(i+r);f++)
{
k=0;
for (j=r-1;j>=0;j--)
{
if(f==(((int)pow(2.0,(double)j))-1))
k=1;
}
if (k)
b[f]=0;
else
b[f]=f+1;
}
/*下面的循环解决了校验位数值的计算*/
for (j=r-1;j>=0;j--)
{
k=0;
for(t=i+r-1;t>=((int)pow(2.0,(double)j));t--)//控制数组下标
if((b[t]/(int)pow(2.0,(double)j)))
{
if(!k)//判断是不是第一次
{
a[(int)pow(2.0,(double)j)-1]=a[t];//如果是第一次则将该数组中的值赋值给校验位
k=1;
b[t]%=(int)pow(2.0,(double)j);
}
else
{
a[(((int)pow(2.0,(double)j))-1)] ^=a[t];
b[t]%=(int)pow(2.0,(double)j);
}
}
}
free(b);
}
/*由于下一个函数要将数组中的数据向后移动一个位所以再定义一个函数,此函数需要的参数有数组名a,数组中的元素个数i,要移动的位置s*/
void houYiShuZu(int* a,int i,int s)
{
for(;i>=s;i--)
{
a[i]=a[i-1];
}
}
/*向发送信息中插入校验码!!此函数将插入校验位的地方空了出来!!*/
void chaRuJiaoYanWei(int* a,int r,int i)
{
int j;
for (j=0;j<r;j++)
{
houYiShuZu(a,i+j,(int)pow(2.0,(double)j)); //调用的自定义的后移函数。
}
}
/*该函数功能是为了计算判断校验位的个数*/
int panDuanJaoYanWeiGeShu(int i)
{
int r;
for (r=0;;r++)
{
if ((int)pow(2.0,(double)r)>=(r+i))
break;
}
return r;
}
/*该函数的功能是接收用户从键盘输入的发送信息*/
int faSongFang(int* a)
{
int i=0,t,j,x;
char b[N];
gets(b);
i=strlen(b)-1;
x=i;
for (;i>=0;i--)
a[i]=b[i]-48;
/*因为从键盘接收到的值是从高位开始的,所以要想办法将低位存在数组的a[0]位置*/
for (t=0;t<(x/2);t++)
{
j=a[x-t];
a[x-t]=a[t];
a[t]=j;
}
return (x+1);
}
void main (void)
{
int a[N],i=0,j,r,t,flag,*c,sum=0;//i是控制循环的变量,r是校验位的个数
printf("请输入需发送数据(数据应为二进制)以数据不为0或1结束\n");
j=faSongFang(a);
for(i=0;i<j;i++)
printf("%d",a[i]);
r=panDuanJaoYanWeiGeShu( j);
printf("所需校验位为%d\n",r);
chaRuJiaoYanWei(a,r,j);
jiSuanJiaoYanWei( a, r, j);
printf("对方向我们发来的数据为:\n");
for(i=j+r-1;i>=0;i--)
printf("%d",a[i]);
c=(int *) malloc(sizeof(int)*(r));
for (t=r-1;t>=0;t--)
c[t]=a[(int)pow(2.0,(double)t)-1];
jiSuanJiaoYanWei( a, r, j);
for (t=r-1;t>=0;t--)
{
c[t]^=a[(int)pow(2.0,(double)t)-1];
c[t]*=jiSuanCiFang(t);
sum+=c[t];
}
if (sum)
printf ("\n传输中%d位出错\n",sum);
else
printf("传输过程未出错\n");
printf("对方发送数据为:");
for (i=j+r-1;i>=0;i--)
{
flag=0;
for (t=r-1;t>=0;t--)
{
if(i==(((int)pow(2.0,(double)t))-1))
flag=1;
}
if (!flag)
printf("%d",a[i]);
}
free(c);
}









