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

来源:互联网 发布:腾讯强力卸载软件 编辑:程序博客网 时间:2024/05/21 09:35
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;}
原创粉丝点击