如何让C++单位比较程序输出原始输入值而非转换后值?
解决方案:保留原始输入信息并输出
你的核心需求是保留用户输入的原始数值和单位,同时基于转换后的cm值完成大小比较,所以不能只在vector里存转换后的数值,得把原始值、单位、转换后的值绑定在一起存储。下面是具体修改方案:
1. 定义结构体存储完整信息
首先定义一个结构体,用来保存每个输入的原始数值、单位,以及转换后的cm值——排序时用转换后的值做比较,输出时用原始信息:
struct Measurement { double original_value; std::string unit; double cm_value; // 用于比较的统一单位值 };
2. 修改后的完整代码
把原来的std::vector<double>换成std::vector<Measurement>,读取输入时同时保存原始信息和转换后的cm值,排序时指定按cm_value排序,最后输出原始的数值和单位。另外注意:你原来代码里的英尺(ft)转换错误,1英尺=30.48厘米,已修正该问题。
//units #include <iostream> #include <string> #include <vector> #include <algorithm> #include <cmath> struct Measurement { double original_value; std::string unit; double cm_value; }; int main() { const double m_to_cm = 100.0; const double in_to_cm = 2.54; const double ft_to_cm = 30.48; // 修正原错误的转换值 std::vector<Measurement> measurements; std::cout << "Please enter two doubles with their units (cm, m, in, ft): "; double input = 0; std::string unit = ""; while(std::cin >> input >> unit) { Measurement meas; meas.original_value = input; meas.unit = unit; if (unit == "m") { meas.cm_value = input * m_to_cm; measurements.push_back(meas); } else if (unit == "ft") { meas.cm_value = input * ft_to_cm; measurements.push_back(meas); } else if (unit == "in") { meas.cm_value = input * in_to_cm; measurements.push_back(meas); } else if (unit == "cm") { meas.cm_value = input; measurements.push_back(meas); } else std::cout << "This is not a valid unit/you did not enter a unit!\n"; // 收集到2个有效输入就退出循环 if (measurements.size() == 2) break; } // 按转换后的cm值排序 std::sort(measurements.begin(), measurements.end(), [](const Measurement& a, const Measurement& b) { return a.cm_value < b.cm_value; }); if(measurements.size() >= 2) { if(std::abs(measurements[0].cm_value - measurements[1].cm_value) < 1.0/100) { std::cout << "These numbers are almost equal.\n"; } else { std::cout << "The smaller value is: " << measurements[0].original_value << measurements[0].unit << ".\n" << "The bigger value is: " << measurements[1].original_value << measurements[1].unit << ".\n"; } } else { std::cout << "Please enter two valid measurements.\n"; } return 0; }
3. 关键修改点说明
- 结构体打包多维度信息:用
Measurement结构体把原始值、单位、转换后的值绑定,解决了原始信息丢失的问题。 - 自定义排序规则:通过lambda表达式告诉
std::sort按照cm_value排序,保证比较逻辑和原代码一致。 - 修正单位转换错误:把英尺的转换值从30改为标准的30.48,确保比较结果准确。
- 增加输入数量控制:收集到2个有效输入后自动退出循环,避免无限读取。
- 完善边界判断:增加输入数量检查,防止数组越界问题。
内容的提问来源于stack exchange,提问作者photon
相关产品推荐
相关产品推荐

