程序运行输入有误的海明码
程序运行输入正确的海明码
// 最近我在准备软件工程师考试,正好学到海明编码,于是花了半天时间写了海明编码及接收纠错的程序,与同学们共享,源程序如下:
//--------------海明码发送和接收验证程序---------------------------------
// by recom 2019/12/28 13908230061
// 方式一:顺序存储,后面我会用链表存储方式做同样计算程序
// 编码和解码均采用偶校验
//-----------------------------------------------------------------------
#include "stdio.h" //标准输入输出
#include "stdlib.h" //随机数 动态分配内存
#include "string.h" //字符串
#include "math.h" //数学库
char inputchar[100],*ip=inputchar,inputcompchar[100],*cp=inputcompchar;
//海明编码程序
void dispose(char *sp)
{
int ln; //源串长度
int hmln; //校验码长度
int i,j,k; //通用计数器
int hmpos; //海明码位置
char *cp; //当前地址指针
char *hcp; //海明码位置指针
int cln; //校验及跳跃点数
int tempcc; //统计码中“1”的个数
char tempcv; //字符临时变量
//第一步,确定校验码位数 应用公式:M+K+1<=2^K
hmln=strlen(inputchar); //源串长度
for (i=2,hmln=0;i<=8;i++)
{
if ((ln+i+1)<=pow(2,i)) {hmln=i; break;}
}
printf(">> 您输入字符串长度为:%d,海明校验位长度为:%dn",ln,hmln);
//第二步,确定校验码位置
*(sp+ln+hmln)=''; //原字符串数组长度增加hmln位。
for (i=0;i<hmln;i++)
{
hmpos=(int)pow(2,i)-1; //海明码相对位置
hcp=sp+hmpos; //海明码位置指针
cp=sp+ln-1+i; //移动指针指向源串尾部
while (cp>=hcp) { *(cp+1)=*cp; cp--; }
*hcp='?'; //海明码位置用先用?占位
}
//第三步,计算海明码各位的值
for (i=0;i<hmln;i++)
{
hmpos=(int)pow(2,i)-1; //海明码位置
cln=(int)pow(2,i); //校验及跳跃点数
//从海明码位置开始,校验cln位,然后跳过cln位,统计"1"个数
cp=sp+hmpos; //从CP开始校验
tempcc=0,j=0,k=0; //复位计数器
tempcv=cp[j]; //开始验证地址的字符,第一个应该是?。
if (tempcv!='?') { printf("意外错误!n"); exit (0); } //出错
j++,k++; //校验计数器加1
while(j<(ln+hmln)) //直到字符串数组的尾部
{
tempcv=cp[j]; //读取字符
if (k!=cln) {if (tempcv=='1') {tempcc++;} k++,j++;} //校验N位
else {k=0; j+=cln;} //跳过N位
}
if (tempcc%2==0) {cp[0]='0';}//如果1的个数是偶数个,检校验写0
else cp[0]='1'; //如果1的个数是奇数个,校验位写1
}
}
//验证编码的海明数据是否正确
void check(char *cp)
{
//定义变量
int ln; //编码数据串长度
int hmpos; //校验位位置
int ckln; //校验长度
int i,j,k; //通用计数器
char tempcv; //字符临时变量
int tempcc; //统计1的个数
char *bp=cp; //动态指针
int result[8]={0}; //存放检验结果,1表示有错误,0表示无错误
int rv=0; //错误位置
ln=strlen(cp); //计算输入已编码海明校验数据长度
//开始验证
for (i=0;i<=8;i++)
{
ckln=(int)pow(2,i); //校验长度
hmpos=ckln-1; //求出校验码位置
k=0,tempcc=0,j=0; //计数清0
if (hmpos>(ln-1)) { break;} //超出退出
//下面开始检查每位正确性
while (j
{
tempcv=bp[hmpos+j];
if (k!=ckln) //验证N位
{ if (tempcv=='1') tempcc++; k++,j++;}
else {k=0;j+=ckln; } //跳过N位
}
if (tempcc%2!=0) result[i]=1;
}
//分析结果
for (j=0;j
{ if (result[j]!=0) rv+=pow(2,j); }
//输出结果
if (rv==0) printf("您输入的海明编码正确!n");
else printf("您输入的海明编码第%d位错误!n",rv);
}
//主程序
void main()
{
printf(">> 请输入未编码数据:");
gets(ip); //输入数据
dispose(ip); //编码数据
printf(">> 编码后的海明数据为:%sn",ip); //输出数据
printf("n>> 请输入编码后的海明数据:");
gets(cp); //输入已编码的海明数据
check(cp); //验证编码
}
因为HTML编码经常损坏代码,所以将代码以图片形式附在后面: