进制转换思路
利用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;
}