# GESP等级：三级 | GESP Python 三级考点

"""
第5节：二维列表 —— 小测
GESP #38

【记忆钩子】
  二维列表 = 表格有行有列  →  matrix[行][列]
"""

# ============================================================
# 小测题目
# ============================================================

# 先定义一个二维列表作为题目背景
matrix = [
    [10, 20, 30],
    [40, 50, 60],
    [70, 80, 90]
]

# 题目：matrix[1][0] 的值是什么？
#
# 分析步骤：
#   matrix[1]   → 取第1行整行 → [40, 50, 60]
#   [40,50,60][0] → 取该行的第0个元素 → 40
#
# 答案：40

# ============================================================
# 模拟小测（交互式问答）
# ============================================================

def run_quiz():
    """运行一个小测，验证你对二维列表的理解"""
    score = 0
    total = 0

    def ask(question, answer, hint=""):
        nonlocal score, total
        total += 1
        print(f"\n第{total}题: {question}")
        if hint:
            print(f"  提示：{hint}")
        user_input = input("  你的答案: ")
        try:
            user_ans = eval(user_input) if user_input.isdigit() or \
                        (user_input.startswith("-") and user_input[1:].isdigit()) \
                        else user_input
        except:
            user_ans = user_input
        if user_ans == answer:
            print("  ✓ 正确！")
            score += 1
        else:
            print(f"  ✗ 错误，正确答案是 {answer}")

    print("=" * 50)
    print("  ★ 二维列表 小测 ★")
    print("=" * 50)

    # ---- 前置数据 ----
    mat = [
        [10, 20, 30],
        [40, 50, 60],
        [70, 80, 90]
    ]
    # ---- 题目 ----
    ask("matrix[1][0] 的值是什么？", 40)
    ask("matrix[0][2] 的值是什么？", 30)
    ask("matrix[2][1] 的值是什么？", 80)
    ask("len(matrix) 是多少？（有几行）", 3)
    ask("len(matrix[0]) 是多少？（有几列）", 3)
    ask("matrix[-1][-1] 的值是什么？", 90)

    # ---- 代码阅读题 ----
    print(f"\n\n阅读以下代码：")
    print("""
    scores = [
        ["小明", 88, 92],
        ["小红", 95, 90],
        ["小刚", 78, 85]
    ]
    for row in scores:
        print(row[0])
    """)
    ask("上面的代码会输出什么？（用列表写出三个名字）",
        ["小明", "小红", "小刚"],
        hint="row[0] 取出每行的第0个元素")

    # ---- 判断题 ----
    ask("matrix[1] 取出的是一整行还是一整列？",
        "一整行",
        hint="matrix[行索引] 取的是第几行？")

    ask("二维列表中的每个元素可以是不等长的列表吗？（True/False）",
        True)

    # ---- 结果 ----
    print("\n" + "=" * 50)
    print(f"  得分：{score}/{total}")
    if score == total:
        print("  评价：★ 完美！你完全掌握了二维列表！")
    elif score >= total * 0.7:
        print("  评价：☆ 不错，再复习一下索引规则。")
    else:
        print("  评价：○ 需要回去再看看知识点哦。")
    print("=" * 50)


# ============================================================
# 非交互模式 —— 直接打印答案
# ============================================================

def print_answers():
    """直接输出所有题目答案（用于课堂快速对照）"""
    print("=" * 60)
    print("二维列表小测 —— 答案速查")
    print("=" * 60)

    mat = [
        [10, 20, 30],
        [40, 50, 60],
        [70, 80, 90]
    ]

    print(f"""
  前置数据:
    matrix = [
      [10, 20, 30],   ← 第0行
      [40, 50, 60],   ← 第1行
      [70, 80, 90]    ← 第2行
    ]

  Q1: matrix[1][0] = ？
      第1行第0列 → {mat[1][0]}        ← 答案

  Q2: matrix[0][2] = ？
      第0行第2列 → {mat[0][2]}        ← 答案

  Q3: matrix[2][1] = ？
      第2行第1列 → {mat[2][1]}        ← 答案

  Q4: len(matrix) = {len(mat)}           ← 答案（行数）

  Q5: len(matrix[0]) = {len(mat[0])}      ← 答案（列数）

  Q6: matrix[-1][-1] = {mat[-1][-1]}      ← 答案（最后一行最后一列）
    """)


# ============================================================
# 主入口
# ============================================================

if __name__ == "__main__":
    import sys

    print("=== 第5节·二维列表 小测 ===")
    print("请选择模式：")
    print("  1 - 交互式答题")
    print("  2 - 查看答案")

    # 自动选择非交互模式（在脚本运行环境中默认显示答案）
    print("\n[自动模式] 显示答案速查：")
    print_answers()

    print("\n" + "=" * 60)
    print("【记忆钩子复习】")
    print("  二维列表 = 表格有行有列")
    print("  matrix[行][列] —— 先取行，再取列")
    print("  for row in matrix: 逐行遍历")
    print("  双重 for 循环逐个访问每个元素")
    print("=" * 60)
