ZyBooks季节判定实验作业代码报错排查(9月31日、11月7日用例异常)
问题排查结果
根因说明
代码核心错误出在7月、8月的条件判断写法上,这是导致两个测试用例输出异常的直接原因:
- 原代码写的
elif input_month == 'July' or 'August':存在逻辑优先级错误,Python会先算==判断,再算or运算,等价于elif (input_month == 'July') or bool('August'): - 非空字符串在Python中布尔值恒为
True,因此这个分支条件永远成立,会拦截所有6月之后、未被前面分支匹配的输入,导致后续9-12月的判断分支完全无法执行
错误对应表现
- 测试用例11月7日:输入月份November不匹配1-6月的分支条件,直接被上述永远成立的7/8月分支拦截,判断日期7在1-31范围内后直接输出
Summer,根本不会走到11月对应输出Autumn的分支,结果错误。 - 测试用例9月31日:9月的输入同样被7/8月分支拦截,该分支仅校验日期是否在1-31范围内,31符合条件就直接输出
Summer,完全不会走到9月分支里“9月最多30天”的合法性校验,既没有识别出9月31日是非法日期,也没有执行9月的季节判断逻辑,结果错误。
修正方案
将7/8月的错误判断条件替换为正确的多值匹配写法,两种写法均可:
# 写法1 elif input_month == 'July' or input_month == 'August': # 写法2 elif input_month in ('July', 'August'):
修正后完整代码
input_month = input() input_day = int(input()) months = ('January', 'February', 'March', 'April', 'May', 'June','July', 'August', 'September', 'October', 'November', 'December') if not (input_month in months): print ('Invalid') elif input_month == 'January': if not (0 < input_day <= 31): print('Invalid') else: print('Winter') elif input_month == 'February': if not (0 < input_day <= 29): print('Invalid') else: print('Winter') elif input_month == 'March': if (0 < input_day < 20): print('Winter') elif (20 <= input_day <= 31): print('Spring') else: print('Invalid') elif input_month == 'April': if not (0 < input_day <= 30): print('Invalid') else: print('Spring') elif input_month == 'May': if not (0 < input_day <= 31): print('Invalid') else: print('Spring') elif input_month == 'June': if (0 < input_day <= 20): print('Spring') elif (20 < input_day <= 30): print('Summer') else: print('Invalid') # 修正此处条件判断 elif input_month in ('July', 'August'): if not (0 < input_day <= 31): print('Invalid') else: print('Summer') elif input_month == 'September': if not(0 < input_day <= 30): print("Invalid") elif (0 < input_day <= 21): print ("Summer") else: print ("Autumn") elif input_month == 'October': if not (0 < input_day <= 31): print('Invalid') else: print('Autumn') elif input_month == 'November': if not (0 < input_day <= 30): print('Invalid') else: print('Autumn') elif input_month == 'December': if (0 < input_day <= 20): print('Autumn') elif (20 < input_day <= 31): print('Winter') else: print('Invalid')
验证结果
- 输入November、7:正确输出
Autumn - 输入September、31:正确输出
Invalid - 输入April、11:输出
Spring,符合示例要求 - 输入Blue、65:输出
Invalid,符合示例要求
内容的提问来源于stack exchange,提问作者Dylan Craaybeek
相关产品推荐
相关产品推荐

