"""3f 课后练习：流程控制与实训。

要求：
1. 只修改 TODO 标记的位置。
2. 每个结果先预测，再运行并解释。
3. 最终文件应从上到下一次运行，不出现异常。
"""

print("=" * 64)
print("第一部分：条件分支与边界")

def grade(score):
    """根据分数返回优秀、良好、中等或差。"""
    # TODO 1：按 >=85、>=75、>=60、其他的规则补全分支。
    return "请修改"

for score in [59, 60, 74, 75, 84, 85]:
    print(score, "->", grade(score))

print("\n第二部分：条件嵌套")

def days_in_month(year, month):
    """返回指定年月的天数；month 不合法时返回提示文本。"""
    # TODO 2：处理 31 天的月份、30 天的月份。
    # TODO 3：处理 2 月，使用闰年条件；其他月份返回提示文本。
    return 0

print("2024 年 2 月：", days_in_month(2024, 2))
print("2023 年 2 月：", days_in_month(2023, 2))

print("\n第三部分：while 循环")

def sum_to_n(n):
    """返回 1 到 n 的累加和；n 为正整数。"""
    # TODO 4：使用 while 实现累加，注意初值、条件和更新。
    return 0

print("1 到 10 的和：", sum_to_n(10))

print("\n第四部分：for 与循环嵌套")

def draw_board(size):
    """输出 size 行、size 列的棋盘；相邻格交替为 + 和 -。"""
    # TODO 5：使用两层 for 循环输出棋盘。
    # 提示：print("+", end=" ") 可以让多个符号留在同一行。
    return None

draw_board(4)

print("\n第五部分：物流费用")

def shipping_fee(region_code, weight_kg):
    """返回物流费用；地区只允许 01、02、03，重量必须大于 0。"""
    # TODO 6：用 if-elif 确定首重价和续重价；不合法时返回提示文本。
    # TODO 7：实现首重 <=2kg、续重向上按整 kg 计费。
    return 0

print("华东 1.5 kg：", shipping_fee("01", 1.5))
print("华北 3.2 kg：", shipping_fee("03", 3.2))

print("\n第六部分：三次机会登录")

def login_check(attempts):
    """遍历最多 3 次尝试，成功立即返回成功消息。"""
    # TODO 8：使用 for、if 与 return 完成登录检测。
    # 提示：for user, password in attempts 会把每一组用户名、密码分别赋给两个变量。
    return "请修改"

attempts = [("admin", "123"), ("guest", "python"), ("admin", "python")]
print(login_check(attempts))

print("\n第七部分：自检")

# TODO 9：在下方注释中解释 while 循环的初值、条件、更新。
# 解释：

# TODO 10：解释 break 与 continue 的区别，并各写一个适用场景。
# 解释：

# 自检：
# [ ] 测试了 59/60、74/75、84/85 等边界。
# [ ] 知道 range 的右边界不包含在结果中。
# [ ] while 循环中改变了参与条件的变量。
# [ ] 物流题验证了地区编号和重量。
# [ ] 登录题考虑了成功与三次失败两种路径。
