海明码生成模拟程序(c)

#include <cstdio>
#include <windows.h>
#include <math.h>
#define COLOR_BIN 0
void colorxy(int x, int y)
{
	HANDLE hOut;
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hOut, x|y);
}
/**
 * 输入二进制数
 */
void in_bin(int bin[]){
    char binary[100];
    int i=0;
    printf("请输入一个二进制数:");
    scanf("%s",binary);
    while(binary[i]){
        bin[i+1]=binary[i]-48;
        i++;
    }
    bin[0]=i;
}
/**
 * 输出二进制数
 */
void out_bin(int bin[]){
    printf("二进制数为:");
    for(int i=1;i<=bin[0];i++){
        if(COLOR_BIN)
            colorxy(0x0a,0x0a);
        printf("%d",bin[i]);
        colorxy(0x07,0x07);
    }
    printf("\n");
}
/**
 * 输出海明码位上的数
 */
void out_p(int p[]){
    printf("海明码位上的数为:");
    for(int i=1;i<=p[0];i++){
        colorxy(0x0a,0x0a);
        printf("%d",p[i]);
        colorxy(0x07,0x07);
    }
    printf("\n");
}
/**
 * 输出海明码
 */
void out_haiming(int bin[],int p[],int place=0){
    printf("海明码为:");
    int i,n=1;
    int pp=1,pb=1;
    for(i=1;i<=bin[0]+p[0];i++)
        if(i==n){
            colorxy(0x0a,0x0a);
            printf("%d",p[pp++]);
            colorxy(0x07,0x07);
            n=n*2;
        }
        else{
            if(pb==place)colorxy(0x0c,0x0c);
            printf("%d",bin[pb++]);
            colorxy(0x07,0x07);
        }
    printf("\n");
}
/**
 * 找到海明码位
 */
int pos(int i){//找到海明码位
    int c=0;
    int pos=2,n=4;
    while(c<i){
        pos++;
        if(pos==n)n*=2,c--;
        c++;
    }
    return pos;
}
/**
 * 计算海明码
 */
void in_p(int p[],int bin[]){
    int i,j;
    p[0]=1;
    while(1<<p[0]<p[0]+bin[0]+1)p[0]++;
    //printf("%d\n",p[0]);//输出海明码的个数
    for(i=1;i<100;i++)p[i]=0;//初始化
    for(i=1;i<=p[0];i++){
        for(j=1;j<=bin[0];j++){
            //printf("%d ",pos(j)&(1<<(i-1)));
            if(pos(j)&(1<<(i-1))){
                p[i]=(p[i]+bin[j])%2;
            }
        }
    }
 }
/**
 * 输入出错的位置
 */
 void wrong(int bin[],int p){
    bin[p]=(bin[p]+1)&1;
 }
 /**
 * 找到出错的位置
 */
 void findwrong(int bin[],int p[]){
    int i,j;
    int w[100];
    for(i=1;i<100;i++)w[i]=0;//初始化
    for(i=1;i<=p[0];i++){
        for(j=1;j<=bin[0];j++){
            //printf("%d ",pos(j)&(1<<(i-1)));
            if(pos(j)&(1<<(i-1))){
                w[i]=(w[i]+bin[j])%2;
            }
        }
    }
    int place=0;
    printf("海明码的出错位置为:");
    for(i=p[0];i>0;i--){
        w[i]=(w[i]+p[i])%2;
        printf("%d",w[i]);
        place+=(1<<i-1)*w[i];
    }
    printf("=%d\n",place);
 }
int main(){
    int bin[100];
    int p[100];
    while(1){
        in_bin(bin);
        in_p(p,bin);
        //printf("\n-----------------------------\n");
        out_bin(bin);
        out_p(p);
        out_haiming(bin,p);
        printf("-----------------------------\n");
        int place;
        printf("请输入错误的位置(二进制数的位置):");
        scanf("%d",&place);
        wrong(bin,place);
        out_haiming(bin,p,place);
        findwrong(bin,p);
        printf("-----------------------------\n\n");
    }
}

你可能感兴趣的:(海明码生成模拟程序(c))