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

C++多输入提示问题:如何改写代码实现预期交互效果

单位转换C++代码修复及交互优化

问题背景

使用g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0编译器编译的单位转换代码运行输出异常,需修复以达成预期交互效果。

原始代码

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::string;

int main() {

    cout << "Enter a numeric value followed by a unit abbreviation (km,mi): ";
    double initial_value;
    string initial_unit;
    cin >> initial_value >> initial_unit; 

    double conversion_factor = {initial_value *1.609};
    double conversion_factor2 = {initial_value /1.609};
    std::string miles = "mi";
    std::string kilometers = "km";

    if (initial_unit == miles) {
       cout << initial_value << " " << initial_unit << " "<< "is" << " " << conversion_factor << "\n" << "km";
    }
    if (initial_unit == kilometers) {
       cout << initial_value << " " << initial_unit << " "<< "is" << " " << conversion_factor2 << "\n" << "mi";
    }
    else (initial_unit != kilometers, miles);
    {
       cout << "Unknown unit, please try again";
    }

    return 0;
}

当前错误输出

Enter a numeric value followed by a unit abbreviation (km,mi): 10 mi
10 mi is 16.09
kmUnknown unit, please try again

预期输出示例

Enter a numeric value followed by a unit abbreviation (km,mi): 
10 mi
10 mi is 16.09 km  
16.09 km
16.09 km is 10 mi  
20000 leagues
Unknown unit, please try again  
0.5 mi
0.5 mi is 0.8045 km

修复后的代码

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::string;

int main() {
    const string miles = "mi";
    const string kilometers = "km";
    const double km_per_mi = 1.609; // 1英里=1.609公里

    cout << "Enter a numeric value followed by a unit abbreviation (km,mi): \n";
    double initial_value;
    string initial_unit;
    
    // 循环处理多次输入,直到输入结束(如Ctrl+D)
    while (cin >> initial_value >> initial_unit) {
        if (initial_unit == miles) {
            const double km_value = initial_value * km_per_mi;
            cout << initial_value << " " << initial_unit << " is " << km_value << " km\n";
        } else if (initial_unit == kilometers) {
            const double mi_value = initial_value / km_per_mi;
            cout << initial_value << " " << initial_unit << " is " << mi_value << " mi\n";
        } else {
            cout << "Unknown unit, please try again\n";
        }
        // 再次提示输入,匹配预期交互流程
        cout << "Enter a numeric value followed by a unit abbreviation (km,mi): \n";
    }

    return 0;
}

关键修复点

  • 修正分支逻辑:将独立的两个if改为if-else if-else结构,避免匹配有效单位后仍触发未知单位提示。原代码中else仅与第二个if配对,导致输入mi时第二个if不成立,执行else块输出错误提示。
  • 修复输出格式:将单位与转换结果放在同一行,移除多余换行符,避免出现kmUnknown这类拼接错误。
  • 添加循环交互:通过while(cin >> ...)实现多次输入处理,符合预期输出中连续转换的需求。
  • 优化代码结构:将固定的单位字符串和转换因子设为常量,延迟转换计算逻辑,提升代码可读性与效率。

内容的提问来源于stack exchange,提问作者amwalker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:57:51