| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 443 人关注过本帖
标题:自己写的有关海明码的代码,求批评!!
只看楼主 加入收藏
rjvsky
Rank: 3Rank: 3
来 自:陕西西安
等 级:论坛游侠
帖 子:77
专家分:106
注 册:2012-3-6
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
自己写的有关海明码的代码,求批评!!
程序代码:
#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);
}
2012-05-07 17:09
dzp1018
Rank: 2
等 级:论坛游民
帖 子:43
专家分:92
注 册:2012-3-15
收藏
得分:14 
太长了。。纠结,,,飘过。。。
2012-05-07 22:19
rjvsky
Rank: 3Rank: 3
来 自:陕西西安
等 级:论坛游侠
帖 子:77
专家分:106
注 册:2012-3-6
收藏
得分:0 
真心求解 啊!!怎么没人呢??

企业需要的人才,是真正可以给他们带来经济效益的人,而不是一大堆没用的证书,看淡证书,强化自己···
2012-05-07 22:59
快速回复:自己写的有关海明码的代码,求批评!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014230 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved