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

数据结构 专栏收录该内容
10 篇文章 0 订阅
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;
}
  • 0
    点赞
  • 0
    评论
  • 5
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页

打赏作者

zhong_良

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值