# GESP等级：四级 | GESP Python 四级考点
"""
演示3：保护 input() + int() 代码
课程时间：30:00-40:00
焦点：用 try-except 防止用户输入非法数据导致崩溃
"""

print("=" * 60)
print("场景：用户输入数字，程序转成整数进行计算")
print("=" * 60)

# ----------------------------------------------------------------
# 不好的做法：没有异常处理
# ----------------------------------------------------------------


def risky_input():
    """没有保护的输入——输入错误就崩溃"""
    age = int(input("(危险) 请输入你的年龄: "))
    print(f"你明年将 {age + 1} 岁")


# ===== 取消注释运行，输入"十八"试试 =====
# risky_input()  # 崩溃！

# ----------------------------------------------------------------
# 好的做法：用 try-except 保护
# ----------------------------------------------------------------


def safe_input_basic():
    """基础保护——捕获所有异常"""
    try:
        age = int(input("(基础保护) 请输入你的年龄: "))
        print(f"你明年将 {age + 1} 岁")
    except ValueError:
        print("× 错误：请输入有效的数字（如 18）")


# ----------------------------------------------------------------
# 更好的做法：循环直到输入正确
# ----------------------------------------------------------------


def safe_input_loop():
    """循环直到用户输入正确为止——工业级做法"""
    while True:
        try:
            age = int(input("(循环保护) 请输入你的年龄: "))
            break  # 转换成功，退出循环
        except ValueError:
            print("× 输入无效，请重新输入整数数字")

    print(f"你明年将 {age + 1} 岁")
    print("✓ 最终得到了有效的年龄输入\n")


safe_input_loop()

print("=" * 60)
print("高级应用：完整的数字输入验证")
print("=" * 60)


def get_valid_number(prompt: str, allow_zero: bool = False) -> int:
    """
    获取用户输入的有效整数

    参数:
        prompt: 提示信息
        allow_zero: 是否允许 0

    返回:
        用户输入的有效整数
    """
    while True:
        try:
            num_str = input(prompt)
            num = int(num_str)

            if not allow_zero and num == 0:
                print("× 此处不接受 0，请重新输入")
                continue

            return num

        except ValueError:
            print("× 输入无效，请输入整数（如 -5, 0, 42）")


# 使用示例
print("请依次输入两个数字，程序将计算它们的商:")
a = get_valid_number("  被除数: ")
b = get_valid_number("  除数: ", allow_zero=False)

try:
    quotient = a / b
    print(f"\n结果: {a} ÷ {b} = {quotient}")
except ZeroDivisionError:
    print(f"\n结果: {a} ÷ {b} = 除数不能为 0！")
