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
相关产品推荐
相关产品推荐

