# 项目一:单位换算器 适合第2—3章讲解信号槽、组件访问和函数分工,第4章可继续练习下拉框与字符串处理。 ## 运行后试什么 初始输入为 25,源单位为摄氏度,目标单位为华氏度。点击“换算”,应显示 77 °F,并在下方显示公式。也可以在输入框内按 Enter。 切换到长度后,默认将米换成厘米。输入 1,结果应为 100 cm。“交换单位”只交换源单位与目标单位,输入值保持不变。修改输入或单位会清空旧结果,防止把上次的答案当成当前答案。 支持摄氏度、华氏度、开尔文,以及毫米、厘米、米、千米、英寸和英尺。结果最多显示 12 位有效数字。 ## 课堂任务 第一步只保留温度输入、换算按钮和结果框。让学生完成摄氏度到华氏度的换算,并解释输入框返回的是字符串,计算需要数值。 第二步加入返回值检查。分别输入空字符串、abc 和 25.5,观察程序怎样决定是否继续计算。当前工程用完整字符串的格式检查配合 toDouble,支持小数和科学计数法,不接受千位分隔符。 第三步加入源单位和目标单位。先统一到摄氏度,再计算目标温度。让学生画出华氏度到开尔文的两步过程,避免只背诵一个总公式。 第四步加入长度换算。单位比例写在数组中,先解释数组下标与下拉框顺序的对应关系,再讨论增加一个单位时需要修改哪些位置。 ## 一次换算怎样完成 1. convertButton 发出 clicked 信号,调用 convertValue。 2. 主窗口读取 inputEdit 的文本和两个下拉框的索引。 3. Conversion::convert 检查输入,计算结果,返回 Result。 4. 主窗口根据 Result::ok 显示结果或错误原因。 5. 计算成功后允许复制;输入变化后立即禁用复制并清除旧结果。 Conversion::convert 不直接操作输入框或标签,因此可以使用不同界面调用,也可以单独测试。 ## 需要解释的条件 - 温度不能低于绝对零度。摄氏度下限为 −273.15,华氏度下限为 −459.67,开尔文下限为 0。 - 边界比较保留极小的浮点误差余量,防止换算时的舍入把绝对零度判为非法值。 - 本工具中的长度表示非负长度,不表示带方向的坐标位移。 - 输入可以合法,但结果仍可能溢出。输入检查和结果检查分别负责两个阶段。 - 显示的有效数字有限,程序不承诺任意精度计算。 ## 学生练习 1. 增加“码”,已知 1 yd = 0.9144 m。检查它与米、英尺之间的换算。 2. 增加“使用本次结果继续换算”按钮,说明它与“交换单位”的区别。 3. 为结果增加可选择的显示精度,并解释显示精度为什么不等于计算精度。 ## 验收用例 | 操作 | 预期 | |---|---| | 0 °C → °F | 32 | | 212 °F → °C | 100 | | −459.67 °F → K | 0 | | −274 °C → K | 显示低于绝对零度的提示 | | 1 in → cm | 2.54 | | 1 ft → m | 0.3048 | | 输入 12abc、nan 或 1,000 | 拒绝计算 | | 算出结果后修改输入 | 旧结果清空,复制按钮不可用 |