欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

十进制与二进制小数的相互转换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;
}