feat: exam9 — Экзамен 9 класс по математике (80 вариантов)

Новый отдельный модуль /exam9 в стиле LearnSpace:
- 80 вариантов × 10 заданий = 800 задач с разбором (KaTeX + SVG)
- Сайдбар: пункт «Экзамен 9 класс» (clipboard-check)
- Feature flag: feature_exam9_enabled (мигр. 002)
- Видим всем авторизованным; рендер на стороне клиента
- Прогресс в localStorage: подсветка вариантов (done/partial)
- Возобновление последнего варианта при возврате

Структура:
  frontend/exam9.html              — страница (LearnSpace layout)
  frontend/js/exam9/app.js         — рендерер
  frontend/js/exam9/variants/      — 80 файлов с данными
  frontend/img/exam9/              — 22 PNG/JPG фигур заданий

Картинки путей _tmp/ → /img/exam9/ переписаны автоматически.

Все маршруты проверены: 200 OK на /exam9, /js/exam9/*, /img/exam9/*.
This commit is contained in:
Maxim Dolgolyov
2026-05-16 12:53:49 +03:00
parent ae31e4c4e8
commit 6cff327e88
107 changed files with 16507 additions and 0 deletions
+176
View File
@@ -0,0 +1,176 @@
VARIANTS[30] = {
label: "Вариант 30",
tasks: [
{
text: `Какой из промежутков является решением неравенства $-2x \\geq 1$:`,
opts: [
["а", "$(2;\\; {+\\infty})$"], ["б", "$(-2;\\; {+\\infty})$"], ["в", "$(-\\infty;\\; 0{,}5]$"],
["г", "$(-\\infty;\\; {-0{,}5}]$"], ["д", "$(-\\infty;\\; {-0{,}5})$"],
],
sol: `Делим обе части на $-2$ (знак неравенства меняется):
$$-2x \\geq 1 \\implies x \\leq -\\dfrac{1}{2} = -0{,}5$$
<svg viewBox="0 0 245 52" xmlns="http://www.w3.org/2000/svg" style="max-width:245px;width:100%;height:auto;display:block;margin:6px 0">
<defs><marker id="v30t1r" viewBox="0 0 7 6" refX="7" refY="3" markerWidth="5" markerHeight="5" orient="auto"><path d="M0,0.5 L7,3 L0,5.5Z" fill="#555"/></marker></defs>
<line x1="8" y1="26" x2="237" y2="26" stroke="#bbb" stroke-width="1.2" marker-end="url(#v30t1r)"/>
<line x1="130" y1="22" x2="130" y2="30" stroke="#777" stroke-width="1"/><text x="130" y="43" font-size="10" text-anchor="middle" fill="#555">0</text>
<line x1="90" y1="22" x2="90" y2="30" stroke="#777" stroke-width="1"/><text x="90" y="43" font-size="10" text-anchor="middle" fill="#555">0,5</text>
<line x1="8" y1="26" x2="90" y2="26" stroke="#2563eb" stroke-width="4" stroke-linecap="round" opacity="0.5"/>
<circle cx="90" cy="26" r="5" fill="#2563eb"/>
<text x="8" y="16" font-size="9" fill="#2563eb">$x \\leq -0{,}5$</text>
</svg>
<div class="sol-ans">Ответ: г)&ensp;$(-\\infty;\\;{-0{,}5}]$</div>`
},
{
text: `Значение выражения $\\dfrac{1{,}6 \\cdot 0{,}6}{-0{,}6}$ равно:`,
opts: [
["а", "$1{,}6$"], ["б", "$-1{,}6$"], ["в", "$-0{,}6$"],
["г", "$-0{,}18$"], ["д", "$-0{,}90$"],
],
sol: `$$\\dfrac{1{,}6\\cdot0{,}6}{-0{,}6} = \\dfrac{0{,}96}{-0{,}6} = -1{,}6$$
или короче: сокращаем $0{,}6$: $\\dfrac{1{,}6\\cdot\\cancel{0{,}6}}{-\\cancel{0{,}6}} = -1{,}6$.
<div class="sol-ans">Ответ: б)&ensp;$-1{,}6$</div>`
},
{
text: `Какое из следующих утверждений <b>НЕ</b> верно:`,
opts: [
["а", "у любого параллелограмма диагонали равны;"],
["б", "сумма внутренних углов треугольника равна $180^{\\circ}$;"],
["в", "если квадрат некоторой стороны треугольника равен сумме квадратов двух других его сторон, то этот треугольник — прямоугольный;"],
["г", "вписанный угол окружности, опирающийся на диаметр, равен $90^{\\circ}$?"],
],
sol: `<ul>
<li>а) «У любого параллелограмма диагонали равны» — <b style="color:#dc2626">НЕВЕРНО</b>. Диагонали равны только у <em>прямоугольника</em>. В произвольном параллелограмме они, как правило, неравны.</li>
<li>б) Сумма углов треугольника равна $180°$ — <b>верно</b></li>
<li>в) Обратная теорема Пифагора — <b>верно</b></li>
<li>г) Вписанный угол, опирающийся на диаметр, равен $90°$ — <b>верно</b></li>
</ul>
<div class="sol-ans">Ответ: а)</div>`
},
{
text: `Приведите подобные слагаемые $5xy - 6xy + 9x + xy - 10x$.`,
sol: `Группируем слагаемые с $xy$ и с $x$:
$$(5xy - 6xy + xy) + (9x - 10x) = 0 + (-x) = -x$$
<div class="sol-ans">Ответ: $-x$</div>`
},
{
text: `Найдите периметр ромба, диагонали которого равны $24$ см и $10$ см.`,
sol: `<b>Свойство диагоналей ромба:</b> диагонали ромба перпендикулярны и точкой пересечения делятся пополам.
<br><b>Теорема Пифагора:</b> в прямоугольном треугольнике $c^2 = a^2+b^2$.
<br><b>Формула периметра ромба:</b> $P = 4a$, где $a$ — сторона.
<br><b>Шаг 1.</b> Диагонали ромба делятся точкой пересечения пополам и перпендикулярны. Половины диагоналей: $\\dfrac{24}{2}=12$ см и $\\dfrac{10}{2}=5$ см.
<svg viewBox="0 0 240 140" xmlns="http://www.w3.org/2000/svg" style="max-width:240px;width:100%;height:auto;display:block;margin:8px 0">
<polygon points="24,70 120,22 216,70 120,118" fill="rgba(37,99,235,0.07)" stroke="#334155" stroke-width="1.8"/>
<line x1="24" y1="70" x2="216" y2="70" stroke="#94a3b8" stroke-width="1.2" stroke-dasharray="4,3"/>
<line x1="120" y1="22" x2="120" y2="118" stroke="#94a3b8" stroke-width="1.2" stroke-dasharray="4,3"/>
<polygon points="120,70 128,70 128,62 120,62" fill="none" stroke="#334155" stroke-width="1.2"/>
<circle cx="120" cy="70" r="2.5" fill="#334155"/>
<text x="6" y="76" font-size="13" font-family="serif" font-style="italic">A</text>
<text x="122" y="16" font-size="13" font-family="serif" font-style="italic">B</text>
<text x="220" y="76" font-size="13" font-family="serif" font-style="italic">C</text>
<text x="122" y="132" font-size="13" font-family="serif" font-style="italic">D</text>
<text x="123" y="67" font-size="11" font-family="serif" font-style="italic">O</text>
<text x="65" y="65" font-size="11" fill="#475569">12</text>
<text x="170" y="65" font-size="11" fill="#475569">12</text>
<text x="124" y="50" font-size="11" fill="#475569">5</text>
<text x="124" y="94" font-size="11" fill="#475569">5</text>
<text x="50" y="36" font-size="12" fill="#1d4ed8" font-style="italic">a</text>
<text x="0" y="92" font-size="9" fill="#475569">24 см</text>
<text x="190" y="42" font-size="9" fill="#475569">10 см</text>
</svg>
<b>Шаг 2.</b> Половины диагоналей — катеты прямоугольного треугольника, в котором сторона ромба $a$ — гипотенуза. По теореме Пифагора:
$$a = \\sqrt{12^2 + 5^2} = \\sqrt{144+25} = \\sqrt{169} = 13\\text{ см}$$
<b>Шаг 3.</b> Применяем формулу периметра:
$$P = 4a = 4\\cdot 13 = 52\\text{ см}$$
<div class="sol-ans">Ответ: $52$ см</div>`
},
{
text: `Сократите дробь $\\dfrac{a^2-25}{a+5}$ и найдите значение полученного выражения при $a = -3$.`,
sol: `<b>Формула разности квадратов:</b> $a^2 - b^2 = (a-b)(a+b)$.
<br><b>Шаг 1.</b> Числитель раскладываем по формуле разности квадратов ($25 = 5^2$):
$$a^2-25 = a^2-5^2 = (a-5)(a+5)$$
<b>Шаг 2.</b> Сокращаем общий множитель $(a+5)$ (при условии $a\\neq -5$):
$$\\dfrac{(a-5)(a+5)}{a+5} = a-5$$
<b>Шаг 3.</b> Подставляем $a = -3$:
$$a-5 = -3-5 = -8$$
<div class="sol-ans">Ответ: $a-5$;&ensp; при $a=-3$ значение равно $-8$</div>`
},
{
text: `В соревнованиях по мини-футболу каждая команда сыграла с каждой по одному разу.
Оказалось, что сыграно всего $30$ игр.
Сколько команд участвовало в соревнованиях?`,
sol: `<b>Метод введения переменной:</b> неизвестное количество команд обозначим за $n$ и составим уравнение по подсчёту числа игр.
<br><b>Шаг 1.</b> Пусть в соревнованиях участвовало $n$ команд. Каждая из них провела ровно по $n-1$ игр (со всеми остальными командами).
<br><b>Шаг 2.</b> Подсчитаем сумму игр всех команд: $n\\cdot(n-1)$. По условию задачи это число равно $30$:
$$n(n-1) = 30.$$
<b>Шаг 3.</b> Раскроем и получим квадратное уравнение:
$$n^2 - n - 30 = 0.$$
<b>Шаг 4.</b> Решаем через дискриминант:
$$D = (-1)^2 + 4\\cdot 30 = 1+120 = 121 = 11^2;$$
$$n = \\dfrac{1+11}{2} = 6\\;\\;\\text{(отрицательный корень не подходит, так как $n$ — натуральное число)}.$$
<b>Шаг 5. Проверка:</b> $6\\cdot 5 = 30$ — совпадает с условием.
<div class="sol-ans">Ответ: $6$ команд</div>`
},
{
text: `Найдите $\\text{НОД}(158;\\; 237;\\; 790)$ и определите, какому множеству он принадлежит:
а) составных чисел; б) простых чисел.`,
sol: `<b>Правило нахождения НОД:</b> наибольший общий делитель — это произведение общих простых множителей чисел, взятых в наименьших степенях. <b>Простое число:</b> натуральное число, имеющее ровно два делителя — $1$ и само число.
<br><b>Шаг 1.</b> Разложим каждое число на простые множители:
$$158 = 2\\cdot 79;$$
$$237 = 3\\cdot 79;$$
$$790 = 2\\cdot 5\\cdot 79.$$
<b>Шаг 2.</b> Найдём общие простые множители. В первом числе нет $3$ и $5$, во втором — нет $2$ и $5$. Значит, общим для всех трёх чисел является только множитель $79$:
$$\\text{НОД}(158;\\,237;\\,790) = 79.$$
<b>Шаг 3.</b> Определим вид числа $79$. Перебором делителей: $79$ не делится на $2,\\,3,\\,5,\\,7$, а $\\sqrt{79}\\lt 9$. Значит, $79$ делится только на $1$ и на $79$ — это простое число.
<div class="sol-ans">Ответ: НОД $= 79$, принадлежит множеству <b>простых чисел</b> (ответ б)</div>`
},
{
text: `В арифметической прогрессии сумма четырёх первых членов равна $80$.
Чему равна сумма шести первых членов этой прогрессии,
если её первый член равен разности прогрессии?`,
sol: `<b>Формула $n$-го члена арифметической прогрессии:</b> $a_n = a_1 + (n-1)d$.
<br><b>Шаг 1.</b> По условию $a_1 = d$. Тогда члены прогрессии:
<br>$a_1=d$,&ensp;$a_2=2d$,&ensp;$a_3=3d$,&ensp;$a_4=4d$,&ensp;$a_5=5d$,&ensp;$a_6=6d$.
<br><b>Шаг 2.</b> Сумма четырёх первых членов:
$$S_4 = d+2d+3d+4d = 10d$$
По условию $S_4 = 80$, значит $10d = 80$, откуда $d = 8$.
<br><b>Шаг 3.</b> Сумма шести первых членов:
$$S_6 = d+2d+3d+4d+5d+6d = 21d = 21\\cdot 8 = 168$$
<div class="sol-ans">Ответ: $S_6=168$</div>`
},
{
text: `Даны треугольник $ABC$ и окружность, которая проходит через вершины $A$ и $B$
и пересекает стороны $AC$ и $BC$ соответственно в точках $N$ и $M$,
где $AN = 13$ см, $BM = 8$ см, $MC = 4$ см.
Найдите площадь треугольника $ABC$, если $\\cos C = \\dfrac{\\sqrt{11}}{6}$.`,
sol: `<svg viewBox="0 0 215 175" xmlns="http://www.w3.org/2000/svg" style="max-width:240px;width:100%;height:auto;display:block;margin:8px 0">
<circle cx="102" cy="110" r="58" fill="rgba(37,99,235,0.06)" stroke="#2563eb" stroke-width="1.3" stroke-dasharray="5,3"/>
<polygon points="110,20 46,122 158,96" fill="rgba(22,163,74,0.06)" stroke="#334155" stroke-width="1.8"/>
<circle cx="91" cy="51" r="3.5" fill="#dc2626"/>
<circle cx="135" cy="61" r="3.5" fill="#dc2626"/>
<text x="112" y="15" font-size="13" font-family="serif" font-style="italic">C</text>
<text x="30" y="132" font-size="13" font-family="serif" font-style="italic">A</text>
<text x="161" y="106" font-size="13" font-family="serif" font-style="italic">B</text>
<text x="75" y="47" font-size="12" font-family="serif" font-style="italic" fill="#dc2626">N</text>
<text x="138" y="57" font-size="12" font-family="serif" font-style="italic" fill="#dc2626">M</text>
<text x="113" y="37" font-size="10" fill="#475569">CN=?</text>
<text x="48" y="82" font-size="10" fill="#475569">AN=13</text>
<text x="132" y="38" font-size="10" fill="#475569">CM=4</text>
<text x="154" y="78" font-size="10" fill="#475569">MB=8</text>
</svg>
<b>Теорема о двух секущих:</b> если из внешней точки проведены две секущие, то произведения «целая секущая на её внешнюю часть» равны: $CM\\cdot CB = CN\\cdot CA$.
<br><b>Основное тригонометрическое тождество:</b> $\\sin^2 C + \\cos^2 C = 1$.
<br><b>Формула площади треугольника через две стороны и угол между ними:</b> $S = \\dfrac{1}{2}ab\\sin C$.
<br><b>Шаг 1.</b> Точка $C$ — внешняя для окружности. Через неё проходят две секущие: $CMB$ и $CNA$, причём $CB = CM+MB = 4+8 = 12$ см. Обозначим $CN = x$, тогда $CA = x+13$ см.
<br><b>Шаг 2.</b> По теореме о двух секущих:
$$CM\\cdot CB = CN\\cdot CA$$
$$4\\cdot 12 = x(x+13)$$
$$x^2 + 13x - 48 = 0$$
По теореме Виета или через дискриминант: $D = 169 + 192 = 361 = 19^2$, $x = \\dfrac{-13+19}{2} = 3$ (берём положительный корень). Значит $CN = 3$, $CA = 16$ см.
<br><b>Шаг 3.</b> Находим $\\sin C$ по основному тригонометрическому тождеству:
$$\\sin C = \\sqrt{1-\\cos^2 C} = \\sqrt{1-\\dfrac{11}{36}} = \\sqrt{\\dfrac{25}{36}} = \\dfrac{5}{6}$$
<b>Шаг 4.</b> Площадь треугольника $ABC$ по формуле через две стороны и угол $C$ (это угол между сторонами $CA$ и $CB$):
$$S = \\dfrac{1}{2}\\cdot CA\\cdot CB\\cdot\\sin C = \\dfrac{1}{2}\\cdot 16\\cdot 12\\cdot\\dfrac{5}{6} = 80\\text{ см}^2$$
<div class="sol-ans">Ответ: $80$ см²</div>`
},
]
};