进制转换器(较为成熟,数字过大不可运行

啊好久没写了,更一篇完整程序:

/*
项目名称:进制转换器
时间:2022年11月17日 01:20:11
知识点:进制转换  字符数组运用 函数运用等
*/
#include <bits/stdc++.h>
using namespace std;

char *d_b(int input_d);//10进制转2进制
char *d_h(int input_d);//10进制转16进制
int b_d(char input_c[], int input_c_len); //2进制转10进制
int h_d(char input_c[], int input_c_len); //16进制转10进制
char *h_b(char input_c[], int input_c_len); //16进制转2进制
char *b_h(char input_c[], int input_c_len); //2进制转16进制

int main()
{
	//界面绘制

	cout << "************************************************" << endl;
	cout << "****|     二进制、十进制、十六进制转换     |****" << endl;
	cout << "****|       1、十进制转二进制              |****" << endl;
	cout << "****|       2、十进制转十六进制            |****" << endl;
	cout << "****|       3、二进制转十进制              |****" << endl;
	cout << "****|       4、十六进制转十进制            |****" << endl;
	cout << "****|       5、十六进制转二进制            |****" << endl;
	cout << "****|       6、二进制转十六进制            |****" << endl;
	cout << "************************************************" << endl;
	cout << endl;
	cout << "( ̄▽ ̄)ノ再见输入对应的数字1-6,即可选择相应的进制转换功能ヾ( ̄▽ ̄)" << endl;

	int num = 0; //判断程序功能
	int user_input_d = 0; //存放用户输入(10进制数)
	char user_input_c[1000] = {' '}; //存放用户输入(2进制数,16进制数存这个里面)

	//根据选择的功能,进行提示语
	cin >> num;
	switch (num)
		{
			case 1:
				cout << "您要使用的是:十进制转二进制。请输入一个十进制数" << endl;
				break;
			case 2:
				cout << "您要使用的是:十进制转十六进制。请输入一个十进制数" << endl;
				break;
			case 3:
				cout << "您要使用的是:二进制转十进制。请输入一个二进制数" << endl;
				break;
			case 4:
				cout << "您要使用的是:十六进制转十进制。请输入一个十六进制数" << endl;
				break;
			case 5:
				cout << "您要使用的是:十六进制转二进制。请输入一个十六进制数" << endl;
				break;
			case 6:
				cout << "您要使用的是:二进制转十六进制。请输入一个二进制数" << endl;
				break;
			default:
				cout << "输入不正确,请关掉重启" << endl;
		}

	//根据用户输入的数字来决定用什么输入
	if ((num == 1) || (num == 2))
		cin >> user_input_d;
	else
		cin >> user_input_c;

	//根据选择的功能,进行操作
	switch (num)
		{
			case 1:
				cout << d_b(user_input_d) << endl;
				break;//十进制转二进制
			case 2:
				cout << d_h(user_input_d) << endl;
				break;//十进制转十六进制
			case 3:
				cout << b_d(user_input_c, strlen(user_input_c) - 1);//实参为用户输入的字符数组与字符数组长度
				break;//二进制转十进制
			case 4:
				cout << h_d(user_input_c, strlen(user_input_c) - 1);
				break;//十六进制转十进制
			case 5:
				cout << h_b(user_input_c, strlen(user_input_c) - 1) << endl;
				break;//十六进制转二进制
			case 6:
				cout << b_h(user_input_c, strlen(user_input_c) - 1) << endl;
				break;//二进制转十六进制
			default:
				cout << "输入不正确,请关掉重启" << endl;
		}
	return 0;
}

//10进制转2进制自定义函数
char *d_b(int input_d)
{
	cout << "对应的二进制数是:";
	static char result[999];//10进制转2进制的结果用一个字符数组来存
	int xb = 0; //下标遍历器
	for (int a = input_d; a != 0; a /= 2)//短除法对这个十进制数不断的除2,得到的余数存在字符数组中
		{
			result[xb] = (a % 2) + 48; //对2取余只能得到两种结果1和0,用字符来表示'1',相当于是ASCII码值49;
			xb++;
		}
	strrev(result);//由于存的取的余数是倒着的,所以翻转一次。
	return result;//函数返回这个结果
}


//10进制转16进制自定义函数
char *d_h(int input_d)
{
	cout << "对应的十六进制数是:";
	static char result[999];//10进制转2进制的结果用一个字符数组来存
	int xb = 0; //下标遍历器
	for (int a = input_d; a != 0; a /= 16)//短除法对这个十进制数不断的除16,得到的余数存在字符数组中
		{
			//对16取余能得到15种结果0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;
			if (a % 16 >= 10)
				result[xb] = a % 16 + 55; //如果得出的余数>=10则用余数+55,比如得出的余数是11,11+55=66,字符代表'B'
			else
				result[xb] = a % 16 + 48; //如果得出的余数<10则用余数+48,比如得出的余数是0,0+48=48,字符代表'0'
			xb++;
		}
	strrev(result);//由于存的取的余数是倒着的,所以翻转一次。
	return result;//函数返回这个结果
}

//2进制转10进制自定义函数
int b_d(char input_c[], int input_c_len)//input_c_len是用户输入字符数组的长度
{
	cout << "对应的十进制数是:";
	int result = 0;//定义一个整型变量来存2转16的结果
	for (int a = input_c_len; a >= 0; a--)//倒序遍历
		{
			//按权展开字符数组里的元素要转成整形减掉48,比如字符数组中存的是'1' '0' '0',1的ASCII是49 49-48=1
			result = result + ((int)input_c[a] - 48) * pow(2, input_c_len - a);
		}
	return result;//函数返回这个结果
}

//16进制转10进制自定义函数
int h_d(char input_c[], int input_c_len)
{
	cout << "对应的十进制数是:";
	int result = 0;
	for (int a = input_c_len; a >= 0; a--)
		{
			if (input_c[a] >= 'A')//如果数组元素是A~F 就减去55得到对应的10~15
				result = result + ((int)input_c[a] - 55) * pow(16, input_c_len - a);
			else//如果数组元素是A~F 就减去48得到对应的0~9
				result = result + ((int)input_c[a] - 48) * pow(16, input_c_len - a);
		}
	return result;//函数返回这个结果
}

//16进制转2进制自定义函数
char *h_b(char input_c[], int input_c_len)
{
	cout << "对应的二进制数是:";
	int result_dec = h_d(input_c, input_c_len); //调用16转10自定义函数,然后得到一个整数结果
	static char result[1000];
	strcpy(result, d_b(result_dec)); //调用10转2自定义函数,将结果复制到result字符数组中
	return result;//输出result字符数组
}

//2进制转16进制自定义函数
char *b_h(char input_c[], int input_c_len)
{
	cout << "对应的十六进制数是:";
	int result_dec = b_d(input_c, input_c_len); //调用2转10自定义函数,然后得到一个整数结果
	static char result[1000];
	strcpy(result, d_h(result_dec)); //调用10转16自定义函数,将结果复制到result字符数组中
	return result;//输出result字符数组
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值