[School experiment] C++ binary, ternary, octal, decimal, and hexadecimal conversion including menus (experimental)

table of Contents

1. Code

#include<iostream>
#include<string>
#include<cmath>
using namespace std;

void MenuShow() {
    
    
	cout << "      请选择原进制类型" << endl;
	cout << "      ####" << "1.二进制" << "####" << endl;
	cout << "      ####" << "2.三进制" << "####" << endl;
	cout << "      ####" << "3.八进制" << "####" << endl;
	cout << "      ####" << "4.10进制" << "####" << endl;
	cout << "      ####" << "5.16进制" << "####" << endl;
	cout << "      ###" << "0.退出系统" << "###" << endl;
}
void MenuShow2() {
    
    
	cout << "     请选择目标进制类型" << endl;
	cout << "      ####" << "1.二进制" << "####" << endl;
	cout << "      ####" << "2.三进制" << "####" << endl;
	cout << "      ####" << "3.八进制" << "####" << endl;
	cout << "      ####" << "4.10进制" << "####" << endl;
	cout << "      ####" << "5.16进制" << "####" << endl;
}

// 将数字转为字符如 8->'8' 10->'A'
char Num_Char(char num) {
    
     
	//当num在0-9范围内
	if (num <= 9 && num >= 0)
	{
    
    
		num += 48;
	}

	//当num在10-15范围内
	else {
    
    
		switch (num)
		{
    
    
		case 10:
			num = 'A'; break;			
		case 11:
			num = 'B'; break;			
		case 12:
			num = 'C'; break;			
		case 13:
			num = 'D'; break;
		case 14:
			num = 'E'; break;
		case 15:
			num = 'F'; break;
			
		}
	}
	return num;
}

// 将字符转为数字如 '8'->8 'A'->10
int Char_Num(char &num) {
    
    

	if (num <= '9' && num >= '0')
	{
    
    
		num -= 48;
	}
	else
	{
    
    
		switch (num) 
		{
    
    
		case 'A':
		case 'a':
			num = 10; break;
		case 'B':
		case 'b':
			num = 11; break;
		case 'C':
		case 'c':
			num = 12; break;
		case 'D':
		case 'd':
			num = 13; break;
		case 'E':
		case 'e':
			num = 14; break;
		case 'F':
		case 'f':
			num = 15; break;
		}
	}
	return num;
}

//将任意进制转换为10进制
int SystemN_10(string num, int system) {
    
    
	//num为任意进制数字 system是原进制
	int length = num.size();
	int Num = 0;

	for (int i = 0; i < length; i++) {
    
    
		Num += Char_Num(num[i]) * pow(system , length - i - 1);
	}
	return Num;
}

/*将十进制转化为任意进制,system10为十进制整数,system为需要转化的进制*/
void System10_N(int system10 , int system) {
    
    
	string result;//保存x进制数
	char temp;
	while (system10 > 0)
	{
    
    
		temp = system10 % system;
		result += Num_Char(temp);

		system10 = system10 / system;
	}

	/*输出转化后的x进制整数*/
	for (int i = result.size() - 1; i >= 0; i--)
		cout << result[i];
	cout << endl;
}

int SystemN_N(int j, int x) {
    
     //二进制 三进制 八进制 十进制 八进制互相转换
	// j为你输入的进制  x为你需要的目标进制
	string s;
	cout << "请输入要转换的数字: " << endl;
	cin >> s;

	int n = SystemN_10(s, j);
	cout << endl << "经转换后的进制数为: " << endl;
	System10_N(n, x);
	system("pause");
	return 0;
}

int main() {
    
    
	int choose1, choose2;
	while (true) {
    
    

		MenuShow();

		cin >> choose1;

		switch (choose1)
		{
    
    
		case 1:
			MenuShow2();
			cin >> choose2;
			switch (choose2)
			{
    
    
			case 1:
				SystemN_N(2, 2);
				break;
			case 2:
				SystemN_N(2, 3);
				break;
			case 3:
				SystemN_N(2, 8);
				break;
			case 4:
				SystemN_N(2, 10);
				break;
			case 5:
				SystemN_N(2, 16);
				break;
			default:
				break;
			}
			break;
		case 2:
			MenuShow2();
			cin >> choose2;
			switch (choose2)
			{
    
    
			case 1:
				SystemN_N(3, 2);
				break;
			case 2:
				SystemN_N(3, 3);
				break;
			case 3:
				SystemN_N(3, 8);
				break;
			case 4:
				SystemN_N(3, 10);
				break;
			case 5:
				SystemN_N(3, 16);
				break;
			default:
				break;
			}
			break;
		case 3:
			MenuShow2();
			cin >> choose2;
			switch (choose2)
			{
    
    
			case 1:
				SystemN_N(8, 2);
				break;
			case 2:
				SystemN_N(8, 3);
				break;
			case 3:
				SystemN_N(8, 8);
				break;
			case 4:
				SystemN_N(8, 10);
				break;
			case 5:
				SystemN_N(8, 16);
				break;
			default:
				break;
			}
			break;
		case 4:
			MenuShow2();
			cin >> choose2;
			switch (choose2)
			{
    
    
			case 1:
				SystemN_N(10, 2);
				break;
			case 2:
				SystemN_N(10, 3);
				break;
			case 3:
				SystemN_N(10, 8);
				break;
			case 4:
				SystemN_N(10, 10);
				break;
			case 5:
				SystemN_N(10, 16);
				break;
			default:
				break;
			}
			break;
		case 5:
			MenuShow2();
			cin >> choose2;
			switch (choose2)
			{
    
    
			case 1:
				SystemN_N(16, 2);
				break;
			case 2:
				SystemN_N(16, 3);
				break;
			case 3:
				SystemN_N(16, 8);
				break;
			case 4:
				SystemN_N(16, 10);
				break;
			case 5:
				SystemN_N(16, 16);
				break;
			default:
				break;
			}
			break;
		case 0:
			cout << "欢迎下次使用..." << endl;
			system("pause");
			return 0;
		default:
			break;
		}
		system("cls");
	}
	system("pause");
	return 0;
}

2. Summary of ideas

①There will be numbers and letters appear together in the base conversion, so I think the better way is to convert them into ASCII codes, it will be much more convenient to use ASCII to calculate.
②Pay attention to the numbers 1, 2, 3, etc. when using ASCII codes All have corresponding ASCII values
③In fact, the conversion between the bases can be classified as: the original base is converted to decimal, and the decimal is converted to the target base

Additional ASCII table

#### ASCII table

Guess you like

Origin blog.csdn.net/maikotom/article/details/108850654