c语言,使用字符数组实现海明码产生和检查

本文详细介绍了如何生成具有校验位的海明码,并提供了一个用于检查生成的海明码是否正确的算法。该算法通过计算并验证每个校验位来确保输入字符串的完整性和准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值