//编写一个函数,将以字符串形式给出的浮点数的十六进制形式转换成十进制形式
//请严格按照格式输入:例如: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");
}
}
将以字符串形式给出的浮点数的十六进制形式转换成十进制形式(方法太麻烦,请各位大侠帮忙改进!)
最新推荐文章于 2020-04-11 13:20:45 发布