C/C++语言实现二、八、十、十六进制的转换

纯C语言实现进制之间的输入转换输出,下附代码只是实现了数据的显示,若要更改使其返回转换后的数值也是比较容易的。个人感觉C++编写会更加容易一些,烦请读者自己更改。其中有部分繁琐冗杂的地方还请大家见谅Orz

核心思想:

1)求模取余法实现十进制对其他进制的转换

2)通过字符数组存储要转换的二/八/十六进制数据,再逐位存储到整型数组当中

3)通过位数与幂的关系完成对十进制的转换

附代码:


1.C语言原版

#include<stdio.h>

void DecBinary();     // 十进制-->二进制
void DecOct();        // 十进制-->八进制
void DecHex();        // 十进制-->十六进制
void BinaryDec();     // 二进制-->十进制
void OctDec();        // 八进制-->十进制
void HexDec();        // 十六进制-->十进制
int input();          // 十进制转换的输入重复代码封装为一个函数
int exp(int n);       // 十进制转换二进制的幂计算
int exp1(int n);      // 十进制转换八进制的幂计算
int exp2(int n);      // 十进制转换十六进制的幂计算
void menu();

int main()
{
	int choice = 0;
	do
	{
		menu();
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
			DecBinary();
			break;
		case 2:
			DecOct();
			break;
		case 3:
			DecHex();
			break;
		case 4:
			BinaryDec();
			break;
		case 5:
			OctDec();
			break;
		case 6:
			HexDec();
			break;
		case 0:
			break;
		default:
			printf("选项无效.\n");
			break;
		}
	} while (choice != 0);
	getchar();
	//std::cin.get();
	return 0;
}

void menu()
{
	printf("-------------------------------------\n");
	printf("|    1) 十进制   -->  二进制        |\n");
	printf("|    2) 十进制   -->  八进制        |\n");
	printf("|    3) 十进制   -->  十六进制      |\n");
	printf("|    4) 二进制   -->  十进制        |\n");
	printf("|    5) 八进制   -->  十进制        |\n");
	printf("|    6) 十六进制 -->  十进制        |\n");
	printf("|    0) 退出                        |\n");
	printf("-------------------------------------\n");
	printf("Please input the choice:\n");
}

int input()
{
	int n;
	printf("请输入需要转换的十进制数: ");
	scanf("%d", &n);
	return n;
}

int exp(int n)
{
	int result = 1;
	for (int i = 0; i < n; i++)
	{
		result *= 2;
	}
	return result;
}

int exp1(int n)
{
	int result = 1;
	for (int i = 0; i < n; i++)
	{
		result *= 8;
	}
	return result;
}

int exp2(int n)
{
	int result = 1;
	for (int i = 0; i < n; i++)
	{
		result *= 16;
	}
	return result;
}

void DecBinary()
{
	int n = input();
	int ary[32];
	int i = 0;
	printf("%d对应的二进制数为:", n);
	while (n != 0)
	{
		ary[i] = (n % 2);
		i++;
		n /= 2;
	}
	for (i-=1; i >= 0; i--)
	{
		printf("%d", ary[i]);
	}
	printf("\n");
}

void DecOct()
{
	int n = input();
	int ary[32];
	int i = 0;
	printf("%d对应的八进制数为:", n);
	while (n > 0)
	{
		ary[i] = (n % 8);
		i++;
		n /= 8;
	}
	for (i -= 1; i >= 0; i--)
	{
		printf("%d", ary[i]);
	}
	printf("\n");
}

void DecHex()
{
	int n = input();
	char ary[32];
	int i = 0;
	printf("%d对应的十六进制数为:0x", n);
	while (n > 0)
	{
		if(n%16<10)
			ary[i] = (n % 16);
		switch (n%16)
		{
		case 10:
			ary[i] = 'A';
			break;
		case 11:
			ary[i] = 'B';
			break;
		case 12:
			ary[i] = 'C';
			break;
		case 13:
			ary[i] = 'D';
			break;
		case 14:
			ary[i] = 'E';
			break;
		case 15:
			ary[i] = 'F';
			break;
		default:
			break;
		}
		i++;
		n /= 16;
	}
	for (i -= 1; i >= 0; i--)
	{
		if (ary[i] < 10)
			printf("%d", ary[i]);
		else
			printf("%c", ary[i]);
	}
	printf("\n");
}

void BinaryDec()
{
	char bina[32];
	int dec[32], result;
	int count = 0, judge = 0;
	scanf("%s", bina);
	getchar();
	for (int i = 0; i < 32; i++)
	{
		if (bina[i] != '\0')
		{
			if (bina[i] > '1' || bina[i] < '0')
			{
				printf("输入的不是二进制数!\n");
				judge = 1;
				break;
			}
		}
		if (bina[i] >= '0' &&bina[i] <= '1')
		{
			dec[i] = bina[i] - '0';
			count++;
			continue;
		}
		break;
	}
	result = 0;
	if (judge == 0)
	{
		for (int i = 0; i <count ; i++)
		{
			if (dec[i] == 1)
			{
				result += exp(count - i - 1);
			}
		}
		printf("%s对应的十进制数为:%d\n", bina, result);
	}
}

void OctDec()
{
	char Oct[32];
	int dec[32], result;
	int count = 0, judge = 0;
	scanf("%s", Oct);
	for (int i = 0; i < 32; i++)
	{
		if (Oct[i] != '\0')
		{
			if (Oct[i] > '7' || Oct[i] < '0')
			{
				printf("输入的不是八进制数!\n");
				judge = 1;
				break;
			}
		}
		if (Oct[i] >= '0' &&Oct[i] <= '7')
		{
			dec[i] = Oct[i] - '0';
			count++;
			continue;
		}
		break;
	}
	result = 0;
	if (judge == 0)
	{
		for (int i = 0; i < count; i++)
	    {

		    if (dec[i] >= 0 && i != count - 1)
			{
				result += dec[i]*exp1(count - i - 1);
			}
			if (i == count - 1)
				result += dec[i];
		}
		printf("%s对应的十进制数为:%d\n", Oct, result);
	}
}

void HexDec()
{
	char Hex[32];
	int dec[32], result;
	int cout = 0, judge = 0;
	scanf("s", Hex);
	for (int i = 0; i < 32; i++)
	{
		if (Hex[i] != '\0')
		{
			if (Hex[i] > 'F' || (Hex[i] > 57 && Hex[i] < 65) || Hex[i] < '0')
			{
				printf("输入的不是十六进制数!\n");
				judge = 1;
				break;
			}
		}
		if (Hex[i] >= '0' &&Hex[i] <= '9')
		{
			dec[i] = Hex[i] - '0';
			count++;
		    continue;
		}
		if (Hex[i] >= 'A' &&Hex[i] <= 'F')
		{
			dec[i] = Hex[i] - 55;
			count++;
			continue;
		}
		break;
	}
	result = 0;
	if (judge == 0)
	{
		for (int i = 0; i < count; i++)
		{
			if (dec[i] >= 0 && i != count - 1)
			{
				result += dec[i]*exp2(count - i - 1);
			}
			if (i == count - 1)
				result += dec[i];
		}
		printf("%s对应的十进制数为:%d\n", Hex, result);
	}
}

2.VS2017中成功运行的版本(作者使用的编译器)

#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_NONSTDC_NO_DEPRECATE
void DecBinary();
void DecOct();
void DecHex();
void BinaryDec();
void OctDec();
void HexDec();
int input();
int exp(int n);
int exp1(int n);
int exp2(int n);
void menu();

int main()
{
	int choice = 0;
	do
	{
		menu();
		scanf_s("%d", &choice);
		switch (choice)
		{
		case 1:
			DecBinary();
			break;
		case 2:
			DecOct();
			break;
		case 3:
			DecHex();
			break;
		case 4:
			BinaryDec();
			break;
		case 5:
			OctDec();
			break;
		case 6:
			HexDec();
			break;
		case 0:
			break;
		default:
			printf("选项无效.\n");
			break;
		}
	} while (choice != 0);
	getchar();
	//std::cin.get();
	return 0;
}

void menu()
{
	printf("-------------------------------------\n");
	printf("|    1) 十进制   -->  二进制        |\n");
	printf("|    2) 十进制   -->  八进制        |\n");
	printf("|    3) 十进制   -->  十六进制      |\n");
	printf("|    4) 二进制   -->  十进制        |\n");
	printf("|    5) 八进制   -->  十进制        |\n");
	printf("|    6) 十六进制 -->  十进制        |\n");
	printf("|    0) 退出                        |\n");
	printf("-------------------------------------\n");
	printf("Please input the choice:\n");
}

int input()
{
	int n;
	printf("请输入需要转换的十进制数: ");
	scanf_s("%d", &n);
	return n;
}

int exp(int n)
{
	int result = 1;
	for (int i = 0; i < n; i++)
	{
		result *= 2;
	}
	return result;
}

int exp1(int n)
{
	int result = 1;
	for (int i = 0; i < n; i++)
	{
		result *= 8;
	}
	return result;
}

int exp2(int n)
{
	int result = 1;
	for (int i = 0; i < n; i++)
	{
		result *= 16;
	}
	return result;
}
void DecBinary()
{
	int n = input();
	int ary[32];
	int i = 0;
	printf("%d对应的二进制数为:", n);
	while (n != 0)
	{
		ary[i] = (n % 2);
		i++;
		n /= 2;
	}
	for (i-=1; i >= 0; i--)
	{
		printf("%d", ary[i]);
	}
	printf("\n");
}

void DecOct()
{
	int n = input();
	int ary[32];
	int i = 0;
	printf("%d对应的八进制数为:", n);
	while (n > 0)
	{
		ary[i] = (n % 8);
		i++;
		n /= 8;
	}
	for (i -= 1; i >= 0; i--)
	{
		printf("%d", ary[i]);
	}
	printf("\n");
}

void DecHex()
{
	int n = input();
	char ary[32];
	int i = 0;
	printf("%d对应的十六进制数为:0x", n);
	while (n > 0)
	{
		if(n%16<10)
			ary[i] = (n % 16);
		switch (n%16)
		{
		case 10:
			ary[i] = 'A';
			break;
		case 11:
			ary[i] = 'B';
			break;
		case 12:
			ary[i] = 'C';
			break;
		case 13:
			ary[i] = 'D';
			break;
		case 14:
			ary[i] = 'E';
			break;
		case 15:
			ary[i] = 'F';
			break;
		default:
			break;
		}
		i++;
		n /= 16;
	}
	for (i -= 1; i >= 0; i--)
	{
		if (ary[i] < 10)
			printf("%d", ary[i]);
		else
			printf("%c", ary[i]);
	}
	printf("\n");
}

void BinaryDec()
{
	char bina[32];
	int dec[32], result;
	int count = 0, judge = 0;
	scanf_s("%s", bina, 32);
	getchar();
	for (int i = 0; i < 32; i++)
	{
		if (bina[i] != '\0')
		{
			if (bina[i] > '1' || bina[i] < '0')
			{
				printf("输入的不是二进制数!\n");
				judge = 1;
				break;
			}
		}
		if (bina[i] >= '0' &&bina[i] <= '1')
		{
			dec[i] = bina[i] - '0';
			count++;
			continue;
		}
		break;
	}
	result = 0;
	if (judge == 0)
	{
		for (int i = 0; i <count ; i++)
		{
			if (dec[i] == 1)
			{
				result += exp(count - i - 1);
			}
		}
		printf("%s对应的十进制数为:%d\n", bina, result);
	}
}

void OctDec()
{
	char Oct[32];
	int dec[32], result;
	int count = 0, judge = 0;
	scanf_s("%s", Oct, 32);
	
	for (int i = 0; i < 32; i++)
	{
		if (Oct[i] != '\0')
		{
			if (Oct[i] > '7' || Oct[i] < '0')
			{
				printf("输入的不是八进制数!\n");
				judge = 1;
				break;
			}
		}
		if (Oct[i] >= '0' &&Oct[i] <= '7')
		{
			dec[i] = Oct[i] - '0';
			count++;
			continue;
		}
		break;
	}
	result = 0;
	if (judge == 0)
	{
		for (int i = 0; i < count; i++)
		{
			if (dec[i] >= 0 && i != count - 1)
			{
				result += dec[i]*exp1(count - i - 1);
			}
			if (i == count - 1)
				result += dec[i];
		}
		printf("%s对应的十进制数为:%d\n", Oct, result);
	}
}

void HexDec()
{
	char Hex[32];
	int dec[32], result;
	int count = 0, judge = 0;
	scanf_s("%s", Hex, 32);
	for (int i = 0; i < 32; i++)
	{
		if (Hex[i] != '\0')
		{
			if (Hex[i] > 'F' || (Hex[i] > 57 && Hex[i] < 65) || Hex[i] < '0')
			{
				printf("输入的不是十六进制数!\n");
				judge = 1;
				break;
			}
		}
		if (Hex[i] >= '0' &&Hex[i] <= '9')
		{
			dec[i] = Hex[i] - '0';
			count++;
			continue;
		}
		if (Hex[i] >= 'A' &&Hex[i] <= 'F')
		{
			dec[i] = Hex[i] - 55;
			count++;
			continue;
		}
		break;
	}
	result = 0;
	if (judge == 0)
	{
		for (int i = 0; i < count; i++)
		{
			if (dec[i] >= 0 && i != count - 1)
			{
				result += dec[i]*exp2(count - i - 1);
			}
			if (i == count - 1)
				result += dec[i];
		}
		printf("%s对应的十进制数为:%d\n", Hex, result);
	}
}

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值