You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:15:36