# 十进制与二进制小数的相互转换C语言

10 篇文章 0 订阅
LinkStack * IntConverDToB(int t, LinkStack *s)/*十进制到二进制整数部分转换函数*/
{
while(t != 0)
{
s = LStackPush(s,t % 2);
t /= 2;
}
return s;
}
{
int i = 0;
while(i <= 6 && f != 0)
{
f = f * 2;
if(f >= 1)
{
f -= 1;
LQueueEnQueue(l,1);
}
else
LQueueEnQueue(l,0);
i ++;
}
}
void GetRadixPoint(const char * chs, int *pos,int *len) /* 获取小数点位置以及串的长度 */
{
int i = 0;
int flag = FALSE;
while('\0' != chs[i])
{
if(chs[i] == '.')
{
*pos = i;
flag = TRUE;
}
i ++;
}
if(flag)
*len = i;
else
{
*pos = -1;
*len = i;
}
}
int StringSplit(const char * chs, char * chs1,char *chs2) /* 拆分字符串chs，分成整数部分chs1和小数部分chs2 */
{
int pos = 0, len = 0;
int i = 0;
int k = 0;
if(pos != -1)
{
for(i = 0; i < pos; i ++)
chs1[i] = chs[i];
chs1[i] = '\0';
for(i = pos + 1; i < len; i ++)
chs2[k ++] = chs[i];
chs2[k] = '\0';
}
else
return ERROR;
return OK;
}

int IntConverBToD(char * chs, LinkStack *s)/* 二进制到十进制整数部分转换函数*/
{
int i = 0;
int sum = 0;
int k = 1;
int temp = 0;
int tt=0;/*临时输出栈元素使用*/
while('\0' != chs[i])
{
s = LStackPush(s,chs[i] - '0');
i++;
}
i = 0;
while(!LStackIsEmpty(s))
{
temp=LStackGetTop(s);
s = LStackPop(s,&tt);
if(temp != 1 && temp != 0)
return -ERROR;
if(0 == i)
sum += temp;
else
{
k *= 2;
sum += temp * k;
}
i++;
}
return sum;
}
float DecConverBToD(char * chs ,LinkQueue *l)/* 二进制到十进制小数部分转换函数*/
{
int i = 0;
float sum = 0;
float k = 1;
int temp = 0;
while('\0' != chs[i])
{
LQueueEnQueue(l,chs[i] - '0');
i ++;
}
while(!LQueueIsEmpty(l))
{
LQueueDeQueue(l,&temp);
if(temp != 1 && temp != 0)
return -ERROR;
k /= 2;
sum += temp * k;
i++;
}
return sum;
}
int main(int argc,char* argv[])
{
int k;
float temp;
float f;
char chs[100];
char chs1[100];
char chs2[100];
DataType e;
float num;
int tt=0;/*输出栈元素时使用*/
printf("             进制转换         \n");
while(TRUE)
{
l = LQueueCreateEmpty();
s->data=1;
s->next=NULL;
printf("*****************************************\n");
printf("**    1、10-2进制小数转换              **\n");
printf("**    2、2-10进制小数转换              **\n");
printf("**    3、退出                          **\n");
printf("*****************************************\n");
{
case 1:
getchar();
printf("请输入需要转换的数字：\n");
scanf("%f",&temp);
if(temp > 1.0 && temp != (int)temp)
{/* 如果输入的不是一个整数并且大于1 */
s = IntConverDToB((int)temp,s);
DecConverDToB(temp - (int)temp,l);
printf("转化后的二进制小数为：",temp);
while(!LStackIsEmpty(s))
{
printf("%d",LStackGetTop(s)); /* 输出整数部分 */
s=LStackPop(s,&tt);
}
printf(".",temp);
while(!LQueueIsEmpty(l)) /* 输出小数部分 */
{
LQueueDeQueue(l,&e);
printf("%d",e);
}
printf("\n");
}
else
{
if(temp == (int)temp) /* 如果输入的是一个整数 */
{
printf("%d转化后的二进制小数为：",(int)temp);
s = IntConverDToB((int)temp,s);
while(!LStackIsEmpty(s)) /* 输出整数部分 */
{
printf("%d",LStackGetTop(s));
s=LStackPop(s,&tt);
}
printf(".0\n");
}
else /* 如果输入的是一个小于1的小数 */
{
printf("----------\n");
printf("转化后的二进制小数为：",temp);
DecConverDToB(temp,l);
printf("0.",temp);
while(!LQueueIsEmpty(l))  /* 输出小数部分 */
{
LQueueDeQueue(l,&e);
printf("%d",e);
}
printf("\n");
getchar();
}
}
break;
case 2:
getchar();
printf("请输入需要转换的二进制数字：\n");
gets(chs);
k = StringSplit(chs,chs1,chs2);
if(k != -1)
{
num = IntConverBToD(chs1,s);
f = DecConverBToD(chs2,l);
if(-1 != num && f != -1)
printf("转化后的十进制形式为：%f\n",(float)num + f);
else
printf("输入格式错误\n");
}
else
{
num = IntConverBToD(chs,s);
if(-1 != num)
printf("转化后的十进制形式为：%f\n",(float)num);
else
printf("输入格式错误\n");
}

break;
case 3: /* 退出 */
return 0;
default: /* 输入不满足要求，提示输入错误 */
printf("输入错误，请重新输入！\n");
continue;
}
}
return 0;
}
• 0
点赞
• 0
评论
• 5
收藏
• 打赏
• 扫一扫，分享海报

09-04
01-21 311

06-20 14万+
08-13 2万+
02-22 1万+
04-17 3万+
03-04 2万+
06-22 8528
04-19 1万+
12-22 4209

zhong_良

¥2 ¥4 ¥6 ¥10 ¥20

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