#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"); } }