C++写一个程序,能够实现不同进制之间的相互转换(二进制、八进制、十进制、十六进制) 3、能够保存历史记录(如十进制a转换为二进制b后,能够通过界面功能调取出a和b) 4、在一次转换结束后可以直接进行下一次转换,也可以重新输入一个数进行新的转换(如 十进制的a转换为二进制的b后,可以立刻用b转换成其他进制或者重新输入一个数d转 换为其他进制)
时间: 2023-11-22 07:55:43 浏览: 47
以下是一个实现上述功能的 C++ 程序:
```c++
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
#include <fstream>
using namespace std;
// 函数声明
string dec2bin(int num);
string dec2oct(int num);
string dec2hex(int num);
int bin2dec(string num);
int oct2dec(string num);
int hex2dec(string num);
void saveRecord(int num, string from, string to, string result);
void printRecord();
// 历史记录结构体
struct Record {
int num;
string from;
string to;
string result;
};
// 全局变量
vector<Record> records;
int main() {
int num;
string from, to, result;
char choice;
bool isExit = false;
// 加载历史记录
ifstream file("records.txt");
if (file.is_open()) {
while (!file.eof()) {
Record record;
file >> record.num >> record.from >> record.to >> record.result;
if (record.num != 0) {
records.push_back(record);
}
}
file.close();
}
do {
cout << "请选择转换类型(输入数字1-4):" << endl;
cout << "1. 十进制 -> 二进制" << endl;
cout << "2. 十进制 -> 八进制" << endl;
cout << "3. 十进制 -> 十六进制" << endl;
cout << "4. 二/八/十六进制 -> 十进制" << endl;
cin >> choice;
switch (choice) {
case '1':
from = "十进制";
to = "二进制";
cout << "请输入一个十进制数:";
cin >> num;
result = dec2bin(num);
break;
case '2':
from = "十进制";
to = "八进制";
cout << "请输入一个十进制数:";
cin >> num;
result = dec2oct(num);
break;
case '3':
from = "十进制";
to = "十六进制";
cout << "请输入一个十进制数:";
cin >> num;
result = dec2hex(num);
break;
case '4':
cout << "请输入一个二/八/十六进制数:";
cin >> from;
if (from.substr(0, 2) == "0b") {
num = bin2dec(from.substr(2));
from = "二进制";
} else if (from.substr(0, 2) == "0o") {
num = oct2dec(from.substr(2));
from = "八进制";
} else if (from.substr(0, 2) == "0x") {
num = hex2dec(from.substr(2));
from = "十六进制";
} else {
cout << "输入的不是二/八/十六进制数!" << endl;
continue;
}
to = "十进制";
stringstream ss;
ss << num;
result = ss.str();
break;
default:
cout << "输入的数字无效,请重新输入!" << endl;
continue;
}
// 显示结果
cout << from << "数 " << num << " 转换成 " << to << "数为 " << result << endl;
// 保存历史记录
saveRecord(num, from, to, result);
// 判断是否退出
cout << "是否退出程序(Y/N)?" << endl;
cin >> choice;
if (choice == 'Y' || choice == 'y') {
isExit = true;
}
} while (!isExit);
// 显示历史记录
printRecord();
// 保存历史记录
ofstream outFile("records.txt");
for (int i = 0; i < records.size(); i++) {
outFile << records[i].num << " " << records[i].from << " " << records[i].to << " " << records[i].result << endl;
}
outFile.close();
return 0;
}
// 十进制转二进制
string dec2bin(int num) {
stringstream ss;
ss << bitset<32>(num).to_string(); // 使用 bitset 将整数转换成二进制字符串
string binStr = ss.str();
int pos = binStr.find_first_not_of('0'); // 去掉前导零
if (pos == string::npos) {
return "0";
} else {
return binStr.substr(pos);
}
}
// 十进制转八进制
string dec2oct(int num) {
stringstream ss;
ss << oct << num; // 使用 oct 将整数转换成八进制字符串
return ss.str();
}
// 十进制转十六进制
string dec2hex(int num) {
stringstream ss;
ss << uppercase << hex << num; // 使用 hex 将整数转换成十六进制字符串(大写字母)
return ss.str();
}
// 二进制转十进制
int bin2dec(string num) {
return stoi(num, nullptr, 2); // 使用 stoi 将二进制字符串转换成整数
}
// 八进制转十进制
int oct2dec(string num) {
return stoi(num, nullptr, 8); // 使用 stoi 将八进制字符串转换成整数
}
// 十六进制转十进制
int hex2dec(string num) {
return stoi(num, nullptr, 16); // 使用 stoi 将十六进制字符串转换成整数
}
// 保存历史记录
void saveRecord(int num, string from, string to, string result) {
Record record = { num, from, to, result };
records.push_back(record);
}
// 显示历史记录
void printRecord() {
cout << "历史记录:" << endl;
for (int i = 0; i < records.size(); i++) {
cout << records[i].from << "数 " << records[i].num << " 转换成 " << records[i].to << "数为 " << records[i].result << endl;
}
}
```
这个程序可以实现不同进制之间的相互转换,能够保存历史记录,并且可以在一次转换结束后直接进行下一次转换或重新输入一个数进行新的转换。历史记录会保存在名为 `records.txt` 的文件中。