三辆汽车瞬时速度计算Python程序结果不符,请求排查错误
需求说明
计算三辆汽车瞬时速度变化,具体规则:
- 汽车A初始以42.0 mph向北行驶(规定向北为正方向)
- 看到限速标志后,A减速至20.0 mph
- 汽车B初始以50.0 mph向南行驶(速度值为-50.0)
- 汽车B的加速度为汽车A减速度的三分之二
- 汽车C初始静止,随后向北行驶,速度为汽车B当前速度的两倍(取速度绝对值的两倍)
- 汽车A刹车掉头向南,加速至汽车B与汽车C速度之和的一半
输出要求:
Car A: xxx
Car B: yyy
Car C: zzz
附加规则:
- 必须通过变量/常量更新速度,禁止直接硬计算结果
- 向北为正,向南为负;速度(速率)为非负值,是速度值的绝对值
- 加速时速度绝对值增大,减速时绝对值减小
现有代码
# Initiate variables at default values carA = 42.0 carB = -50.0 carC = 0 speedLimit = 20.0 # Updating all variables for next stage carA = speedLimit # carA decelerated to speed speedLimit carB = round(-50.0 + (22 * 2/3), 1) carC = 50.0 * 2 carA = round((carB + carC) / 2, 1) print("Car A: " + str(carA) + "\nCar B: " + str(carB) + "\nCar C: " + str(carC))
输出对比
- 程序实际输出:
Car A: -20.0
Car B: -22.0
Car C: 44.0 - 预期输出:
Car A: -97.0
Car B: -64.7
Car C: 129.3
错误分析
1. 汽车B的加速度方向逻辑错误
汽车A的减速度为初始速度与减速后速度的差值:42.0 - 20.0 = 22.0。汽车B向南行驶(负方向),且是加速状态(速度绝对值增大),因此B的速度应该在初始值基础上减去加速度(让数值更负)。
现有代码中-50.0 + (22 * 2/3)的计算会让B的速度绝对值变小(实际是减速),完全违背需求,正确计算应为carB = carB - (22 * 2/3),得到约-64.7的结果。
2. 汽车C的速度未依赖更新后的变量
需求明确要求C的速度是汽车B当前速度的两倍,但现有代码直接硬编码了B的初始速度50.0进行计算,违反了“使用变量更新”的规则。正确写法应为carC = abs(carB) * 2,基于更新后的B的速度计算。
3. 汽车A最终速度的逻辑理解错误
需求中A掉头向南行驶,加速至的是B与C的速率(速度绝对值)之和的一半,且方向为南(速度值为负)。现有代码错误计算了B和C的矢量速度之和的一半,正确计算应为carA = - (abs(carB) + carC) / 2,代入正确的B、C值后得到-97.0。
4. 变量更新顺序不符合依赖关系
现有代码未遵循“先更新B,再用B更新C,最后用B、C更新A”的依赖顺序,导致所有后续计算都基于错误的中间值,完全偏离预期结果。
修正后的示例代码
# 初始化变量 carA = 42.0 carB = -50.0 carC = 0.0 speedLimit = 20.0 # 步骤1:A减速至限速值,计算A的减速度 carA_deceleration = carA - speedLimit carA = speedLimit # 步骤2:更新B的速度(向南加速,速率增加) carB_acceleration = carA_deceleration * (2/3) carB -= carB_acceleration carB = round(carB, 1) # 步骤3:更新C的速度(向北,速率为B当前速率的2倍) carC = abs(carB) * 2 carC = round(carC, 1) # 步骤4:A掉头向南,加速至B和C速率之和的一半 carA_final_speed = (abs(carB) + carC) / 2 carA = -carA_final_speed carA = round(carA, 1) # 输出结果 print(f"Car A: {carA}") print(f"Car B: {carB}") print(f"Car C: {carC}")
运行后输出与预期一致:
Car A: -97.0
Car B: -64.7
Car C: 129.3
内容的提问来源于stack exchange,提问作者user21489407

