# GESP等级：一级 | GESP Python 一级考点
# ============================================
# 第4节：算术运算符完整 + - * / // % **
#
# GESP #12 算术运算符及运算优先级
# 核心口诀：
#   // 整除去小数，% 取余数，** 指数爆炸
#   括号 > 幂 > 乘除 > 加减
# ============================================
import turtle

t = turtle.Turtle()
t.shape("turtle")
t.speed(8)

# ============================================
# 模式0：三种除法结果对比（演示用 / // %）
# ============================================
print("===== 模式0：/  //  %  三种除法对比 =====")
print("10 / 3  =", 10 / 3)      # 普通除法 → 3.3333333333333335
print("10 // 3 =", 10 // 3)     # 整除 → 3
print("10 % 3  =", 10 % 3)      # 取余 → 1
print()

# 验证互补关系
a, b = 10, 3
商 = a // b
余 = a % b
print("验证：", 商, "*", b, "+", 余, "=", 商 * b + 余, "==", a)
print()

# ============================================
# 模式1：+ 加法 — t.forward(50+50)
# ============================================
print("===== 模式1：+ 加法 =====")
t.penup()
t.goto(-300, 200)
t.pendown()
t.color("blue")

base = 50
t.forward(base)              # forward(50)
t.right(90)
t.forward(base + 50)         # forward(100)  — Python 先算 50+50=100
t.right(90)
t.forward(base + 100)        # forward(150)  — 50+100=150
t.right(90)
t.forward(base + 150)        # forward(200)  — 50+150=200

t.penup()
t.goto(-300, 180)
t.pendown()
t.color("darkblue")
t.write("+ 加法: forward(50+50) → 100", font=("Arial", 10, "normal"))

# ============================================
# 模式2：- 减法 — 360-180=180° 掉头
# ============================================
print("===== 模式2：- 减法 =====")
t.penup()
t.goto(120, 200)
t.pendown()
t.color("red")

t.forward(100)
t.right(360 - 180)           # 等于 right(180)——掉头！
t.forward(100)

t.penup()
t.goto(120, 180)
t.pendown()
t.color("darkred")
t.write("- 减法: right(360-180) → 掉头", font=("Arial", 10, "normal"))

# ============================================
# 模式3：* 乘法 — 边长 * 3
# ============================================
print("===== 模式3：* 乘法 =====")
t.penup()
t.goto(-300, 80)
t.pendown()
t.color("green")

边长 = 30
t.forward(边长)              # forward(30)
t.right(90)
t.forward(边长 * 3)          # forward(90) — 三倍！

t.penup()
t.goto(-300, 60)
t.pendown()
t.color("darkgreen")
t.write("* 乘法: forward(边长*3) → 三倍放大", font=("Arial", 10, "normal"))

# ============================================
# 模式4：/ 除法 — 360 / 边数（正多边形）
# ============================================
print("===== 模式4：/ 除法 — 正多边形 =====")
t.penup()
t.goto(120, 80)
t.pendown()
t.color("purple")

边数 = 6                      # 正六边形
t.write("正" + str(边数) + "边形", font=("Arial", 10, "normal"))
t.backward(30)
for i in range(边数):
    t.forward(60)
    t.right(360 / 边数)       # 360 / 6 = 60°

t.penup()
t.goto(120, 60)
t.pendown()
t.color("darkviolet")
t.write("/ 除法: right(360/边数) → 正多边形", font=("Arial", 10, "normal"))

# ============================================
# 模式5：// 整除 和 % 取余（100 颗糖分给 7 人）
# ============================================
print("===== 模式5：// 整除 和 % 取余 =====")
t.penup()
t.goto(-300, -40)
t.pendown()
t.color("orange")

total = 100
people = 7
每人得 = total // people      # 14
剩余 = total % people        # 2
print("100 // 7 =", 每人得)
print("100 % 7 =", 剩余)
print("验证：", 每人得, "* 7 +", 剩余, "=", 每人得 * 7 + 剩余)

t.write("100//7=" + str(每人得) + "  100%7=" + str(剩余), font=("Arial", 10, "normal"))

# 用 % 画虚线（每 3 笔抬笔）
t.penup()
t.goto(-300, -80)
t.pendown()
t.color("darkorange")
t.write("用 % 画虚线：每 3 笔抬笔", font=("Arial", 10, "normal"))

t.penup()
t.goto(-300, -110)
t.pendown()
t.color("blue")
for i in range(1, 16):       # i 从 1 到 15
    t.forward(30)
    if i % 3 == 0:           # i 能被 3 整除 → 抬笔
        t.penup()
        t.forward(15)        # 空走一段（间隔）
        t.pendown()

# ============================================
# 模式6：** 幂运算 — 2**10=1024 指数爆炸
# ============================================
print("===== 模式6：** 幂运算 =====")
t.penup()
t.goto(120, -40)
t.pendown()
t.color("magenta")

print("2**10 =", 2**10)      # 1024 指数爆炸！
print("3**3  =", 3**3)       # 27
print("10**2 =", 10**2)      # 100

t.write("2**10=1024 指数爆炸!", font=("Arial", 10, "normal"))

# ============================================
# 模式7：运算优先级演示
# ============================================
print()
print("===== 模式7：运算优先级 =====")
print("2 + 3 * 4     =", 2 + 3 * 4)         # 14（先乘后加）
print("(2 + 3) * 4   =", (2 + 3) * 4)       # 20（先括号）
print("2 + 3 * 4**2  =", 2 + 3 * 4**2)      # 50（** → * → +）
print("(2+3) * 4**2  =", (2 + 3) * 4**2)    # 80（括号 → ** → *）

t.penup()
t.goto(120, -80)
t.pendown()
t.color("darkgreen")
t.write("优先级: 括号>幂>乘除>加减", font=("Arial", 10, "normal"))

# ============================================
# 实操①：计算 100//7 和 100%7（预写答案）
# ============================================
print()
print("===== 实操①：100 // 7 和 100 % 7 =====")
print("100 // 7 =", 100 // 7)
print("100 % 7  =", 100 % 7)
print("验证：", (100 // 7) * 7 + (100 % 7), "== 100")
print("✅ 整除和取余互补！ (a//b)*b + a%b == a")

# ============================================
# 实操②：用 ** 画爆炸螺旋
# ============================================
print()
print("===== 实操②：用 ** 画爆炸螺旋 =====")
t2 = turtle.Turtle()
t2.shape("turtle")
t2.speed(8)
t2.penup()
t2.goto(-150, -200)
t2.pendown()
t2.color("red")

for i in range(1, 11):        # i 从 1 到 10
    step = i ** 2             # ★ 边长 = i 的平方 → 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
    t2.forward(step)
    t2.right(61)

t2.penup()
t2.goto(-150, -230)
t2.pendown()
t2.color("darkred")
t2.write("爆炸螺旋: step = i**2 → 1, 4, 9, 16, 25...", font=("Arial", 10, "normal"))

# ============================================
# 实操③：用 % 画虚线（每 3 笔抬笔）
# ============================================
print()
print("===== 实操③：用 % 画虚线 =====")
t3 = turtle.Turtle()
t3.shape("turtle")
t3.speed(6)
t3.penup()
t3.goto(150, -200)
t3.pendown()
t3.color("blue")

for i in range(1, 16):       # i 从 1 到 15
    t3.forward(30)
    if i % 3 == 0:           # i 能被 3 整除 → 抬笔画间隔
        t3.penup()
        t3.forward(15)        # 空走一段
        t3.pendown()

t3.penup()
t3.goto(150, -230)
t3.pendown()
t3.color("darkblue")
t3.write("% 画虚线: i%3==0 时抬笔间隔", font=("Arial", 10, "normal"))

# ============================================
# 模式8：小测答案验证
# ============================================
print()
print("===== 小测答案 =====")
print("10 // 3 =", 10 // 3)   # 3
print("10 % 3  =", 10 % 3)    # 1
print("2 ** 3  =", 2 ** 3)    # 8
print()
print("记忆钩子：")
print("  // 整除去小数")
print("  %  取余数")
print("  ** 指数爆炸")
print("  括号 > 幂 > 乘除 > 加减")

turtle.done()
