将以字符串形式给出的浮点数的十六进制形式转换成十进制形式(方法太麻烦,请各位大侠帮忙改进!)

//编写一个函数,将以字符串形式给出的浮点数的十六进制形式转换成十进制形式
//请严格按照格式输入:例如:0x*.*
//程序有个bug,就是必须输入浮点数!必须有小数点
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <string.h>
#define N 100
//判断该串是否为十六进制数
bool IsHex(char str[],int n)
{
	if(str[0]=='0' && str[1]=='x')
	{
		for(int i=2; i < n; i++)
		{
			if(isdigit(str[i]) || str[i]=='A' || str[i]=='B' || str[i]=='C' || str[i]=='D' || str[i]=='E' || str[i]=='F' || str[i]=='.')
			{
				return true;
			}
			else
			{
				return false;
			}
		}
	}
	else
	{
		return false;
	}
}


//将十六进制转换成十进制
void HexToDecimal(char str[],int length,double *Decimal)
{
	//提取整数部分
	char intergal[N]={'0'};
	int i=2;
	
	while(str[i] != '.')
	{
		intergal[i-2]=str[i];
		i++;
	}
	//跳过小数点
	i++;
	//提取小数部分
	char XiaoShu[N]={'0'};
	int j=0;
	while(i<length)
	{
		XiaoShu[j]=str[i];
		j++;
		i++;
	}
	//分别转换
	int length_int=strlen(intergal);
	
	for(int h=length_int-1; h>=0; h--)
	{
		if(isalpha(intergal[length_int-h-1]))
		{
			*Decimal += (intergal[length_int-h-1]-55)*pow((double)16,double(h));
		}
		else
		{
			*Decimal += (intergal[length_int-h-1]-'0')*pow((double)16,double(h));
		}
	}
	int length_dec=strlen(XiaoShu);
	
	for(int k=-1,y=0; k>= -length_dec; k--,y++)
	{
		if(isalpha(XiaoShu[y]))
		{
			*Decimal += (XiaoShu[y]-55)*pow((double)16,double(k));
		}
		else
		{
			*Decimal += (XiaoShu[y]-'0')*pow((double)16,double(k));
		}
	}
}



void main()
{
	//测试IsHex
	char str[N];

	printf("请输入一个十六进制数:");
	gets(str);
	
	int length = strlen(str);
	double Dec=0;
	if(IsHex(str,length))
	{
		HexToDecimal(str,length,&Dec);
		printf("\n对应的十进制数为:%lf\n",Dec);
	}
	else
	{
		printf("出错!不是十六进制数!\n");
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值