C中,十六进制的小数部分怎样转换为十进制,程序如下,请看补充:

来源:百度知道 编辑:UC知道 时间:2024/06/16 14:47:53
#include <stdio.h>
#include <string.h>
main()
{char h[36];
double d=0.0,p=1.0;
int i=0,k=0,n=1;
printf("\nplease input hexadecimal data:\n");
scanf("%s",h);
strupr(h);
while(h[i]==32) i++;
if(h[i]=='-') {n=-1;i++;}
if(h[i]=='+') i++;
while(h[i]!=0) {
if(h[i]=='.') {k=1;i++;continue;}
if(h[i]>='0'&&h[i]<='9')
h[i]=h[i]-48;
else if(h[i]>='A'&&h[i]<='Z')
h[i]=h[i]-55;
else {printf("\nerror!\n");
break;}
if(k==0) d=d*16+h[i];
else {p=p/16.0; d= } /*这个地方d要等于什么呢,别的地方应该都对,只有它我知道怎么写,请高手耐心看下去:谢谢!*/
i++;
}
d=d*n;
printf("decimal data is:%lf\n",d);
getch();
return 0;
}
它的功能是,从键盘输入一个十六进制数,要求允许输入的16进制数包含小数部分和符号,并且可能使用大写或小写字母,转换时忽略前导空格。这是题目要求,我试过,整数部分是正确,但小数不对,请看我的注释,谢谢!

算法有问题

else {p=p/16.0; d= } /*这个地方d要等于什么呢,别的地方应该都对,只有它我知道怎么写,请高手耐心看下去:谢谢!*/

这种算法行不通,因为:
在整数部分先得到的是低位,所以d=d*16+h[i]; 可以实现
然而,在小数部分,先得到的是高位,就不能一个一个处理了
解决方法有两种
1.
递归(程序简单)
不过,这种算法,还是要先把数存起来,所以,采用数组比较好
2.
数组(容易理解)
把小数部分得到的数存到数组中
倒序处理
如果有疑问
留言,我每天都会上线
必回

补充哦
惭愧~~~
楼主
d=d+p*h[i];确实可以
我没想到