You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

输入March 19时如何让代码输出“Winter is the season”?逻辑修复

北半球季节判断代码错误修正:March 19误判为Spring的问题

需求与问题

需求说明

  • 代码仅允许使用一个if语句、嵌套for循环和print语句
  • 根据用户输入日期输出北半球对应季节,规则如下:
    • 春季(Spring):3月20日 - 6月20日
    • 夏季(Summer):6月21日 - 9月21日
    • 秋季(Autumn):9月22日 - 12月20日
    • 冬季(Winter):12月21日 - 次年3月19日

问题现象

输入March 19时,现有代码输出Spring is the season,但预期应为Winter is the season

现有错误代码

# Input
month = input("Enter Month: ")
day = int(input("Enter day of the month: "))
# Define the start and end dates for each season
seasons = {
    "Spring": ("March", 20, "June", 20),
    "Summer": ("June", 21, "September", 21),
    "Autumn": ("September", 22, "December", 20),
    "Winter": ("December", 21, "March", 19)
}
# Initialize the current season
current_season = "Invalid"
# Check if the input date is valid and determine the season
for season, (start_month, start_day, end_month, end_day) in seasons.items():
    if (month == start_month and (month != end_month or (day >=   start_day and day <= end_day))) or \
       (month == end_month and day <= end_day):
        current_season = season
        break
# Print the season
print(current_season, "is the season")

错误原因分析

原代码的判断逻辑未正确处理跨年的季节区间:

  • 冬季是唯一跨年度的季节(12月到次年3月),原逻辑无法区分"结束月是次年3月"和"春季的结束月是3月"的差异
  • 当输入March 19时,会先匹配到Spring的month == end_month(March) and day <= end_day(20)条件,触发后直接break,导致Winter的判断逻辑根本不会执行

修正方案代码

# Input
month = input("Enter Month: ")
day = int(input("Enter day of the month: "))

# 月份名称转数字,简化区间比较
month_map = {
    "January": 1, "February": 2, "March": 3,
    "April": 4, "May": 5, "June": 6,
    "July": 7, "August": 8, "September": 9,
    "October": 10, "November": 11, "December": 12
}
month_num = month_map.get(month, 0)
current_season = "Invalid"

# 将跨年的冬季拆分为两个连续区间,避免跨年度判断逻辑
seasons = [
    ("Spring", 3, 20, 6, 20),
    ("Summer", 6, 21, 9, 21),
    ("Autumn", 9, 22, 12, 20),
    ("Winter", 12, 21, 12, 31),
    ("Winter", 1, 1, 3, 19)
]

# 遍历判断季节(仅使用一个if语句)
for season, start_month, start_day, end_month, end_day in seasons:
    if (month_num == start_month and day >= start_day) or \
       (start_month < month_num < end_month) or \
       (month_num == end_month and day <= end_day):
        current_season = season
        break

print(current_season, "is the season")

修正说明

  1. 月份数字化:通过month_map把月份名称转为数字,彻底避免字符串比较的歧义,让区间判断更直观
  2. 拆分跨年区间:把冬季拆分为12月21日-12月31日和1月1日-3月19日两个连续区间,无需处理跨年度的复杂逻辑
  3. 优化判断条件:覆盖三种合法日期情况:
    • 日期在起始月份且大于等于起始日
    • 日期处于起始月和结束月之间的完整月份(比如春季的4、5月)
    • 日期在结束月份且小于等于结束日
  4. 符合约束要求:全程仅使用一个if语句、一个for循环和print语句,满足需求限制

测试输入March 19时,会匹配到第二个Winter区间,输出Winter is the season,符合预期。

内容的提问来源于stack exchange,提问作者user21137806

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:53:11