我刚修改此代码以接受带小数部分的二进制数。这是代码:
#include <stdio.h>
int main()
{
double binaryval, frac, z;
long int hexadecimalval = 0, i = 1, remainder, num, p;
clrscr();
printf("Enter the binary number: ");
scanf("%lf", &binaryval);
num = binaryval;
frac = binaryval - num;
while (binaryval != 0)
{
remainder = num % 10;
hexadecimalval = hexadecimalval + remainder * i;
i = i * 2;
binaryval = binaryval / 10;
}
printf("Equivalent hexadecimal value: %lX", hexadecimalval);
printf(".");
while (binaryval != 0)
{
while(frac != 0)
{
z = frac * 2;
p = z;
frac = z - p;
}
remainder = p % 10;
hexadecimalval = hexadecimalval + remainder * i;
i = i * 2;
binaryval = binaryval / 10;
}
printf("%lX", hexadecimalval);
getch();
return 0;
}
所以问题是......它给出了一个完全错误的答案
示例输出:
输入二进制数:1111.1111
等效十六进制值:FFFFFFFF.FFFFFFFF
然后我尝试在此循环中将'binaryval'更改为'num' ...
while (num != 0)
{
remainder = num % 10;
hexadecimalval = hexadecimalval + remainder * i;
i = i * 2;
binaryval = num / 10;
}
但它只允许用户输入二进制数而不输入其他内容。此外,我甚至无法返回我的代码。它有点“卡住”,我必须关闭我的Turbo C再次运行它。
有人可以告诉我这是什么问题以及需要改变的事情吗?提前谢谢!
答案 0 :(得分:1)
这是一个适合你的解决方案,当我检查每个字符的输入时,它不会在内部存储很多内容。整体部分很简单,只需建立价值。小数部分有点困难,要正确对齐它我一次输入4位。
#include <stdio.h>
#include <ctype.h>
int main(void)
{
long whole=0;
int ch, fract=0, bits=0;
// integral part is straight fowrard
while ((ch=getchar()) != EOF && ch != '.' && ch != '\n') {
switch(ch) {
case '0':
whole = whole * 2;
break;
case '1':
whole = whole * 2 + 1;
break;
default:
printf("Bad input\n");
return 1;
}
}
printf("%lX", whole);
// fractional part is more tricky to align correctly
if (ch == '.') {
printf(".");
while ((ch=getchar()) != EOF && ch != '\n') {
switch(ch) {
case '0':
fract = fract * 2;
bits++;
break;
case '1':
fract = fract * 2 + 1;
bits++;
break;
default:
printf("Bad input\n");
return 1;
}
if (bits == 4) { // process 4 bits at a time
printf("%X", fract);
fract = 0;
bits = 0;
}
}
if(bits) { // deal with 1 to 3 trailing bits
printf("%X\n", fract << (4-bits));
}
}
printf("\n");
return 0;
}
您的样本输入和另一个:
1111.1111
F.F
1.000001
1.04
答案 1 :(得分:0)
首先,您需要在循环中将binaryval
更改为num
。