海明码生成的方案

输入一段10101…序列,生成其海明码。生成过程在代码中已经表示出来了。
在这里插入图片描述
本代码在code::blocks17.12中正常运行。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 60
//2的幂
int power(int subnum){
    if(subnum==0){
        return 1;
    }
    int res=2;
    while((--subnum)>0){
        res=2*res;
    }
    return res;
}

char procode[MAXSIZE];

//创建一个原始代码序列
char* create_a_code(){
    printf("输入代码:");
    char* precode=malloc(MAXSIZE*sizeof(char));
    scanf("%s",precode);
    return precode;
}

//计算汉明码的位数
int count_the_checkcode_digit(int digit){
    int temp;
    if(digit<=5){
        return digit+2;
    }
    for(temp=3;;temp++){
        if(digit>(power(temp)-temp)&&digit<=(power(temp+1)-temp-1)){
            return digit+temp;
        }
    }
}

//拆开原有代码,留出汉明码的位置
char* break_the_code(char* precode){

    int digit=strlen(precode);

    int checkcode_digit=count_the_checkcode_digit(digit);
    char* code=malloc((checkcode_digit+1)*sizeof(char));
    int i=1,j=0;

    while(i<=checkcode_digit){
        code[i-1]='a';
        i*=2;
    }
    i=0;
    while(++i<=checkcode_digit+1){
        if(code[i-1]=='a'){
            continue;
        }else{
            code[i-1]=precode[j++];
        }
    }
    code[i-1]='\0';
    printf("汉 明 码:%s\n",code);
    return code;
}

//奇偶位校验函数
int parity_check(char* code){
    int i=-1;
    int res=0;
    while(code[++i]!='\0'){
        if(code[i]=='a'){
            printf("worng!\n");
            continue;
        }
        res+=code[i]-'0';
    }
    if(res%2==0){
        printf("--->>校验位=0\n\n");
        return 0;//1的和是偶数
    }else{
        printf("--->>校验位=1\n\n");
        return 1;//1的和是奇数
    }
}


//拆分代码进行奇偶位校验
//输入1---1:拆成2 4 6 8 10...
//输入2---2:拆成2 / 5 6 / 9 10 /...
//输入3---4:拆成4 5 6 / 11 12 13 14 / 19 20 21 22 /...
//输入4---8:拆成8 9 10 11 12 13 14 / 23 24 25 26 27 28 /...
char* divide_the_code(char* code,int times){
    int i=0,j=0;
    int len=strlen(code);

    times=power(times-1);
    printf("选择位数  ");
    while(i<times){
        printf(" ");
        i++;
    }

    while(i<=times*2-2){
        printf("^");
        procode[j++]=code[i++];
        if(code[i]=='\0'){
            break;
        }
    }
    while(1){
        for(int r=0;r<times;r++){
            if(code[i+1]=='\0'){
                break;
            }
            printf(" ");
            i++;
        }
        if(code[i+1]=='\0'){
            break;
        }
        for(int r=0;r<times;r++){
            if(code[i+1]=='\0'){
                break;
            }
            printf("^");
            procode[j++]=code[i++];

        }
        if(code[i+1]=='\0'){
            break;
        }
    }
    procode[j]='\0';
    printf("--->>%s",procode);
    return procode;
}

void construct_Hamming_code(char* code){
    int times=1;
    int i=0;
    int len=strlen(code);

    while(1){
        while(code[i]!='a'&&code[i]!='\0'){
            i++;
            continue;
        }
        if(code[i]=='\0'){
            break;
        }
        char* temp=divide_the_code(code,times++);
        code[i]=parity_check(temp)+'0';
        printf("汉 明 码:%s\n",code);
        i++;
    }
}


int main()
{
    while(1){
        char* precode=create_a_code();//创建一个原始代码序列
        char* code=break_the_code(precode);//拆开原有代码,留出汉明码的位置
        construct_Hamming_code(code);//构造出汉明码
    }

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值