# GESP等级:二级 | GESP Python 二级考点
"""
存储三兄弟演示程序
面向7-10岁少儿编程教学
演示 RAM / ROM / Cache 三种存储器的特点
"""

print("=" * 50)
print("   存储三兄弟登场!")
print("   RAM 工作台 | ROM 保险箱 | Cache 小本本")
print("=" * 50)

# ============================================================
# 第一部分:RAM 演示 —— 工作台
# ============================================================
print("\n" + "=" * 50)
print("  【一、RAM —— 工作台】")
print("=" * 50)

# 模拟 RAM:创建一个"工作台"列表
ram_workspace = []
print("\n1. 小明打开电脑,RAM 工作台准备好了!")
print("   当前工作台:", ram_workspace)

# 往 RAM 里放数据
print("\n2. 小明开始写作业,在 RAM 里放了些数据:")
ram_workspace.append("数学题 3+5=8")
ram_workspace.append("语文生字 '大'")
ram_workspace.append("英语单词 'apple'")
print("   当前工作台:", ram_workspace)
print("   >> RAM 可以写入数据!")

# 读数据
print("\n3. 小明查看作业:")
for i, item in enumerate(ram_workspace, 1):
    print(f"   第{i}项:{item}")
print("   >> RAM 可以读取数据!")

# 模拟断电
print('\n4. 【断电了!】—— 妈妈喊"吃饭啦!"小明放下笔走了...')
ram_workspace.clear()  # 模拟断电丢失数据
print("   吃完饭回来,工作台被收拾干净了...")
print("   当前工作台:", ram_workspace)
print("   ⚠️ RAM 的重要特点:断电后数据全部丢失!")
print("   >> 所以写文档要及时保存到硬盘!")

# ============================================================
# 第二部分:ROM 演示 —— 保险箱
# ============================================================
print("\n" + "=" * 50)
print("  【二、ROM —— 保险箱】")
print("=" * 50)

# 模拟 ROM:预设好的数据,不能修改
rom_safe = ["BIOS引导程序", "开机自检程序", "系统固件"]

print("\n1. ROM 保险箱里存放了出厂就写好的数据:")
for i, item in enumerate(rom_safe, 1):
    print(f"   第{i}条:{item}")
print("   >> 这些数据是出厂时就写好的!")

# 尝试修改 ROM
print("\n2. 小明想改 ROM 里的数据...")
print("   小明:我能不能给 BIOS 加一段游戏?")
print("   ROM:不行!我是只读存储器,你不能修改我的内容!")
print("   ⚠️ ROM 的重要特点:只能读取,不能写入修改!")

# 断电测试
print("\n3. 【断电了!】—— 然后重新开机...")
print("   ROM 保险箱里的数据:")
for i, item in enumerate(rom_safe, 1):
    print(f"   第{i}条:{item}")
print("   ✅ ROM 的重要特点:断电后数据不会丢失!")
print("   >> 所以电脑的启动程序存在 ROM 里")

# ============================================================
# 第三部分:Cache 演示 —— 随身小本本
# ============================================================
print("\n" + "=" * 50)
print("  【三、Cache —— 随身小本本】")
print("=" * 50)

# 模拟 Cache:最近使用的数据,速度飞快
cache = {}
print("\n1. CPU 要算 3+5...")
print("   CPU:Cache,3+5 等于几?")

# Cache 未命中
print("   Cache:让我查查我的小本本...（翻翻翻）")
print("   Cache:哎呀,没有记过!我去 RAM 里找!")
print("   >> Cache 未命中（Cache Miss）——去 RAM 取")

# 从 RAM 取来后缓存
cache["3+5"] = 8
print("\n2. CPU 又算 3+5...")
print("   CPU:Cache,3+5 等于几?")
print("   Cache:翻小本本...找到了!等于 8!")
print(f"   Cache 里的数据:{cache}")
print("   ✅ Cache 命中（Cache Hit）——超快返回!")
print("   >> 下次再用 3+5,不用算了,直接取!")

# Cache 容量限制
print("\n3. Cache 容量测试...")
print("   Cache 小本本只有几页纸!如果记满了:")
print("   先记:3+5=8")
cache["3+5"] = 8
print("   又记:7+2=9")
cache["7+2"] = 9
print("   再记:4×6=24")
cache["4×6"] = 24
print("   还记:100-37=63")
cache["100-37"] = 63
print("   继续记:... 小本本满了!旧的记录被擦掉了!")
print("   ⚠️ Cache 容量很小,满了就淘汰旧数据!")

# ============================================================
# 第四部分:三兄弟大比拼
# ============================================================
print("\n" + "=" * 50)
print("  【四、三兄弟大比拼】")
print("=" * 50)

print("\n" + "-" * 40)
print(f"{'特性':<12}{'RAM':<10}{'ROM':<10}{'Cache':<10}")
print("-" * 40)
print(f"{'读写':<12}{'读+写':<10}{'只读':<10}{'读+写':<10}")
print(f"{'断电丢':<12}{'✅ 丢':<10}{'❌ 不丢':<10}{'✅ 丢':<10}")
print(f"{'速度':<12}{'中等':<10}{'较慢':<10}{'最快':<10}")
print(f"{'容量':<12}{'大':<10}{'较大':<10}{'很小':<10}")
print(f"{'比喻':<12}{'工作台':<10}{'保险箱':<10}{'小本本':<10}")
print("-" * 40)

# ============================================================
# 第五部分:生活场景代入
# ============================================================
print("\n" + "=" * 50)
print("  【五、小明做作业的场景】")
print("=" * 50)

print("""
场景:小明放学回家做作业

1. 打开书包,拿出课本（ROM——数据已经在书里了）
   只能看,不能改课本上的字（ROM 只读）

2. 在桌上铺开作业本开始写（RAM——开始工作）
   把题目从课本抄到作业本上（从ROM读取到RAM）
   计算答案写下来（往RAM写数据）

3. 遇到 5+6,直接写 11（Cache——已经算过多次了）
   因为之前在Cache里存过"5+6=11"

4. 妈妈喊"吃饭!"小明放下笔去吃饭（断电）
   回来发现:作业本上写了什么?
   ——如果没保存,全忘了!（RAM断电丢失）
   ——课本还好好的在书包里呢（ROM不受影响）
""")

# ============================================================
# 第六部分:GESP 考点小测试
# ============================================================
print("\n" + "=" * 50)
print("  【六、GESP 考点小测试】")
print("=" * 50)

print("\n📝 第一题（判断）:RAM断电后数据仍然保留。（  ）")
print("   答案:×  因为RAM是工作台,断电就被清空啦!")
print()
print("📝 第二题（选择）:以下哪种断电后数据不会丢失?")
print("   A. RAM   B. ROM   C. Cache   D. CPU寄存器")
print("   答案:B  只有ROM是保险箱,断电也不丢!")
print()
print("📝 第三题（排序）:按速度从快到慢排序")
print("   选项:RAM、ROM、Cache")
print("   答案:Cache > RAM > ROM")
print("   解释:小本本(Cache) > 工作台(RAM) > 保险箱(ROM)")
print()
print("📝 第四题（填空）:计算机开机时,先从____读取启动指令。")
print("   答案:ROM  因为BIOS程序存在ROM里,断电不丢!")

print("\n" + "=" * 50)
print("   存储三兄弟演示完毕!")
print("   记住身体动作:RAM平摊 / ROM抱胸 / Cache指太阳穴")
print("=" * 50)
