C++ 第一阶段项目二:温度转换工具
目录
一、 项目简介
二、 项目目标
三、 功能需求
四、 项目亮点
1. 输入验证增强
2. 模块化设计
3. 错误处理机制
五、代码实现(核心部分)
1. 主程序流程
2. 温度转换函数
六、运行示例
七、扩展建议
1. 历史记录功能
2. 函数指针优化
3. 面向对象设计(进阶)
八、总结
九、学习建议
一、 项目简介
本项目实现了一个交互式命令行温度转换工具,支持以下核心功能:
- 摄氏度 ↔ 华氏度双向转换
- 新增开尔文温度(K)支持
- 强化输入验证与异常处理
- 模块化设计与函数封装
- 用户交互循环与友好提示
通过该项目,你将掌握 C++ 的基础语法、输入输出流操作、条件分支与循环控制等核心技能。
二、 项目目标
- 实现基本温度单位转换公式:
- 摄氏度 → 华氏度:
F = C * 9/5 + 32
- 华氏度 → 摄氏度:
C = (F - 32) * 5/9
- 摄氏度 → 华氏度:
- 新增开尔文温度转换功能:
- 摄氏度 ↔ 开尔文:
K = C + 273.15
- 摄氏度 ↔ 开尔文:
- 提供健壮的用户交互体验:
- 输入验证(数字类型、物理合理性)
- 菜单选项与循环运行
- 错误提示与恢复机制
三、 功能需求
功能编号 | 功能名称 | 描述 |
---|---|---|
✅ F1 | 摄氏度转华氏度 | 使用标准公式 F = C * 9/5 + 32 |
✅ F2 | 华氏度转摄氏度 | 使用标准公式 C = (F - 32) * 5/9 |
✅ F3 | 摄氏度转开尔文 | K = C + 273.15 |
✅ F4 | 输入验证 | 非数字输入、绝对零度以下值检测 |
✅ F5 | 用户交互 | 菜单选择、继续/退出控制 |
🌟 F6 | 扩展功能(选做) | 历史记录、图形界面集成 |
四、 项目亮点
1. 输入验证增强
double getTemperature(const string& prompt, int option) {double temp;while (true) {cout << prompt;if (cin >> temp) {// 物理合理性检查if (option == 1 && temp < -273.15) {cout << "摄氏度不能低于 -273.15(绝对零度)!\n";continue;}if (option == 2 && temp < -459.67) {cout << "华氏度不能低于 -459.67(绝对零度)!\n";continue;}break;} else {// 非法输入处理cin.clear();cin.ignore(numeric_limits<streamsize>::max(), '\n');cout << "输入错误!请输入一个数字。\n";}}return temp;
}
2. 模块化设计
- 函数封装:将转换逻辑、输入验证、交互提示拆分为独立函数
- 菜单扩展性:通过
switch-case
支持动态功能扩展 - 状态管理:使用
do-while
循环保持程序持续运行
3. 错误处理机制
- 健壮性保障:防止非法输入导致程序崩溃
- 用户友好提示:清晰的错误信息与操作引导
五、代码实现(核心部分)
1. 主程序流程
int main() {char choice = 'y';do {displayMenu(); // 显示功能菜单int option; // 获取用户选择cout << "请选择转换方向 (1/2/3/4): ";cin >> option;if (option == 4) {cout << "感谢使用!再见!" << endl;break;}double temperature;switch (option) {case 1: // Celsius → Fahrenheittemperature = getTemperature("请输入摄氏度 (≥ -273.15): ", option);celsiusToFahrenheit(temperature);break;case 2: // Fahrenheit → Celsiustemperature = getTemperature("请输入华氏度: ", option);fahrenheitToCelsius(temperature);break;case 3: // Celsius → Kelvintemperature = getTemperature("请输入摄氏度 (≥ -273.15): ", option);celsiusToKelvin(temperature);break;default:cout << "无效选项!请重新选择。\n";}choice = confirmContinue(); // 确认是否继续} while (choice == 'y' || choice == 'Y');return 0;
}
2. 温度转换函数
void celsiusToKelvin(double celsius) {double kelvin = celsius + 273.15;cout << celsius << "°C = " << kelvin << " K\n";
}void celsiusToFahrenheit(double celsius) {double fahrenheit = celsius * 9.0 / 5.0 + 32;cout << celsius << "°C = " << fahrenheit << "°F\n";
}void fahrenheitToCelsius(double fahrenheit) {double celsius = (fahrenheit - 32) * 5.0 / 9.0;cout << fahrenheit << "°F = " << celsius << "°C\n";
}
六、运行示例
=== 温度转换工具 ===
1. 摄氏度 → 华氏度
2. 华氏度 → 摄氏度
3. 摄氏度 → 开尔文
4. 退出
请选择转换方向 (1/2/3/4): 1
请输入摄氏度 (≥ -273.15): 100
100°C = 212°F
是否继续转换?(y/n): y
请选择转换方向 (1/2/3/4): 3
请输入摄氏度 (≥ -273.15): 0
0°C = 273.15 K
是否继续转换?(y/n): n
感谢使用!再见!
七、扩展建议
1. 历史记录功能
vector<string> history;
// 每次转换后保存结果
history.push_back(historyLine);
// 退出时显示
cout << "\n历史记录:\n";
for (const auto& line : history) {cout << line << endl;
}
2. 函数指针优化
using Converter = void (*)(double);
map<int, Converter> converters = {{1, celsiusToFahrenheit},{2, fahrenheitToCelsius},{3, celsiusToKelvin}
};
3. 面向对象设计(进阶)
class TemperatureConverter {
public:void run();
private:void convertCelsiusToFahrenheit(double celsius);void convertFahrenheitToCelsius(double fahrenheit);void convertCelsiusToKelvin(double celsius);
};
八、总结
通过本项目,掌握以下 C++ 核心技能:
- C++ 基础语法与输入输出流操作
- 条件分支与循环控制(
switch
/do-while
) - 函数封装与模块化设计
- 输入验证与异常处理
- 用户交互设计原则
九、学习建议
- 初学者:优先完成基础功能,理解程序流程与函数调用。
- 进阶者:尝试实现历史记录、图形界面(如 Qt 或 SFML)集成。
- 挑战者:将代码封装为类库,支持更多温度单位(如 Rankine)。