
在CS50 Fuel Gauge这类需要处理分数输入的程序中,一个常见的陷阱是未能充分考虑用户可能输入的各种格式。原始代码在处理形如 '1.5/3' 或 '2.5/5' 这样的输入时,会进入无限循环并反复提示用户重新输入。其根本原因在于对输入字符串进行数值类型转换时,默认期望的是整数,而当遇到浮点数(如'1.5')时,int() 函数会抛出 ValueError 异常。
让我们回顾一下原始代码中 convert 函数的关键部分:
def convert(fraction):
try:
numerator, denominator = fraction.split('/')
numerator = int(numerator) # 问题所在:尝试将 '1.5' 转换为整数会失败
denominator = int(denominator)
if numerator <= denominator and denominator != 0:
return round((numerator/denominator)*100)
else:
raise ValueError # 抛出 ValueError
except ValueError:
return -1 # 捕获 ValueError 并返回 -1当 fraction 为 '1.5/3' 时,numerator 将是 '1.5'。int('1.5') 操作会抛出 ValueError。此异常被 except ValueError 块捕获,并导致 convert 函数返回 -1。在 main 函数中,由于 percentage 变量被赋值为 -1,while percentage == -1: 循环条件持续为真,从而导致程序反复提示用户输入,而没有给出明确的错误信息或正确处理。
此外,原始代码中对 numerator <= denominator 的检查虽然在逻辑上正确,但对于某些有效输入(例如 '3/2',表示150%)也会抛出 ValueError,这与实际的燃油表逻辑(百分比不应超过100%)是吻合的,但需要更明确的错误处理。
为了解决上述问题,我们需要对输入处理逻辑进行优化,使其能够:
以下是改进后的代码实现,其中引入了一个新的辅助函数 get_fraction_value 来专门负责获取和验证用户输入:
def main():
# 调用辅助函数获取有效的燃油百分比
percentage = get_fraction_value('Fraction: ')
# 根据百分比输出燃油状态
if percentage >= 99:
print('F') # Full (满)
elif percentage <= 1:
print('E') # Empty (空)
else:
print(f'{percentage}%') # 显示百分比
def get_fraction_value(prompt):
"""
循环提示用户输入分数,直到输入有效且计算结果在0-100%之间。
处理 ValueError 和 ZeroDivisionError。
"""
while True: # 持续循环,直到获取到有效输入
try:
n_str, d_str = input(prompt).split('/') # 尝试分割输入字符串
# 将分子和分母转换为浮点数,以支持小数输入
numerator = float(n_str)
denominator = float(d_str)
# 检查分母是否为零
if denominator == 0:
raise ZeroDivisionError # 明确抛出 ZeroDivisionError
# 计算百分比,并转换为整数
# 先乘以100再除以分母,避免浮点数精度问题,并确保结果在正确范围内
result = round(100 * numerator / denominator)
# 校验计算结果是否在有效范围内 (0% 到 100%)
if not (0 <= result <= 100):
raise ValueError # 如果超出范围,抛出 ValueError
return int(result) # 返回有效的整数百分比
except (ValueError, ZeroDivisionError):
# 捕获 ValueError (例如:非数字输入, 格式错误, 结果超出100%)
# 或 ZeroDivisionError (分母为零)
# pass 语句表示捕获到异常后不执行任何操作,循环将继续,再次提示用户输入。
pass
except Exception as e: # 捕获其他未知异常,打印错误信息(可选,调试用)
print(f"发生未知错误: {e}")
pass
if __name__ == "__main__":
main()通过上述改进,CS50 Fuel Gauge 程序现在能够更智能、更鲁棒地处理各种用户输入,包括小数,从而提供更稳定和友好的用户体验。
以上就是CS50 Fuel Gauge:小数输入处理与鲁棒性提升教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号