各个进制之间的转换(有源码,直接可供参考使用)|数据结构

发布于 2021-07-10  20 次阅读


进制转换思路
利用ASCII码之间关系,对进制实现不同转换
具体实现使用了栈

完整代码

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define Max 100

typedef struct
{
    int data[Max];
    int top;
}seqstack;

void Menu()
{
    printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n");
    printf("■                  MENU                                            ■\n");
    printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n");
    printf("■                No.1 10 to 2                                      ■\n");
    printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n");
    printf("■                No.2 10 to 8                                      ■\n");
    printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n");
    printf("■                No.3 10 to 16                                     ■\n");
    printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n");
    printf("■                No.4 2 to 10                       ■\n");
    printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n");
    printf("■                No.5 8 to 10                                      ■\n");
    printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n");
    printf("■                No.6 16 to 10                                     ■\n");
    printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n");
    printf("■                No.7 x to y (x,y为2 8 10 16中任意一种进制)        ■\n");
    printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n");
    printf("■                No.8 退出                                         ■\n");
    printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n");
}

//入栈
int Push(seqstack*s,int x)
{
    if (s->top==Max)
    {
        printf("overflow");
        return 0;
    }

    s->data[s->top] = x;
    s->top++;

    return 1;
}

//退栈
int Pop(seqstack*s)
{
    int x;
    if ((s->top)==0)
    {
        printf("Stack is empty!");
        return 0;
    }
    (s->top)--;
    x = s->data[s->top];
    return x;
}

//十进制转为2、8、16进制
seqstack* my10_d(const char str[],int d)
{
    seqstack* SS;
    int i=0,x=0,y;
    SS = (seqstack*)malloc(sizeof(seqstack));
    SS->top = 0;
    while (str[i]!='\0')
    {
        y = str[i] - 48;
        x=x*10+y;
        i++;
    }
    while (x)
    {
        Push(SS, x % d);
        x /= d;
    }
    return SS;
}

//2,8,16进制转为十进制
seqstack* myd_10(const char str[],int d)
{
    seqstack* SS;
    int i, x;
    SS = (seqstack*)malloc(sizeof(seqstack));
    SS->top = 0;
    i = 0;
    while (str[i]!='\0')
    {
        if (str[i]>='A'&&str[i]<='F')
        {
            x = str[i] - 55;
        }
        else if (str[i] >= 'a' && str[i] <= 'f')
        {
            x = str[i] - 87;
        }
        else
        {
            x = str[i] - 48;
        }
        Push(SS, x);
        i++;
    }
    return SS;

}

//输出
void Out(seqstack* s,int hex,int dd)
{
    int x, y=0;
    if (dd==1)
    {
        while ((s->top) > 0)
        {
            x = Pop(s);
            y += x * dd;
            dd *= hex;
        }
        printf("\n结果:%d\n", y);
    }
    else
    {
        printf("\n结果:");
        while ((s->top) > 0)
        {
            y = Pop(s);
            if (y < 10)
            {
                printf("%d", y);
            }
            else
            {
                printf("%c", y + 55);
            }
        }
        printf("\n");
    }
}

int main()
{
    int choice;
    char num[Max];
    int hex1, hex2;
    int x,y=0, dd=1;
    seqstack* SS;

    do
    {
        Menu();
        do
        {
            printf("先选择你要的操作(choice 1-8):");
            scanf("%d", &choice);
            if (choice < 1 || choice>8)
            {
                printf("输入错误!\n");
            }
        } while (choice < 1 || choice > 8);

        switch (choice)
        {
        case 1:
            printf("\n十进制数:");
            scanf("%s", num);
            SS=my10_d(num, 2);
            Out(SS, 2, 0);
            break;
        case 2:
            printf("\n十进制数:");
            scanf("%s", num);
            SS = my10_d(num, 8);
            Out(SS, 8, 0);
            break;
        case 3:
            printf("\n十进制数:");
            scanf("%s", num);
            SS = my10_d(num, 16);
            Out(SS, 16, 0);
            break;
        case 4:
            printf("\n二进制数:");
            scanf("%s", num);
            SS = myd_10(num, 2);
            Out(SS, 2, 1);
            break;
        case 5:
            printf("\n八进制数:");
            scanf("%s", num);
            SS = myd_10(num, 8);
            Out(SS, 8, 1);
            break;
        case 6:
            printf("\n十六进制数:");
            scanf("%s", num);
            SS = myd_10(num, 16);
            Out(SS, 16, 1);
            break;
        case 7:
            //( 2-8 2-16) (8-2 8-8  8-16) () (16-2 16-8)
            //2-2 8-8 10-10 16-16
            //10-2 10-8 10-16
            //2-10 8-10 16-10

            printf("\n输入的数为多少进制(2 8 10 16):");
            scanf("%d",&hex1);
            printf("\n输入的数:");
            scanf("%s",num);
            printf("\n转为多少进制(2 8 10 16):");
            scanf("%d", &hex2);
            if (hex1==hex2)
            {
                printf("%s\n",num);
            }
            else if(hex1==10)
            {
                SS=my10_d(num, hex2);
                Out(SS,hex2,0);
            }
            else 
            {
                SS = myd_10(num, hex1);
                if (hex2==10)
                {
                    Out(SS, hex1,1);
                }
                else
                {
                    while ((SS->top) > 0)
                    {
                        x = Pop(SS);
                        y += x * dd;
                        dd *= hex1;
                    }//x->10
                    sprintf(num,"%d",y);//数字转化为字符串
                    SS=my10_d(num, hex2);
                    Out(SS,hex2,0);
                }

            }
            break;
        case 8:break;
        default:
            break;
        }
        getch();
        system("cls");
    } while (choice!=8);
    printf("感谢使用");
    return 0;
}