输入一段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);//构造出汉明码
}
}