"""2.5-2.7 课后练习：数字类型、运算符与实训。

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

from math import isclose


print("=" * 64)
print("第一部分：整数与浮点数")

# TODO 1：分别将订单数、库存变化、年销售额设为 26、-3、1_250_000。
order_count = 0
stock_change = 0
annual_sales = 0

print("订单数：", order_count, type(order_count))
print("库存变化：", stock_change, type(stock_change))
print("年销售额：", annual_sales, type(annual_sales))

# TODO 2：计算退货后的订单数；假设退货 3 单，结果应为整数。
remaining_orders = 0
print("退货后的订单数：", remaining_orders, type(remaining_orders))


print("\n第二部分：浮点与转换")

float_result = 0.1 + 0.2
print("0.1 + 0.2 =", float_result)

# TODO 3：使用课堂演示过的 isclose() 判断 float_result 是否接近 0.3。
print("是否接近 0.3：", False)

# TODO 4：把 "39.8" 转为 float，把 "3" 转为 int。
price = 0.0
quantity = 0
print(price, type(price), quantity, type(quantity))

# 先预测：int(3.9) 的结果是什么？
print("int(3.9) =", int(3.9))
print('bool("False") =', bool("False"))


print("\n第三部分：算术、赋值与边界")

total_minutes = 125

# TODO 5：使用 // 和 % 得到小时、分钟。
hours = 0
minutes = 0
print(total_minutes, "分钟 =", hours, "小时", minutes, "分钟")

stock = 100
# TODO 6：先出库 8 件，再入库 20 件，使用复合赋值。
print("当前库存：", stock)

for value in [99, 100, 101]:
    # TODO 7：同时判断 > 100 与 >= 100。
    strict = False
    inclusive = False
    print(value, "> 100：", strict, ">= 100：", inclusive)


print("\n第四部分：逻辑与成员运算")

sales_quantity = 125
return_quantity = 8
unit_price = 199.0
channel = "直播"
allowed_channels = {"直播", "搜索"}

# TODO 8：计算退单率，注意分母。
return_rate = 0.0

# TODO 9：要求销量至少 100、单价低于 200、退单率不超过 10%。
basic_condition = False

# TODO 10：再要求 channel 属于 allowed_channels。
is_priority = False

print(f"退单率：{return_rate * 100:.2f}%")
print("基础条件：", basic_condition)
print("是否重点商品：", is_priority)


print("\n第五部分：时间间隔计算器")


def time_interval(start_hour, start_minute, end_hour, end_minute):
    """返回两个时刻之间的小时数和分钟数，允许跨午夜。"""
    # TODO 11：把起止时刻分别转换为总分钟。
    start_total = 0
    end_total = 0

    # TODO 12：求间隔；允许跨午夜时对一天总分钟数取模。
    interval = 0

    # TODO 13：使用 // 与 % 拆成小时、分钟。
    return 0, 0


print("17:10 -> 18:15：", time_interval(17, 10, 18, 15))
print("23:50 -> 00:20：", time_interval(23, 50, 0, 20))


print("\n第六部分：BMI 公式练习")


def calculate_bmi(weight_kg, height_m):
    """只计算 BMI 数值，不提供医学诊断。"""
    # TODO 14：如果 height_m <= 0，主动抛出 ValueError。

    # TODO 15：返回 weight_kg / height_m ** 2，主动加括号。
    return 0.0


bmi = calculate_bmi(60, 1.70)
print(f"BMI 计算结果：{bmi:.2f}")


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

# TODO 16：在下方注释中解释 /、//、% 的区别。
# 解释：

# TODO 17：解释为什么多步业务公式应主动加括号。
# 解释：

# 自检：
# [ ] 能解释 int(3.9) 与 bool("False") 的结果。
# [ ] 能用 99/100/101 检查边界。
# [ ] 时间间隔普通与跨午夜样例都正确。
# [ ] BMI 公式检查了身高为正，且不输出医疗诊断。
