简介:相似三角形练习题精选(华师大版)围绕第18.1课时“相似三角形”设计,是面向初中学生的专项巩固材料。内容按基础填空、选择、综合题分层编排,覆盖相似三角形的对应角相等、对应边成比例、相似比计算、平行线构造相似三角形、全等与相似关系辨析等核心考点,并配有详细参考答案。通过四边形、平行四边形、梯形等图形中的比例推导与多对相似三角形识别,学生可以系统训练几何证明思路和比例式书写能力,教师也能直接用于课后作业、单元测试或复习讲评。压缩包共1个文件,为doc格式文档,整体大小173KB,内容紧凑、便于打印使用。这份文档目前已吸引85人学习浏览,适合初中数学学习者课后强化、备考演练以及教师备课参考。完成这些题目后,读者能够更熟练地判断三角形是否相似、准确列出对应边比例,并利用相似性质计算未知边长度,从而为后续几何学习打下扎实基础。
1. 从一份 doc 说起:相似三角形练习题为什么值得用程序生成
做初中数学教辅的人,或者给自家孩子整理习题的家长,大概率见过这样的场景:从网上翻出十几份《相似三角形练习题》,选中一份标题写着【华师大版】精选的 doc,下载后发现公式乱码、答案错位、重复题一大堆。真正的问题是:这份 doc 本质上是人工排版产物,题目与答案之间的对应关系、难度分布、知识点的覆盖都没有被结构化。作为 IT 从业者,我更愿意把这个文档看作一个数据产品——把“相似三角形练习题”变成程序可生成、可校验、可精选的输出物。我会用 Python 建模相似三角形的判定规则,把题型模板和输出过程全部程序化,最终得到一份可以直接打印的 Word 文档。适合负责题库系统的后端工程师、做教育工具的产品与开发,以及想批量出卷的数学老师。
2. 相似三角形判定模型的参数化:把几何定理变成可枚举的生成规则
2.1 华师大版考纲里的相似三角形判定与出题粒度
华师大版初中数学将相似三角形放在九年级上册,核心知识点依次是:相似三角形的概念,平行线分线段成比例,三角形相似的判定定理,以及相似三角形的性质。教材层面的判定定理有三条:两角分别相等的两个三角形相似;两边成比例且夹角相等的两个三角形相似;三边成比例的两个三角形相似。前两条是出题主力,第三边比例通常作为答案出现。
出题粒度可以分三层。第一层是“直接判定”,题干直接给出两个三角形的角度或边比,让学生判断是否相似;第二层是“计算缺失值”,已知两个三角形相似和部分边长,求某一边或某一角;第三层是“实际应用”,比如利用相似三角形测高、测河宽。程序化生成时要优先覆盖前两层,因为数据可枚举,答案可计算;第三层需要场景模板,可以在正式文档里以附加题形式出现。
这里的核心思路是把几何题变成数据生成问题:每道题由一组三元组构成——两个三角形的对应顶点、已知边的长度、已知角的大小。只要保证这些约束不矛盾、不退化,就能得到一道合法题目。下面用一个具体的生成函数来演示。
2.2 用 Python 描述“已知两边夹角,求第三边比例”的生成函数
最常见的相似三角形计算题是:已知 △ABC ∽ △DEF,给出 △ABC 的两边和夹角,同时给出 △DEF 中对应的一边,求另一边。由于相似比固定,另一边用比例关系直接算出。但为了避免所有题目都是简单的整数乘法,我会先随机生成一个原始三角形,再按比例缩放得到第二个三角形。
import random import math def gen_sas_case(scale=1.5, angle_set=(30, 45, 60, 90, 120)): """生成一对相似三角形的边长数据。 scale: 相似比,要求大于0且不等于1,否则题目无区分度 angle_set: 可选夹角集合,默认只取特殊角 """ a = random.randint(4, 10) # 第一条边 b = random.randint(4, 10) # 第二条边 angle = random.choice(angle_set) # 用余弦定理计算第三边 c = math.sqrt(a*a + b*b - 2*a*b*math.cos(math.radians(angle))) c = round(c, 1) # 缩放得到第二个三角形的对应边 a2 = round(a * scale, 1) b2 = round(b * scale, 1) return { "a": a, "b": b, "angle": angle, "third": c, "a2": a2, "b2": b2, "scale": scale }这段代码的逻辑是:先用余弦定理算第三边c,再整体乘以scale生成对应边。返回字典包含两个三角形的全部边长和夹角。scale参数控制相似比,一般取 1.2~2.5;如果等于 1,两个三角形全等,相似题会失去难度,所以要排除。
参数说明:angle_set如果包含 90,就会生成勾股数相关题;如果包含 60,可能和等边三角形挂钩。华师大版练习经常涉及特殊角,所以我把角度集合设成(30, 45, 60, 90, 120)这样的离散值,配合整数边长,便于学生手算。round在这里是必要的,但要注意:四舍五入可能破坏严格的几何关系,所以生成后还要做合法性校验,这一步放在第 5 章处理。
2.3 生成参数表与约束条件表
为了让生成器具有可配置性,我把所有会影响题目形态的参数整理成一张表,后续做精选时直接改配置,不动算法。
| 参数名 | 含义 | 推荐值 | 影响 |
|---|---|---|---|
scale | 相似比 | 1.2 ~ 2.5,避开 1 | 决定题目区分度 |
angle_set | 夹角可选集合 | {30, 45, 60, 90, 120} | 控制特殊角题型 |
integer_only | 是否强制边长整数 | True / False | 决定计算复杂度 |
allow_root | 是否允许根号答案 | True | 是否涉及无理数 |
reverse | 是否反向出题(给对应边求原边) | True | 防止思维定式 |
约束表要回答“什么情况下应该放弃这道题”。常见约束包括:三角形两边之和大于第三边;两边之差小于第三边;角度在 0~180 之间;相似比不为 1;计算结果不能为负数。如果integer_only=True,生成的边长必须能被相似比整除,否则用round会产生精度问题,这类题目我会直接丢弃而不是四舍五入,因为四舍五入后的数据在严格的几何意义下可能不成立。
把上述代码保存在sim_triangle.py里,可以通过一行命令批量生成 5 道候选题目:
python -c "from sim_triangle import gen_sas_case; [print(gen_sas_case()) for _ in range(5)]"这只是一个原始数据池,真正进入文档前还要经过筛选,这部分留到第 4 章细说。接下来先解决“怎么把这些数据变成一份合格的 doc”。
3. 用 python-docx 把练习题写成《相似三角形练习题【华师大版】精选.doc》
3.1 文档结构设计与题型模板
一份可用的练习题 doc,需要具备三个基本结构:抬头信息、题目区、答案区。抬头包括标题、姓名班级得分栏。题目区按题型分组,常见有选择题、填空题、解答题。答案区可以单独放在文档末尾,也可以用隐藏文字放在题后。考虑到很多老师希望学生先做题再对答案,我会把答案统一放在最后一页,并用分隔线标注。
python-docx 默认保存为.docx,但标题要求.doc。这里要说明,我们生成的文件名可以叫精选.doc,实际内容是 docx 容器,Word 2007 以上能正常打开;如果硬性要求老式.doc二进制格式,可以用 LibreOffice 在命令行转一次,第 5 章会提到。生成阶段我更关注内容结构,而不是二进制容器。
下面是文档各区块的生成方式汇总:
| 区块 | 内容 | 生成方式 |
|---|---|---|
| 抬头 | 标题、姓名栏、班级栏、得分栏 | add_heading+add_paragraph |
| 选择题 | 题干 + 4 个选项 | add_paragraph,选项用换行 |
| 填空题 | 题干 + 留空横线 | add_paragraph,末尾加____ |
| 解答题 | 题干 + 空白答题区 | add_paragraph+ 多个空行 |
| 答案页 | 分页后的参考答案 | add_page_break+add_paragraph |
这张表也是我自己写脚本时的清单:每生成一个区块,先看它在文档里的目标结构,再决定用哪个 API。
3.2 核心代码:插入选择题、填空题、解答题
下面是一个最小可运行的构建函数,输入第 2 章的题目字典列表,输出一份带标准排版的 docx 文件。
from docx import Document from docx.shared import Pt, Cm from docx.enum.text import WD_ALIGN_PARAGRAPH def build_doc(cases, output="相似三角形练习题【华师大版】精选.doc"): doc = Document() # 页边距设置,避免左侧装订线挡住内容 for section in doc.sections: section.left_margin = Cm(2.5) section.right_margin = Cm(2.0) # 主标题 title = doc.add_heading("相似三角形练习题(华师大版)", level=1) title.alignment = WD_ALIGN_PARAGRAPH.CENTER # 信息栏 info = doc.add_paragraph("姓名:__________ 班级:__________ 得分:__________") info.alignment = WD_ALIGN_PARAGRAPH.RIGHT # 选择题模板 doc.add_heading("一、选择题", level=2) for i, case in enumerate(cases[:5], 1): p = doc.add_paragraph(f"{i}. 已知 △ABC∽△DEF," f"AB={case['a']},DE={case['a2']}," f"∠B={case['angle']}°,则下列结论正确的是( )。") p.add_run("\nA. 对应角相等 B. 周长比等于相似比 " "C. 面积比等于相似比 D. 以上都不对") p.paragraph_format.space_after = Pt(6) # 填空题模板 doc.add_heading("二、填空题", level=2) for i, case in enumerate(cases[5:10], 1): doc.add_paragraph( f"{i}. 如图,△ABC∽△DEF,AB={case['a']}," f"DE={case['a2']},∠B={case['angle']}°," f"则 EF 的长为____。" ) # 解答题模板 doc.add_heading("三、解答题", level=2) for i, case in enumerate(cases[-3:], 1): doc.add_paragraph( f"{i}. 已知两个三角形相似,其中一组对应边的长度分别为 " f"{case['a']} 和 {case['a2']},且它们的夹角都为 " f"{case['angle']}°。请说明这两个三角形相似," f"并求出第三组对应边的比值。" ) doc.add_paragraph("解:") doc.add_paragraph() # 答案页 doc.add_page_break() doc.add_heading("参考答案", level=2) for i, case in enumerate(cases[-3:], 1): doc.add_paragraph(f"{i}. 相似比 = {case['scale']},第三边 = {case['third']}") doc.save(output) print(f"已生成 {output},共 {len(cases)} 道题")这段代码做了几件事:第一,设置页边距;第二,用add_heading建立文档层级;第三,每个题型用循环插入对应模板;第四,答案独立放在最后一页。选择题里的choice_pool我直接写进了字符串,实际使用时应根据题干随机排列选项,避免正确答案固定位置。
需要注意cases列表的切片方式:cases[:5]取前 5 道作为选择题,cases[5:10]作为填空题,cases[-3:]作为解答题。这种写法在生产环境里不够稳健,因为如果cases少于 10 个会直接崩掉。更稳妥的做法是事先用len(cases)做断言,或者把题型数量作为参数传入:
def build_doc(cases, output, choice_num=5, fill_num=5, solve_num=3): assert len(cases) >= choice_num + fill_num + solve_num这个断言很关键,生成候选数据时要保证数量充足,否则会出现“答案对不上题”的尴尬。
3.3 公式与答案的排版技巧
初中几何题经常出现根号、分数、比例式。python-docx 的add_paragraph只能插入纯文本,不能直接写 Word 公式对象。我的做法是分级处理:
- 如果题目只有简单的整数、小数和比例符号,直接写成字符串,例如
"3:4"、"√2"(用 Unicode 字符 √)。 - 如果题目出现分数结构,例如
"EF/BC = 2/5",可以换成"EF:BC = 2:5",避免用横线排版。 - 如果需要真正的 Word 原生公式,用 Pandoc 转换。假设你要维护一个 Markdown 题库源文件:
pandoc 相似三角形题库.md -o 相似三角形练习题.docx在 Markdown 里写$ \frac{AB}{DE} = \frac{2}{3} $,Pandoc 会自动把 LaTeX 公式转成 Word OMML,打开后可以双击编辑。比起在 python-docx 里手动拼 XML,这条路最省心。
另外,常见做法是在答案区使用隐藏文字。python-docx 设置隐藏文字需要操作run.font.hidden属性,但隐藏文字在某些打印设置下会被打印出来。我更推荐把答案单独放在最后一页,并用一个明显的分页符隔开,这样学生复习时不会一眼扫到答案。
4. 题目精选策略:难度分层、去重与易错点注入
4.1 难度系数怎么定
批量生成很容易,发愁的是怎么从 200 道候选里挑出 20 道“精选”题。我的第一维筛法是从数据本身计算难度,不依赖人工标注。难度系数由四个因子决定:
| 因子 | 条件 | 难度增量 |
|---|---|---|
| 整数边 | 所有边长均为整数 | -0.2 |
| 无理数答案 | 第三边含根号 | +0.3 |
| 特殊角 | 角度为 30/45/60/90 | -0.15 |
| 反向求解 | 已知对应边求原边 | +0.2 |
我给出一个简单函数:
def difficulty(case): score = 0.0 if float(case["a"]).is_integer() and float(case["b"]).is_integer(): score -= 0.2 if not float(case["third"]).is_integer(): score += 0.3 if case["angle"] in (30, 45, 60, 90): score -= 0.15 if case.get("reverse", False): score += 0.2 return max(0.1, min(1.0, round(score, 2)))这个系数不是标准答案,而是策略参数。对于华师大版练习,我一般把题目分成三档:基础档(难度 0.2~0.4),提高档(0.4~0.7),拓展档(0.7~0.9)。选择时按 5:3:2 的比例从三档中各取题目,并保证同一档内知识点不重叠。
4.2 三种去重方法:向量化、归一化、哈希签名
生成器会碰到大量表面不同、实质相同的题。例如a=3, b=4, angle=90和a=6, b=8, angle=90本质都是 3-4-5 直角三角形的放大版。要自动识别这种同构,我常用下面三种方法。
第一种,边长比归一化。把所有边长除以最大边长,得到比例向量,用比例向量做比较。
def normalize_sides(case): sides = sorted([case["a"], case["b"], case["third"]]) return tuple(round(s / max(sides), 4) for s in sides)第二种,角度集合归一化。把三角形三个内角排序后作为签名。因为已知两边和夹角,第三个角是确定的,所以可以将(a, b, angle)转换为(angle, 另一角, 第三角),但要注意两个顺序不同的三角形可能是镜像,需要加一个规范化:把角度集合排序。
第三种,综合哈希。把边长比向量和角度签名合并,取 MD5 前 8 位作为题目签名,存入set去重。
import hashlib def sign(case): key = f"{normalize_sides(case)}|{sorted([case['angle'], 90, 90])}" return hashlib.md5(key.encode()).hexdigest()[:8]我一般只用哈希签名,因为速度最快;向量化方法可以用于聚类分析,比如想看看所有生成题目分布在哪几个知识簇。实际运行中,200 条候选题去重后往往只剩 70~100 条,所以生成时要保持 3 倍的冗余。
4.3 参数调优:让 AI 生成一份“精选”而不是“题海”
精选不是把候选题目随机抽几条,而是像做检索式推荐一样,用算法挑出覆盖度最高的子集。我的策略是贪心覆盖:
- 预先定义 8 个知识点标签,如“两角相等”“边角边”“平行线比例”“中线交点”“面积比”“周长比”“折叠”“动点”。
- 每道生成题打 1~2 个标签(在生成函数里通过模板决定)。
- 按 5:3:2 的难度分层,先从每层挑覆盖标签最多的题目,再补足数量。
这样得到的结果在标签维度和难度维度上都不会扎堆。参数上需要注意scale的取法:如果固定为某个整数倍,比如 2,那么所有边长都是整数,但题与题之间相似度极高。我会用更自由的采样公式:
scale_candidates = [1.25, 1.5, 1.75, 2.0, 2.25, 2.5] scale = random.choice(scale_candidates)这些系数能很好地保留学生笔算的友好度,又避免所有题目都是一个比例。如果希望出现勾股数比例,还可以加入(3/4, 4/3)这类分数比,让边长在放大后不是整数,从而训练分数的约分能力。
易错点注入是精选的关键环节。常见易错点包括:把相似比当成面积比(面积比是相似比的平方);在判定时误用“两边成比例且一边对角相等”(必须是夹角);对应边找错。我通常在解答题里加入一条人工构造的陷阱题:给出两个三角形,其中两边对应成比例,但相等的角不是夹角,让学生判断是否相似。这类题不能由随机生成器直接产出,只能在模板层做硬编码。
def gen_trap_case(): """生成一个'两边成比例但相等角不是夹角'的陷阱题""" # 在△ABC中,AB=3,BC=4,∠B=60° # 在△DEF中,DE=6,EF=8,∠D=60° # 相等的角是∠B和∠D,但它们不是对应夹边所形成的同组角 return { "type": "trap", "description": "在△ABC中,AB=3,BC=4,∠B=60°;" "在△DEF中,DE=6,EF=8,∠D=60°。" "这两个三角形相似吗?请说明理由。" }这道题学生很容易直接套“两边成比例且夹角相等”却忽略对应关系。把这题混入解答题第 2~3 题的位置,比单独出十道计算题更有教学价值。
5. 验证与落地:打开 doc 之前先做这三件事
5.1 几何合法性检查
生成的题目必须满足三角形基本定理。在gen_sas_case内部已经做过一次余弦计算,但round之后可能出现不满足两边之和大于第三边的情况,所以要定期对最终答案集做一次断言:
def validate(cases): for c in cases: a, b, third = c["a"], c["b"], c["third"] assert a + b > third, f"不满足三角形: {c}" assert a + third > b and b + third > a, f"两边之差超界: {c}" print(f"校验通过:{len(cases)} 题全部合法")这个脚本放在生成步骤之后、写 Word 之前。别小看这一层,round后的浮点数在某些边界组合下会刚好踩到两边之和等于第三边的退化情况,最终导致一道题无解。
5.2 渲染验证:用 LibreOffice 无头转 PDF
docx 里文本直接可读,但分页符、页面边距、答案隔页这些版式问题,打开 Word 才能看到。更省事的办法是命令行转 PDF:
libreoffice --headless --convert-to pdf 相似三角形练习题【华师大版】精选.doc转换成功后用 PDF 阅读器扫一眼第三页和答案页,重点检查表格是否撑破页边距、标题是否被分割到两页。
5.3 统计答案分布
打开 doc 之前,我还会跑一段统计脚本,确认答案没有出现异常集中:
python -c "from docx import Document; d=Document('相似三角形练习题【华师大版】精选.doc'); print(sum(1 for p in d.paragraphs if '参考答案' in p.text))"如果输出大于 1,说明有多个“参考答案”标记,通常是因为题目区域和答案区域的结构没对齐。遇到这种情况,直接回到build_doc里检查add_page_break的调用位置即可。
5.4 用一个独立参数控制答案页
很多老师希望练习册带答案,有些希望答案另存。可以在build_doc里加一个with_answer布尔参数,默认为 True。当设为 False 时,直接跳过答案页的add_page_break和后续段落:
def build_doc(cases, output, with_answer=True): # ... 生成题目 ... if with_answer: doc.add_page_break() doc.add_heading("参考答案", level=2) # ... 写出答案 ... doc.save(output)这个参数看似简单,却能避免每次改需求都复制一份脚本。实际使用中我还会把with_answer和文件名关联,生成教师版和学生版两个文件,一条命令同时产出两份:精选.doc和精选-教师版.doc。至此,从随机数据到一份可打印的相似三角形练习题的完整链路已经打通。
本文还有配套的精品资源,点击获取