十进制与二进制小数的相互转换C语言
程序员文章站
2022-07-15 09:34:46
...
LinkStack * IntConverDToB(int t, LinkStack *s)/*十进制到二进制整数部分转换函数*/
{
while(t != 0)
{
s = LStackPush(s,t % 2);
t /= 2;
}
return s;
}
void DecConverDToB(float f,LinkQueue *l)/* 十进制到二进制小数部分转换函数*/
{
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;
GetRadixPoint(chs, &pos, &len);
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 menu;
int k;
float temp;
float f;
LinkQueue *l;
LinkStack *s = NULL;
char chs[100];
char chs1[100];
char chs2[100];
DataType e;
float num;
int tt=0;/*输出栈元素时使用*/
printf(" 进制转换 \n");
while(TRUE)
{
l = LQueueCreateEmpty();
s = (LinkStack *)malloc(sizeof(LinkStack));
s->data=1;
s->next=NULL;
printf("*****************************************\n");
printf("** 1、10-2进制小数转换 **\n");
printf("** 2、2-10进制小数转换 **\n");
printf("** 3、退出 **\n");
printf("*****************************************\n");
scanf("%d",&menu);
switch(menu)
{
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;
}
下一篇: c++ 二进制与十进制互转