第19课:单位转换器——让编程解决实际问题

🎯 本课目标

  • 学习常见单位之间的转换关系
  • 掌握长度单位的转换方法
  • 学会重量单位的转换计算
  • 理解温度单位的转换公式
  • 制作多功能单位转换器

📏 趣味引入:成为"单位转换小专家"

想象一下:生活中处处需要单位转换:

  • 📏 身高:妈妈说你120厘米,但美国表弟问"多少英尺?"
  • ⚖️ 体重:医生说45千克,但买的进口食品标着"磅"
  • 🌡️ 温度:天气预报说25°C,但爸爸说"多少华氏度?"
  • 📏 距离:去旅行,地图显示5千米,但出租车说"多少英里?"

今天,让我们一起成为单位转换小专家,用Python解决这些实际问题!


🔧 第一部分:基础单位转换

1.1 简单转换函数

# 基础单位转换函数
print("🔧 基础单位转换函数")
print("=" * 40)

def meter_to_centimeter(meters):
    """米转换为厘米"""
    return meters * 100

def centimeter_to_meter(centimeters):
    """厘米转换为米"""
    return centimeters / 100

def kilogram_to_gram(kilograms):
    """千克转换为克"""
    return kilograms * 1000

def gram_to_kilogram(grams):
    """克转换为千克"""
    return grams / 1000

# 测试转换函数
print("\n📊 转换测试:")
print(f"1米 = {meter_to_centimeter(1)}厘米")
print(f"100厘米 = {centimeter_to_meter(100)}米")
print(f"1千克 = {kilogram_to_gram(1)}克")
print(f"1000克 = {gram_to_kilogram(1000)}千克")

# 实际应用示例
print("\n🎯 实际应用:")
height_cm = 152
print(f"小明的身高:{height_cm}厘米 = {centimeter_to_meter(height_cm)}米")

weight_kg = 45
print(f"小红的体重:{weight_kg}千克 = {kilogram_to_gram(weight_kg)}克")

# 让用户输入转换
user_height = float(input("\n请输入你的身高(厘米):"))
print(f"你的身高是:{user_height}厘米 = {centimeter_to_meter(user_height):.2f}米")

1.2 更多基础转换

# 更多基础转换函数
print("\n📊 更多基础单位转换")
print("=" * 40)

def kilometer_to_meter(kilometers):
    """千米转换为米"""
    return kilometers * 1000

def meter_to_kilometer(meters):
    """米转换为千米"""
    return meters / 1000

def hour_to_minute(hours):
    """小时转换为分钟"""
    return hours * 60

def minute_to_hour(minutes):
    """分钟转换为小时"""
    return minutes / 60

def minute_to_second(minutes):
    """分钟转换为秒"""
    return minutes * 60

def second_to_minute(seconds):
    """秒转换为分钟"""
    return seconds / 60

# 实际应用
print("\n🎯 日常生活中的转换:")

# 上学距离
school_distance_km = 1.5
print(f"上学距离:{school_distance_km}千米")
print(f"  = {kilometer_to_meter(school_distance_km)}米")
print(f"  = {kilometer_to_meter(school_distance_km) * 100}厘米")

# 上课时间
class_hours = 0.75  # 45分钟
print(f"\n一节课时间:{class_hours}小时")
print(f"  = {hour_to_minute(class_hours)}分钟")
print(f"  = {minute_to_second(hour_to_minute(class_hours))}秒")

# 运动时间
sport_minutes = 30
print(f"\n运动时间:{sport_minutes}分钟")
print(f"  = {minute_to_hour(sport_minutes):.2f}小时")
print(f"  = {minute_to_second(sport_minutes)}秒")

# 交互式转换
print("\n🔢 试试你自己的转换:")
while True:
    print("\n选择转换类型:")
    print("1. 千米 ↔ 米")
    print("2. 小时 ↔ 分钟")
    print("3. 退出")
    
    choice = input("请选择 (1-3): ")
    
    if choice == "3":
        print("👋 再见!")
        break
    
    try:
        value = float(input("请输入数值: "))
        
        if choice == "1":
            result_km_to_m = kilometer_to_meter(value)
            result_m_to_km = meter_to_kilometer(value)
            print(f"{value}千米 = {result_km_to_m}米")
            print(f"{value}米 = {result_m_to_km:.3f}千米")
            
        elif choice == "2":
            result_h_to_m = hour_to_minute(value)
            result_m_to_h = minute_to_hour(value)
            print(f"{value}小时 = {result_h_to_m}分钟")
            print(f"{value}分钟 = {result_m_to_h:.2f}小时")
            
    except ValueError:
        print("❌ 请输入数字!")

📏 第二部分:长度单位转换

2.1 国际单位制转换

# 国际长度单位转换
print("📏 国际长度单位转换")
print("=" * 50)

def convert_length(value, from_unit, to_unit):
    """
    长度单位转换
    
    参数:
        value: 数值
        from_unit: 原单位 ('mm', 'cm', 'm', 'km')
        to_unit: 目标单位 ('mm', 'cm', 'm', 'km')
    
    返回:
        转换后的数值
    """
    # 先转换为基本单位(米)
    if from_unit == "mm":  # 毫米
        base_value = value / 1000
    elif from_unit == "cm":  # 厘米
        base_value = value / 100
    elif from_unit == "m":  # 米
        base_value = value
    elif from_unit == "km":  # 千米
        base_value = value * 1000
    else:
        return "❌ 不支持的单位"
    
    # 从基本单位转换为目标单位
    if to_unit == "mm":
        return base_value * 1000
    elif to_unit == "cm":
        return base_value * 100
    elif to_unit == "m":
        return base_value
    elif to_unit == "km":
        return base_value / 1000
    else:
        return "❌ 不支持的单位"

# 转换示例
print("\n📊 长度单位换算表:")
print("-" * 40)
print("1 千米 (km) = 1000 米 (m)")
print("1 米 (m)   = 100 厘米 (cm)")
print("1 厘米 (cm) = 10 毫米 (mm)")

print("\n🎯 实际转换示例:")

# 身高转换
height_cm = 155
height_m = convert_length(height_cm, "cm", "m")
height_mm = convert_length(height_cm, "cm", "mm")
print(f"\n👤 身高转换:")
print(f"{height_cm}厘米 = {height_m}米")
print(f"{height_cm}厘米 = {height_mm}毫米")

# 距离转换
distance_km = 3.5
distance_m = convert_length(distance_km, "km", "m")
distance_cm = convert_length(distance_km, "km", "cm")
print(f"\n📍 距离转换:")
print(f"{distance_km}千米 = {distance_m}米")
print(f"{distance_km}千米 = {distance_cm}厘米")

# 文具长度
pencil_length_mm = 180
pencil_length_cm = convert_length(pencil_length_mm, "mm", "cm")
pencil_length_m = convert_length(pencil_length_mm, "mm", "m")
print(f"\n✏️ 铅笔长度:")
print(f"{pencil_length_mm}毫米 = {pencil_length_cm}厘米")
print(f"{pencil_length_mm}毫米 = {pencil_length_m}米")

2.2 英制单位转换

# 英制长度单位转换
print("\n📏 英制长度单位转换")
print("=" * 50)

def convert_imperial_length(value, from_unit, to_unit):
    """
    英制长度单位转换
    
    支持单位:英寸(in)、英尺(ft)、码(yd)、英里(mi)
    
    转换关系:
        1 英尺 = 12 英寸
        1 码 = 3 英尺
        1 英里 = 1760 码
    """
    # 先转换为英寸
    if from_unit == "in":  # 英寸
        base_value = value
    elif from_unit == "ft":  # 英尺
        base_value = value * 12
    elif from_unit == "yd":  # 码
        base_value = value * 36
    elif from_unit == "mi":  # 英里
        base_value = value * 63360
    else:
        return "❌ 不支持的单位"
    
    # 转换为目标单位
    if to_unit == "in":
        return base_value
    elif to_unit == "ft":
        return base_value / 12
    elif to_unit == "yd":
        return base_value / 36
    elif to_unit == "mi":
        return base_value / 63360
    else:
        return "❌ 不支持的单位"

def metric_to_imperial(value, from_unit, to_unit):
    """
    公制转英制
    
    from_unit: 'mm', 'cm', 'm', 'km'
    to_unit: 'in', 'ft', 'yd', 'mi'
    """
    # 公制转英制转换系数
    # 1 英寸 = 2.54 厘米
    # 1 英尺 = 30.48 厘米
    # 1 码 = 0.9144 米
    # 1 英里 = 1.609344 千米
    
    # 先转换为厘米
    if from_unit == "mm":
        cm_value = value / 10
    elif from_unit == "cm":
        cm_value = value
    elif from_unit == "m":
        cm_value = value * 100
    elif from_unit == "km":
        cm_value = value * 100000
    else:
        return "❌ 不支持的单位"
    
    # 转换为英制
    if to_unit == "in":  # 英寸
        return cm_value / 2.54
    elif to_unit == "ft":  # 英尺
        return cm_value / 30.48
    elif to_unit == "yd":  # 码
        return (cm_value / 100) / 0.9144
    elif to_unit == "mi":  # 英里
        return (cm_value / 100000) / 1.609344
    else:
        return "❌ 不支持的单位"

def imperial_to_metric(value, from_unit, to_unit):
    """
    英制转公制
    
    from_unit: 'in', 'ft', 'yd', 'mi'
    to_unit: 'mm', 'cm', 'm', 'km'
    """
    # 先转换为英寸
    if from_unit == "in":
        inches = value
    elif from_unit == "ft":
        inches = value * 12
    elif from_unit == "yd":
        inches = value * 36
    elif from_unit == "mi":
        inches = value * 63360
    else:
        return "❌ 不支持的单位"
    
    # 转换为厘米
    cm_value = inches * 2.54
    
    # 转换为目标公制单位
    if to_unit == "mm":
        return cm_value * 10
    elif to_unit == "cm":
        return cm_value
    elif to_unit == "m":
        return cm_value / 100
    elif to_unit == "km":
        return cm_value / 100000
    else:
        return "❌ 不支持的单位"

# 转换示例
print("\n📊 英制单位换算表:")
print("-" * 40)
print("1 英尺 (ft) = 12 英寸 (in)")
print("1 码 (yd)   = 3 英尺 (ft)")
print("1 英里 (mi) = 1760 码 (yd)")

print("\n📊 公制-英制换算:")
print("-" * 40)
print("1 英寸 = 2.54 厘米")
print("1 英尺 = 30.48 厘米")
print("1 码   = 0.9144 米")
print("1 英里 = 1.609 千米")

print("\n🎯 实际转换示例:")

# 身高转换
height_cm = 155
height_in = metric_to_imperial(height_cm, "cm", "in")
height_ft = metric_to_imperial(height_cm, "cm", "ft")
print(f"\n👤 身高转换(公制→英制):")
print(f"{height_cm}厘米 = {height_in:.1f}英寸")
print(f"{height_cm}厘米 = {height_ft:.2f}英尺")

# 反向转换
height_in_input = 61
height_cm_back = imperial_to_metric(height_in_input, "in", "cm")
print(f"\n👤 身高转换(英制→公制):")
print(f"{height_in_input}英寸 = {height_cm_back:.1f}厘米")

# 距离转换
distance_km = 5
distance_mi = metric_to_imperial(distance_km, "km", "mi")
print(f"\n📍 跑步距离:")
print(f"{distance_km}千米 = {distance_mi:.2f}英里")

# 篮球场尺寸
court_length_ft = 94
court_length_m = imperial_to_metric(court_length_ft, "ft", "m")
print(f"\n🏀 篮球场长度:")
print(f"{court_length_ft}英尺 = {court_length_m:.2f}米")

⚖️ 第三部分:重量单位转换

3.1 公制重量转换

# 公制重量单位转换
print("⚖️ 公制重量单位转换")
print("=" * 50)

def convert_weight(value, from_unit, to_unit):
    """
    公制重量单位转换
    
    支持单位:毫克(mg)、克(g)、千克(kg)、吨(t)
    
    转换关系:
        1 克 = 1000 毫克
        1 千克 = 1000 克
        1 吨 = 1000 千克
    """
    # 先转换为克
    if from_unit == "mg":  # 毫克
        base_value = value / 1000
    elif from_unit == "g":  # 克
        base_value = value
    elif from_unit == "kg":  # 千克
        base_value = value * 1000
    elif from_unit == "t":  # 吨
        base_value = value * 1000000
    else:
        return "❌ 不支持的单位"
    
    # 转换为目标单位
    if to_unit == "mg":
        return base_value * 1000
    elif to_unit == "g":
        return base_value
    elif to_unit == "kg":
        return base_value / 1000
    elif to_unit == "t":
        return base_value / 1000000
    else:
        return "❌ 不支持的单位"

# 转换示例
print("\n📊 重量单位换算表:")
print("-" * 40)
print("1 吨 (t)  = 1000 千克 (kg)")
print("1 千克 (kg) = 1000 克 (g)")
print("1 克 (g)   = 1000 毫克 (mg)")

print("\n🎯 实际转换示例:")

# 体重转换
weight_kg = 45
weight_g = convert_weight(weight_kg, "kg", "g")
print(f"\n👤 体重转换:")
print(f"{weight_kg}千克 = {weight_g}克")

# 食物重量
apple_weight_g = 150
apple_weight_kg = convert_weight(apple_weight_g, "g", "kg")
print(f"\n🍎 苹果重量:")
print(f"{apple_weight_g}克 = {apple_weight_kg:.3f}千克")

# 药品剂量
medicine_mg = 500
medicine_g = convert_weight(medicine_mg, "mg", "g")
print(f"\n💊 药品剂量:")
print(f"{medicine_mg}毫克 = {medicine_g}克")

# 货车载重
truck_weight_t = 5
truck_weight_kg = convert_weight(truck_weight_t, "t", "kg")
print(f"\n🚚 货车载重:")
print(f"{truck_weight_t}吨 = {truck_weight_kg}千克")

3.2 市制和英制重量转换

# 市制和英制重量转换
print("\n⚖️ 市制和英制重量转换")
print("=" * 50)

def convert_chinese_weight(value, from_unit, to_unit):
    """
    市制重量单位转换(中国)
    
    支持单位:两、斤、公斤(kg)
    
    转换关系:
        1 公斤 = 2 斤
        1 斤 = 10 两
    """
    # 先转换为两
    if from_unit == "两":
        base_value = value
    elif from_unit == "斤":
        base_value = value * 10
    elif from_unit == "kg":  # 公斤
        base_value = value * 20
    else:
        return "❌ 不支持的单位"
    
    # 转换为目标单位
    if to_unit == "两":
        return base_value
    elif to_unit == "斤":
        return base_value / 10
    elif to_unit == "kg":
        return base_value / 20
    else:
        return "❌ 不支持的单位"

def convert_imperial_weight(value, from_unit, to_unit):
    """
    英制重量单位转换
    
    支持单位:盎司(oz)、磅(lb)
    
    转换关系:
        1 磅 = 16 盎司
    """
    # 先转换为盎司
    if from_unit == "oz":  # 盎司
        base_value = value
    elif from_unit == "lb":  # 磅
        base_value = value * 16
    else:
        return "❌ 不支持的单位"
    
    # 转换为目标单位
    if to_unit == "oz":
        return base_value
    elif to_unit == "lb":
        return base_value / 16
    else:
        return "❌ 不支持的单位"

def kg_to_pound(kg):
    """千克转磅(1千克 = 2.20462磅)"""
    return kg * 2.20462

def pound_to_kg(lb):
    """磅转千克"""
    return lb / 2.20462

def kg_to_jin(kg):
    """千克转斤(1千克 = 2斤)"""
    return kg * 2

def jin_to_kg(jin):
    """斤转千克"""
    return jin / 2

# 转换示例
print("\n📊 市制单位换算:")
print("-" * 40)
print("1 公斤 = 2 斤")
print("1 斤 = 10 两")

print("\n📊 英制单位换算:")
print("-" * 40)
print("1 磅 = 16 盎司")
print("1 千克 = 2.20462 磅")

print("\n🎯 实际转换示例:")

# 体重转换(公制→市制)
weight_kg = 50
weight_jin = kg_to_jin(weight_kg)
print(f"\n👤 体重转换(公斤→斤):")
print(f"{weight_kg}公斤 = {weight_jin}斤")

# 买菜重量
vegetable_jin = 3
vegetable_kg = jin_to_kg(vegetable_jin)
print(f"\n🥬 买菜重量:")
print(f"{vegetable_jin}斤 = {vegetable_kg:.1f}公斤")

# 体重转换(公制→英制)
weight_lb = kg_to_pound(weight_kg)
print(f"\n👤 体重转换(公斤→磅):")
print(f"{weight_kg}公斤 = {weight_lb:.1f}磅")

# 反向转换
weight_lb_input = 110
weight_kg_back = pound_to_kg(weight_lb_input)
print(f"\n👤 体重转换(磅→公斤):")
print(f"{weight_lb_input}磅 = {weight_kg_back:.1f}公斤")

# 食材转换
flour_oz = 16
flour_lb = convert_imperial_weight(flour_oz, "oz", "lb")
flour_kg = pound_to_kg(flour_lb)
print(f"\n🌾 面粉重量:")
print(f"{flour_oz}盎司 = {flour_lb}磅 = {flour_kg:.3f}千克")

🌡️ 第四部分:温度单位转换

4.1 温度转换公式

# 温度单位转换
print("🌡️ 温度单位转换")
print("=" * 50)

def celsius_to_fahrenheit(celsius):
    """
    摄氏度转华氏度
    
    公式:F = C × 9/5 + 32
    """
    return celsius * 9/5 + 32

def fahrenheit_to_celsius(fahrenheit):
    """
    华氏度转摄氏度
    
    公式:C = (F - 32) × 5/9
    """
    return (fahrenheit - 32) * 5/9

def celsius_to_kelvin(celsius):
    """
    摄氏度转开尔文
    
    公式:K = C + 273.15
    """
    return celsius + 273.15

def kelvin_to_celsius(kelvin):
    """
    开尔文转摄氏度
    
    公式:C = K - 273.15
    """
    return kelvin - 273.15

# 重要温度点
print("📊 重要温度点:")
print("-" * 40)

# 水的冰点和沸点
water_freezing_c = 0
water_boiling_c = 100

water_freezing_f = celsius_to_fahrenheit(water_freezing_c)
water_boiling_f = celsius_to_fahrenheit(water_boiling_c)

print(f"水的冰点:{water_freezing_c}°C = {water_freezing_f}°F")
print(f"水的沸点:{water_boiling_c}°C = {water_boiling_f}°F")

# 人体温度
body_temp_c = 37
body_temp_f = celsius_to_fahrenheit(body_temp_c)
print(f"正常体温:{body_temp_c}°C = {body_temp_f:.1f}°F")

# 舒适温度
comfort_temp_c = 25
comfort_temp_f = celsius_to_fahrenheit(comfort_temp_c)
print(f"舒适室温:{comfort_temp_c}°C = {comfort_temp_f}°F")

# 寒冷温度
cold_temp_c = -10
cold_temp_f = celsius_to_fahrenheit(cold_temp_c)
print(f"寒冷温度:{cold_temp_c}°C = {cold_temp_f}°F")

# 开尔文温度示例
print(f"\n🌡️ 开尔文温度:")
room_temp_c = 20
room_temp_k = celsius_to_kelvin(room_temp_c)
print(f"室温:{room_temp_c}°C = {room_temp_k:.2f}K")

absolute_zero_c = -273.15
absolute_zero_k = celsius_to_kelvin(absolute_zero_c)
print(f"绝对零度:{absolute_zero_c}°C = {absolute_zero_k}K")

# 温度感受描述
print("\n🎯 温度感受对照:")
print("-" * 40)

temperatures_c = [-20, -10, 0, 10, 20, 30, 40]
descriptions = ["极寒", "严寒", "寒冷", "凉爽", "舒适", "炎热", "酷热"]

for temp_c, desc in zip(temperatures_c, descriptions):
    temp_f = celsius_to_fahrenheit(temp_c)
    print(f"{temp_c:>4}°C ({temp_f:>5.1f}°F) - {desc}")

4.2 交互式温度转换

# 交互式温度转换器
print("\n🌡️ 交互式温度转换器")
print("=" * 50)

def describe_temperature(celsius):
    """描述温度感受"""
    if celsius < -20:
        return "❄️ 极寒!注意防冻!"
    elif celsius < -10:
        return "🥶 严寒!穿厚羽绒服!"
    elif celsius < 0:
        return "🧥 寒冷!需要外套!"
    elif celsius < 10:
        return "👔 凉爽!穿长袖!"
    elif celsius < 20:
        return "😊 舒适!最宜人的温度!"
    elif celsius < 30:
        return "😅 温暖!穿短袖!"
    elif celsius < 35:
        return "🥵 炎热!注意防暑!"
    else:
        return "🔥 酷热!减少外出!"

print("\n请选择转换类型:")
print("1. 摄氏度 → 华氏度")
print("2. 华氏度 → 摄氏度")
print("3. 摄氏度 ↔ 华氏度 对照表")
print("4. 退出")

while True:
    choice = input("\n请选择 (1-4): ")
    
    if choice == "4":
        print("👋 再见!")
        break
    
    elif choice == "1":
        # 摄氏度转华氏度
        try:
            celsius = float(input("请输入摄氏度温度: "))
            fahrenheit = celsius_to_fahrenheit(celsius)
            description = describe_temperature(celsius)
            
            print(f"\n🌡️ 转换结果:")
            print(f"  {celsius}°C = {fahrenheit:.1f}°F")
            print(f"  {description}")
            
            # 特别温度点对比
            if celsius <= 0:
                print(f"  💧 水的状态:结冰")
            elif celsius >= 100:
                print(f"  💧 水的状态:沸腾")
            else:
                print(f"  💧 水的状态:液态")
                
        except ValueError:
            print("❌ 请输入数字!")
    
    elif choice == "2":
        # 华氏度转摄氏度
        try:
            fahrenheit = float(input("请输入华氏度温度: "))
            celsius = fahrenheit_to_celsius(fahrenheit)
            description = describe_temperature(celsius)
            
            print(f"\n🌡️ 转换结果:")
            print(f"  {fahrenheit}°F = {celsius:.1f}°C")
            print(f"  {description}")
            
        except ValueError:
            print("❌ 请输入数字!")
    
    elif choice == "3":
        # 温度对照表
        print(f"\n🌡️ 温度对照表")
        print(f"{'='*30}")
        print(f"{'摄氏度':>8} {'华氏度':>8} {'感受':>8}")
        print(f"{'-'*30}")
        
        for temp_c in range(-20, 41, 5):
            temp_f = celsius_to_fahrenheit(temp_c)
            desc = describe_temperature(temp_c)
            
            # 简化的描述
            if "极寒" in desc:
                short_desc = "极寒"
            elif "严寒" in desc:
                short_desc = "严寒"
            elif "寒冷" in desc:
                short_desc = "寒冷"
            elif "凉爽" in desc:
                short_desc = "凉爽"
            elif "舒适" in desc:
                short_desc = "舒适"
            elif "温暖" in desc:
                short_desc = "温暖"
            elif "炎热" in desc:
                short_desc = "炎热"
            else:
                short_desc = "酷热"
            
            print(f"{temp_c:>8}°C {temp_f:>8.1f}°F {short_desc:>8}")
        
        print(f"{'='*30}")
    
    else:
        print("❌ 请选择1-4的数字!")

🎪 第五部分:综合单位转换器

5.1 多功能单位转换器

# 多功能单位转换器
print("🔄 多功能单位转换器")
print("=" * 60)

class UnitConverter:
    """多功能单位转换器类"""
    
    def __init__(self):
        """初始化转换系数"""
        # 长度转换系数
        self.length_factors = {
            'mm': 0.001,    # 毫米转米
            'cm': 0.01,     # 厘米转米
            'm': 1.0,       # 米
            'km': 1000.0,   # 千米转米
            'in': 0.0254,   # 英寸转米
            'ft': 0.3048,   # 英尺转米
            'yd': 0.9144,   # 码转米
            'mi': 1609.344  # 英里转米
        }
        
        # 重量转换系数(相对于克)
        self.weight_factors = {
            'mg': 0.001,    # 毫克转克
            'g': 1.0,       # 克
            'kg': 1000.0,   # 千克转克
            't': 1000000.0, # 吨转克
            'oz': 28.3495,  # 盎司转克
            'lb': 453.592,  # 磅转克
            'jin': 500.0,   # 斤转克
            '两': 50.0      # 两转克
        }
    
    def convert_length(self, value, from_unit, to_unit):
        """转换长度单位"""
        if from_unit not in self.length_factors or to_unit not in self.length_factors:
            return "❌ 不支持的单位"
        
        # 先转换为米
        meters = value * self.length_factors[from_unit]
        # 再转换为目标单位
        result = meters / self.length_factors[to_unit]
        return result
    
    def convert_weight(self, value, from_unit, to_unit):
        """转换重量单位"""
        if from_unit not in self.weight_factors or to_unit not in self.weight_factors:
            return "❌ 不支持的单位"
        
        # 先转换为克
        grams = value * self.weight_factors[from_unit]
        # 再转换为目标单位
        result = grams / self.weight_factors[to_unit]
        return result
    
    def convert_temperature(self, value, from_unit, to_unit):
        """转换温度单位"""
        # 先转换为摄氏度
        if from_unit == 'c':
            celsius = value
        elif from_unit == 'f':
            celsius = (value - 32) * 5/9
        elif from_unit == 'k':
            celsius = value - 273.15
        else:
            return "❌ 不支持的单位"
        
        # 从摄氏度转换
        if to_unit == 'c':
            return celsius
        elif to_unit == 'f':
            return celsius * 9/5 + 32
        elif to_unit == 'k':
            return celsius + 273.15
        else:
            return "❌ 不支持的单位"
    
    def get_unit_name(self, unit_code):
        """获取单位名称"""
        unit_names = {
            # 长度
            'mm': '毫米', 'cm': '厘米', 'm': '米', 'km': '千米',
            'in': '英寸', 'ft': '英尺', 'yd': '码', 'mi': '英里',
            # 重量
            'mg': '毫克', 'g': '克', 'kg': '千克', 't': '吨',
            'oz': '盎司', 'lb': '磅', 'jin': '斤', '两': '两',
            # 温度
            'c': '摄氏度', 'f': '华氏度', 'k': '开尔文'
        }
        return unit_names.get(unit_code, unit_code)
    
    def show_conversion_table(self, conversion_type):
        """显示单位换算表"""
        if conversion_type == 'length':
            print("\n📏 长度单位换算表:")
            print("-" * 40)
            print("1 千米 = 1000 米")
            print("1 米 = 100 厘米")
            print("1 厘米 = 10 毫米")
            print("1 英寸 = 2.54 厘米")
            print("1 英尺 = 12 英寸 = 30.48 厘米")
            print("1 码 = 3 英尺 = 0.9144 米")
            print("1 英里 = 1760 码 = 1.609 千米")
            
        elif conversion_type == 'weight':
            print("\n⚖️ 重量单位换算表:")
            print("-" * 40)
            print("1 吨 = 1000 千克")
            print("1 千克 = 1000 克")
            print("1 克 = 1000 毫克")
            print("1 磅 = 16 盎司 = 453.592 克")
            print("1 盎司 = 28.3495 克")
            print("1 千克 = 2 斤")
            print("1 斤 = 10 两 = 500 克")
            
        elif conversion_type == 'temperature':
            print("\n🌡️ 温度单位换算:")
            print("-" * 40)
            print("华氏度 = 摄氏度 × 9/5 + 32")
            print("摄氏度 = (华氏度 - 32) × 5/9")
            print("开尔文 = 摄氏度 + 273.15")
            print("摄氏度 = 开尔文 - 273.15")

# 使用转换器
converter = UnitConverter()

print("\n🎯 单位转换器已就绪!")

while True:
    print("\n" + "=" * 60)
    print("请选择转换类型:")
    print("1. 📏 长度单位转换")
    print("2. ⚖️ 重量单位转换")
    print("3. 🌡️ 温度单位转换")
    print("4. 📊 查看换算表")
    print("5. 🚪 退出")
    print("=" * 60)
    
    choice = input("\n请选择 (1-5): ")
    
    if choice == "5":
        print("👋 感谢使用单位转换器!")
        break
    
    elif choice == "1":
        # 长度转换
        print("\n📏 可用的长度单位:")
        length_units = ['mm', 'cm', 'm', 'km', 'in', 'ft', 'yd', 'mi']
        for unit in length_units:
            print(f"  {unit}: {converter.get_unit_name(unit)}", end="  ")
        
        try:
            value = float(input("\n\n请输入数值: "))
            from_unit = input("从哪个单位: ")
            to_unit = input("转换到哪个单位: ")
            
            result = converter.convert_length(value, from_unit, to_unit)
            
            if isinstance(result, str):  # 错误信息
                print(result)
            else:
                from_name = converter.get_unit_name(from_unit)
                to_name = converter.get_unit_name(to_unit)
                print(f"\n✅ 转换结果:")
                print(f"  {value} {from_name} = {result:.6g} {to_name}")
                
        except ValueError:
            print("❌ 请输入有效的数字!")
    
    elif choice == "2":
        # 重量转换
        print("\n⚖️ 可用的重量单位:")
        weight_units = ['mg', 'g', 'kg', 't', 'oz', 'lb', 'jin', '两']
        for unit in weight_units:
            print(f"  {unit}: {converter.get_unit_name(unit)}", end="  ")
        
        try:
            value = float(input("\n\n请输入数值: "))
            from_unit = input("从哪个单位: ")
            to_unit = input("转换到哪个单位: ")
            
            result = converter.convert_weight(value, from_unit, to_unit)
            
            if isinstance(result, str):  # 错误信息
                print(result)
            else:
                from_name = converter.get_unit_name(from_unit)
                to_name = converter.get_unit_name(to_unit)
                print(f"\n✅ 转换结果:")
                print(f"  {value} {from_name} = {result:.6g} {to_name}")
                
        except ValueError:
            print("❌ 请输入有效的数字!")
    
    elif choice == "3":
        # 温度转换
        print("\n🌡️ 可用的温度单位:")
        temp_units = ['c', 'f', 'k']
        for unit in temp_units:
            print(f"  {unit}: {converter.get_unit_name(unit)}", end="  ")
        
        try:
            value = float(input("\n\n请输入数值: "))
            from_unit = input("从哪个单位 (c/f/k): ")
            to_unit = input("转换到哪个单位 (c/f/k): ")
            
            result = converter.convert_temperature(value, from_unit, to_unit)
            
            if isinstance(result, str):  # 错误信息
                print(result)
            else:
                from_name = converter.get_unit_name(from_unit)
                to_name = converter.get_unit_name(to_unit)
                print(f"\n✅ 转换结果:")
                print(f"  {value} {from_name} = {result:.2f} {to_name}")
                
        except ValueError:
            print("❌ 请输入有效的数字!")
    
    elif choice == "4":
        # 查看换算表
        print("\n📊 选择换算表类型:")
        print("1. 长度单位换算表")
        print("2. 重量单位换算表")
        print("3. 温度单位换算")
        
        table_choice = input("请选择 (1-3): ")
        
        if table_choice == "1":
            converter.show_conversion_table('length')
        elif table_choice == "2":
            converter.show_conversion_table('weight')
        elif table_choice == "3":
            converter.show_conversion_table('temperature')
        else:
            print("❌ 无效选择!")
    
    else:
        print("❌ 请选择1-5的数字!")
    
    input("\n按回车键继续...")

5.2 实际生活应用

# 实际生活单位转换应用
print("🏠 实际生活单位转换应用")
print("=" * 60)

def cooking_converter():
    """烹饪单位转换"""
    print("\n🍳 烹饪单位转换器")
    print("-" * 40)
    
    # 烹饪单位换算
    cooking_units = {
        '毫升': 1,
        '升': 1000,
        '茶匙': 5,          # 约5毫升
        '汤匙': 15,         # 约15毫升
        '杯': 240,          # 约240毫升
        '盎司': 29.5735,    # 液体盎司
    }
    
    print("可用的烹饪单位:")
    for unit in cooking_units:
        print(f"  {unit}", end="  ")
    
    try:
        value = float(input("\n\n请输入数值: "))
        from_unit = input("从哪个单位: ")
        to_unit = input("转换到哪个单位: ")
        
        if from_unit not in cooking_units or to_unit not in cooking_units:
            print("❌ 不支持的单位")
            return
        
        # 转换
        ml_value = value * cooking_units[from_unit]
        result = ml_value / cooking_units[to_unit]
        
        print(f"\n✅ 转换结果:")
        print(f"  {value} {from_unit} = {result:.2f} {to_unit}")
        
    except ValueError:
        print("❌ 请输入数字!")

def travel_converter():
    """旅行单位转换"""
    print("\n✈️ 旅行单位转换器")
    print("-" * 40)
    
    # 旅行相关单位
    print("选择转换类型:")
    print("1. 距离转换(千米↔英里)")
    print("2. 速度转换(千米/时↔英里/时)")
    print("3. 货币估算(人民币↔美元,近似)")
    
    choice = input("请选择 (1-3): ")
    
    if choice == "1":
        # 距离转换
        try:
            value = float(input("请输入距离: "))
            unit = input("单位是千米(km)还是英里(mi)? ")
            
            if unit.lower() in ['km', '千米']:
                result = value * 0.621371  # 千米转英里
                print(f"\n✅ {value}千米 ≈ {result:.2f}英里")
            elif unit.lower() in ['mi', '英里']:
                result = value * 1.60934  # 英里转千米
                print(f"\n✅ {value}英里 ≈ {result:.2f}千米")
            else:
                print("❌ 不支持的单位")
                
        except ValueError:
            print("❌ 请输入数字!")
    
    elif choice == "2":
        # 速度转换
        try:
            value = float(input("请输入速度: "))
            unit = input("单位是千米/时(km/h)还是英里/时(mph)? ")
            
            if unit.lower() in ['km/h', '千米/时']:
                result = value * 0.621371
                print(f"\n✅ {value}千米/时 ≈ {result:.2f}英里/时")
            elif unit.lower() in ['mph', '英里/时']:
                result = value * 1.60934
                print(f"\n✅ {value}英里/时 ≈ {result:.2f}千米/时")
            else:
                print("❌ 不支持的单位")
                
        except ValueError:
            print("❌ 请输入数字!")
    
    elif choice == "3":
        # 货币估算(近似值)
        try:
            value = float(input("请输入金额: "))
            unit = input("是人民币(CNY)还是美元(USD)? ")
            
            # 使用近似汇率 1 USD ≈ 7 CNY
            if unit.lower() in ['cny', '人民币', '元']:
                result = value / 7
                print(f"\n💰 估算结果(汇率 ≈ 1:7):")
                print(f"  {value}人民币 ≈ {result:.2f}美元")
            elif unit.lower() in ['usd', '美元']:
                result = value * 7
                print(f"\n💰 估算结果(汇率 ≈ 1:7):")
                print(f"  {value}美元 ≈ {result:.2f}人民币")
            else:
                print("❌ 不支持的单位")
                
        except ValueError:
            print("❌ 请输入数字!")
    
    else:
        print("❌ 无效选择!")

def clothing_size_converter():
    """服装尺码转换"""
    print("\n👕 服装尺码转换器")
    print("-" * 40)
    
    # 儿童服装尺码对照(近似)
    kids_sizes = {
        'cn': ['100', '110', '120', '130', '140', '150'],  # 中国尺码(身高cm)
        'us': ['4T', '5T', '6', '7', '8', '10'],           # 美国尺码
        'eu': ['100', '110', '120', '130', '140', '150'],  # 欧洲尺码
    }
    
    print("儿童服装尺码对照表:")
    print("-" * 30)
    print(f"{'中国':^6} {'美国':^6} {'欧洲':^6}")
    print("-" * 30)
    
    for i in range(len(kids_sizes['cn'])):
        print(f"{kids_sizes['cn'][i]:^6} {kids_sizes['us'][i]:^6} {kids_sizes['eu'][i]:^6}")
    
    # 鞋码转换
    print(f"\n👟 儿童鞋码对照(近似):")
    print("-" * 30)
    print("中国码(CN) ≈ 欧洲码(EU) - 1")
    print("美国码(US) ≈ 欧洲码(EU) - 33")
    
    try:
        shoe_size = float(input("\n请输入鞋码: "))
        from_country = input("是哪个国家的尺码 (CN/EU/US)? ").upper()
        
        if from_country == 'CN':
            eu_size = shoe_size + 1
            us_size = eu_size - 33
        elif from_country == 'EU':
            eu_size = shoe_size
            us_size = shoe_size - 33
            cn_size = shoe_size - 1
        elif from_country == 'US':
            us_size = shoe_size
            eu_size = shoe_size + 33
            cn_size = eu_size - 1
        else:
            print("❌ 不支持的国家代码")
            return
        
        print(f"\n✅ 鞋码对照:")
        if from_country != 'CN':
            print(f"  中国码(CN): {cn_size:.0f}")
        if from_country != 'EU':
            print(f"  欧洲码(EU): {eu_size:.0f}")
        if from_country != 'US':
            print(f"  美国码(US): {us_size:.0f}")
            
    except ValueError:
        print("❌ 请输入数字!")

# 主菜单
print("\n🏠 实际生活转换应用")
print("=" * 40)

while True:
    print("\n选择应用场景:")
    print("1. 🍳 烹饪单位转换")
    print("2. ✈️ 旅行单位转换")
    print("3. 👕 服装尺码转换")
    print("4. 🚪 返回")
    
    choice = input("\n请选择 (1-4): ")
    
    if choice == "1":
        cooking_converter()
    elif choice == "2":
        travel_converter()
    elif choice == "3":
        clothing_size_converter()
    elif choice == "4":
        print("返回主菜单...")
        break
    else:
        print("❌ 请选择1-4的数字!")
    
    input("\n按回车键继续...")

📅 下节课预告

第20课:阶段项目-智能问答机器人

下节课你将学习:

  1. 综合运用前19课的所有知识
  2. 制作能回答问题的智能机器人
  3. 实现自然语言交互
  4. 添加记忆和学习功能
  5. 制作完整的智能对话系统

预习思考

  1. 如何让程序理解用户的问题?
  2. 如何根据问题给出合适的答案?
  3. 如何让对话更自然有趣?

💬 给家长的话

亲爱的家长

今天孩子学习了单位转换,这是数学和编程结合的实际应用,能帮助孩子在生活中解决实际问题。

孩子今天学会了

  1. ✅ 长度单位的转换(公制、英制、市制)
  2. ✅ 重量单位的转换
  3. ✅ 温度单位的转换
  4. ✅ 制作多功能单位转换器
  5. ✅ 在实际生活中应用单位转换

单位转换的实际价值

| 转换类型 | 生活应用 | 数学意义 | 能力培养 |

|---------|---------|---------|---------|

| 长度转换 | 身高、距离、尺寸 | 比例计算 | 空间思维 |

| 重量转换 | 体重、食材、包裹 | 单位换算 | 测量能力 |

| 温度转换 | 天气、烹饪、科学 | 公式应用 | 科学思维 |

| 综合转换 | 旅行、购物、生活 | 实际问题解决 | 应用能力 |

您可以这样做

生活应用

  1. 一起购物:用转换器比较商品规格
  2. 旅行计划:计算距离和速度
  3. 厨房帮手:转换食谱中的单位
  4. 身高体重:记录和转换身体数据

思维训练

  1. 讨论:为什么需要单位转换?
  2. 思考:如何设计更方便的转换器?
  3. 实践:在生活中发现需要转换的场景
  4. 创造:设计新的转换工具

温馨提示

  • 单位转换是数学的实际应用
  • 通过编程让转换更容易
  • 鼓励孩子观察生活中的单位
  • 用技术解决实际问题

🏆 今日成就

完成了今天的学习,你:

📏 掌握了长度单位转换

⚖️ 学会了重量单位转换

🌡️ 理解了温度单位转换

🔄 能制作多功能转换器

🏠 会解决实际问题

挑战任务

  1. 制作个人身高体重转换器
  2. 设计旅行专用转换工具
  3. 创建家庭烹饪转换助手
  4. 记录一周的温度变化并转换

🌟 编程心法

单位是测量的语言
转换是沟通的桥梁
用代码理解世界
用计算连接不同
从厘米到英寸
从千克到磅
从摄氏度到华氏度
编程让转换更简单
数学让世界更清晰
从今天起
用技术解决实际问题
用智慧连接不同世界

记住:编程不仅是写代码,更是解决问题的工具。用编程让生活更便利,让学习更有趣!


第19课结束。你现在已经是单位转换小专家了!

实践任务:

1. 制作个人专属转换工具

2. 设计旅行转换助手

3. 创建烹饪转换器

4. 记录和分析生活数据

下节课,让我们综合所有知识,制作智能问答机器人!

第20课见!🤖