zl程序教程

您现在的位置是:首页 >  后端

当前栏目

解答私信@被c++折磨头秃的花季美少女 //C++ 编写一个进阶版的进制转换程序,运行功能如下:请选择要输入的数字的进制(2、8、10、16):请输入该数字:请选择要转换成的进制(2、8。。。

C++转换输入程序 一个 功能 运行 10
2023-09-14 09:06:59 时间

编写一个进阶版的额进制转换程序,运行功能如下:

请选择要输入的数字的进制(2、8、10、16):

请输入该数字:

请选择要转换成的进制(2、8、10、16):

转换结果是:

注:
1、因为输入的数字要选择进制,需要判断输入的数字是否合法,比如选择了2进制,然后输入了数字34,则为不合法,需要提示错误并重新输入
2、16进制下用ABCDEF表示10~15
3、可以反复输入数字,输入0后程序结束

 

注意:此代码在win32控制台运行,在不同的IDE环境下,有部分可能需要变更。
IDE工具:Visual Studio 2010

 
代码块:

#include <iostream>
#include <cstring>
#include <string.h>
#include <cstdio>
#include <algorithm>
#include <bitset>
using namespace std;

bool radixJudge(int *num);
bool judge(char *inputNum, int *inRadix);
int transDec(char *inputNum, int *inRadix);
void transferNum(int inputNum, int *outRadix);

int main()
{
	char *inputNum = new char[20];
	int *inRadix = new int;
	int *outRadix = new int;
	cout<<"请选择要输入的数字的进制 (2、8、10、16): ";
	cin>>*inRadix;
	while(!radixJudge(inRadix)){
		cout<<"输入进制数字错误! 请重新输入!\n请选择要输入的数字的进制 (2、8、10、16): ";
		cin>>*inRadix;
	}
	cout<<"请输入该数字:";
	cin>>inputNum;
	while(*inputNum!='0'){
		while(!judge(inputNum, inRadix)){
			cout<<"数字与进制类型不匹配! 请重试!\n请输入该数字:";
			cin>>inputNum;
		}
		cout<<"请选择要转换成的进制 (2、8、10、16): ";
		cin>>*outRadix;
		while(!radixJudge(outRadix)){
			cout<<"输出进制数字错误! 请重新输入!\n请选择要转换成的进制 (2、8、10、16): ";
			cin>>*outRadix;
		}
		transferNum(transDec(inputNum, inRadix), outRadix);
		cout<<"请选择要输入的数字的进制 (2、8、10、16): ";
		cin>>*inRadix;
		while(!radixJudge(inRadix)){
			cout<<"输入进制数字错误! 请重新输入!\n请选择要输入的数字的进制 (2、8、10、16): ";
			cin>>*inRadix;
		}
		cout<<"请输入该数字:";
		cin>>inputNum;
	}
	free(inputNum);
	free(inRadix);
	free(outRadix);
	system("pause");
	return 0;
}

bool radixJudge(int *num){
	return (*num!=2 && *num!=8 && *num!=10 && *num!=16) ? false : true;
}
bool judge(char *inputNum, int *inRadix){
	int i;
	switch(*inRadix){
	case 2:
		for(i=0; i<strlen(inputNum); i++)
			if(inputNum[i]!='0' && inputNum[i]!='1')
				break;
		return i==strlen(inputNum) ? true : false;
	case 8:
		for(i=0; i<strlen(inputNum); i++){
			if(inputNum[i]<'0'||inputNum[i]>'7')
				break;
		}
		return i==strlen(inputNum) ? true : false;
	case 10:
		for(i=0; i<strlen(inputNum); i++)
			if(inputNum[i]<'0'||inputNum[i]>'9')
				break;
		return i==strlen(inputNum) ? true : false;
	case 16:
		for(i=0; i<strlen(inputNum); i++){
			if((inputNum[i]>='0'&&inputNum[i]<='9')||(inputNum[i]>='A'&&inputNum[i]<='F')||(inputNum[i]>='a'&&inputNum[i]<='f'))
				continue;
			else
				break;
		}
		return i==strlen(inputNum) ? true : false;
	default: return false; break;
	}
}
int transDec(char *inputNum, int *inRadix){
	string str=inputNum;
	int ans=0;
	for(int i=0; i<str.size(); i++){
		char t=str[i];
		if(t>='0'&&t<='9')
			ans=ans*(*inRadix)+t-'0';
		else
			ans=ans*(*inRadix)+t-'a'+10;
	}
	return ans;
}
void transferNum(int inputNum, int *outRadix){
	cout<<"转换结果是:";
	switch(*outRadix){
	case 2:
		cout<<bitset<16>(inputNum)<<endl; break;
	case 8:
		cout<<std::oct<<inputNum<<endl; break;
	case 10:
		cout<<std::dec<<inputNum<<endl; break;
	case 16:
		cout<<std::hex<<inputNum<<endl; break;
	default: break;
	}
	cout<<endl;
}

实现效果如下:(只显示部分输入效果,有兴趣可以进行完整测试,确保程序无误。)
在这里插入图片描述