#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
void gethaiming();
void checkhaiming();
void main()
{
char i,j;
while(1)
{
printf("选择: 1 生成海明码;2 检查海明码;# 退出:");
scanf("%c",&i);
j=getchar();
switch(i)
{
case '1':gethaiming();;break;
case '2':checkhaiming();break;
default:break;
}
if(i=='#')
{
break;
}
}
}
void gethaiming()
{
char num1[100]; /*存储输入字符串*/
char haiming[100];//用来存放编写后的字符数组
char jiesu;
int signala; //现在已计算的的和
int longs; //计算输入字符的长度
int cifang1,cifang2,cifang3; //用于存储到2的n次方
int long2; //存储整个字符串的长度
int long1_1; //下面有注释
int fangru1,fangru2; //用在放入字符串时的循环变量
double long1; //在得到2的多少次方时pow函数规定需要double类型故申请
double signal1; //校验位的具体位
while(1)
{
/*变量初始化*/
cifang1=0;
cifang2=0;
cifang3=0;
signal1=0;
long1 = 0;
long2 = 0;
fangru1=0;
fangru2=0;
printf("请输入你需要生成海明码的源码(输入#退出):");
scanf("%s",num1);
jiesu=getchar();
if(num1[0]=='#')
{
break;
}
longs = strlen(num1); //获取输入字符串长度
while(1)//用于确定需要申请的空间位数
{
cifang1=(int)pow(2,long1);// double pow(int n,double m)获得一个n的m次方
if(cifang1>=longs+long1)
{
break;
}
long1++;
}
long1_1=(int)long1;//计算校验位的个数为下面的校验做准备
printf("需要%d位海明码校验位。\n",long1_1);
for(fangru1=0,fangru2=0;fangru1<(longs+(int)long1)&&fangru2<longs;fangru1++)
{
if((fangru1+1)&fangru1)
{
haiming[fangru1]=num1[fangru2];
fangru2++;
}
}
haiming[fangru1]='\0';
for(signal1 = 0;signal1 < long1_1;signal1++)//使用循环验证每个校验位是否正确
{
signala=0;
for(long2 = 0;long2 < longs+long1;long2++) //验证具体的校验位是否出错
{
cifang2=(int)pow(2,signal1+1);//用于接收次方的具体数
cifang3=(int)pow(2,signal1);
//前面一个条件是核心用来判断当前数组中具体的位置是否为当前校验位需要计算的位置
if((((long2 +1)%cifang2)>=cifang3)&&(haiming[long2]=='1'))
{
signala++;
}
}
long2=0;
if (signala%2!=0)//偶校验处
{
haiming[cifang3-1]='1';
}
else
{
haiming[cifang3-1]='0';
}
}
printf("对应正确的海明码为:%s\n",haiming);
}
}
void checkhaiming()
{
char num1[100]; /*接收输入字符*/
char jiesu;
int signala; //现在已计算的的和
int signala2; //标志哪一位出错
int longs; //计算输入字符的长度
int cifang1,cifang2,cifang3;
int long2;
int long1_1;
double long1;
double signal1;
while(1)
{
cifang1=0;
cifang2=0;
cifang3=0;
signala2=0;
signal1=0;
long1 = 0;
long2 = 0;
printf("请输入你需要校验的海明码(输入#退出):");
scanf("%s",num1);
jiesu = getchar();
if(num1[0]=='#')
{
break;
}
longs = strlen(num1); //获取输入字符串长度
while(1)
{
cifang1=(int)pow(2,long1);// double pow(int n,double m)获得一个n的m次方
if(cifang1>=longs)
{
break;
}
long1++;
}
long1_1=(int)long1;//计算校验位的个数为下面的校验做准备
printf("海明码校验位有%d位。\n",long1_1);
signala2 =0;
for(signal1 = 0;signal1 < long1_1;signal1++)//使用循环验证每个校验位是否正确
{
signala=0;
for(long2 = 0;long2 < longs;long2++) //验证具体的校验位是否出错
{
cifang2=(int)pow(2,signal1+1);//用于接收次方的具体数
cifang3=(int)pow(2,signal1);
//前面一个条件是核心用来判断当前数组中具体的位置是否为当前校验位需要计算的位置
if((((long2 +1)%cifang2)>=cifang3)&&(num1[long2]=='1'))
{
signala++;
}
}
long2=0;
if (signala%2!=0)//偶校验处
{
signala2=signala2 + cifang3;
}
}
if(signala2==0)
{
printf("输入的海明码没有错误。\n");
}
else
{
//校正错误的位
if(num1[signala2-1]=='1')
{
num1[signala2-1]='0';
}
else if (num1[signala2-1]=='0')
{
num1[signala2-1]='1';
}
printf("海明码中第%d位出错\n",signala2);
printf("对应正确的海明码为:%s\n",num1);
}
}
}
c语言,使用字符数组实现海明码产生和检查
最新推荐文章于 2023-05-22 20:50:12 发布