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

进制转换思路
利用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;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值