fix(exam): классификатор § — fallback при 0 совпадений + учёт opts_json; таксономия в репо

- classify(): bestScore стартует с 0 (нужно совпадение>0), иначе берётся явный fallback
  (последнее правило), а не первое. Чинит свал theory-statements→§15 и word-problems→проценты.
- optsText(): анализ текста вариантов ответа (формат пар [label, html]) — theory-statements
  размечаются по содержанию утверждений.
- alg-word-problems fallback → algebra-7-ch3 §16 (задачи уравнением), не проценты.
- Таксономия §: перенесена с gitignore-пути data/ на отслеживаемый
  backend/scripts/exam-textbook-sections.json + генератор gen-exam-textbook-sections.js.
- Результат: 784/800 (98%) размечено, спреды по подтемам корректны.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-03 16:29:40 +03:00
parent d05bb386a7
commit c9f3eed8ed
5 changed files with 2065 additions and 11 deletions
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,87 @@
#!/usr/bin/env node
/**
* gen-exam-textbook-sections.js
*
* Regenerates the §-section taxonomy of the grades 5-9 math-family textbooks,
* used by tag-exam-textbook.js (the exam→textbook classifier).
*
* Outputs:
* backend/scripts/exam-textbook-sections.json — machine-readable (the classifier reads this)
* plans/exam-textbook-links/taxonomy.md — human-readable reference
*
* Re-run whenever a grade 5-9 algebra/geometry/math chapter gains or renames a §.
* Note: math-5/6 are engine-rendered (math6_engine.js builds <section id="sec-<p.id>">
* from window.M6.paras) — their §s are NOT extracted statically here (emitted with
* engine:'math6' marker); the classifier links them at chapter level.
*
* Usage: node backend/scripts/gen-exam-textbook-sections.js
*/
'use strict';
const fs = require('fs');
const path = require('path');
const DIR = path.join(__dirname, '../../frontend/textbooks');
const OUT_MD = path.join(__dirname, '../../plans/exam-textbook-links/taxonomy.md');
const OUT_JSON = path.join(__dirname, 'exam-textbook-sections.json');
// chapter slug -> html file (from the textbooks table). Order = teaching order.
const CHAPTERS = [
['math-5-ch1', 'math_5_ch1.html'], ['math-5-ch2', 'math_5_ch2.html'], ['math-5-ch3', 'math_5_ch3.html'],
['math-6-ch1', 'math_6_ch1.html'], ['math-6-ch2', 'math_6_ch2.html'], ['math-6-ch3', 'math_6_ch3.html'],
['math-6-ch4', 'math_6_ch4.html'], ['math-6-ch5', 'math_6_ch5.html'], ['math-6-ch6', 'math_6_ch6.html'],
['algebra-7-ch1', 'algebra_7_ch1.html'], ['algebra-7-ch2', 'algebra_7_ch2.html'],
['algebra-7-ch3', 'algebra_7_ch3.html'], ['algebra-7-ch4', 'algebra_7_ch4.html'],
['geometry-7-ch1', 'geometry_7_ch1.html'], ['geometry-7-ch2', 'geometry_7_ch2.html'],
['geometry-7-ch3', 'geometry_7_ch3.html'], ['geometry-7-ch4', 'geometry_7_ch4.html'], ['geometry-7-ch5', 'geometry_7_ch5.html'],
['algebra-8-ch1', 'algebra_8.html'], ['algebra-8-ch2', 'algebra_8_ch2.html'], ['algebra-8-ch3', 'algebra_8_ch3.html'],
['geometry-8-ch1', 'geometry_8_ch1.html'], ['geometry-8-ch2', 'geometry_8_ch2.html'],
['geometry-8-ch3', 'geometry_8_ch3.html'], ['geometry-8-ch4', 'geometry_8_ch4.html'],
['algebra-9-ch1', 'algebra_9_ch1.html'], ['algebra-9-ch2', 'algebra_9_ch2.html'],
['algebra-9-ch3', 'algebra_9_ch3.html'], ['algebra-9-ch4', 'algebra_9_ch4.html'],
['geometry-9-ch1', 'geometry_9_ch1.html'], ['geometry-9-ch2', 'geometry_9_ch2.html'],
['geometry-9-ch3', 'geometry_9_ch3.html'], ['geometry-9-ch4', 'geometry_9_ch4.html'],
];
function strip(html) { return String(html).replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim(); }
const lines = ['# §-таксономия учебников 5–9 (математика) — эталон для классификатора экзамена math9', ''];
const json = []; // [{book, chapter_slug, subject, grade, para_id, num, title}]
let prevBook = '';
for (const [slug, file] of CHAPTERS) {
const book = slug.replace(/-ch\d+$/, '');
const subject = book.replace(/-\d+$/, ''); // math|algebra|geometry
const grade = Number((book.match(/-(\d+)$/) || [])[1]) || null;
if (book !== prevBook) { lines.push(`\n## ${book}`); prevBook = book; }
const p = path.join(DIR, file);
if (!fs.existsSync(p)) { lines.push(`### ${slug} (FILE MISSING: ${file})`); continue; }
const html = fs.readFileSync(p, 'utf8');
const tm = html.match(/<title>([^<]*)<\/title>/i);
lines.push(`### ${slug}${tm ? strip(tm[1]) : file}`);
const secRe = /<(?:section|div)\b[^>]*\sid="(sec-(?:p\d+|final\d*|[a-z0-9-]+))"[^>]*>/gi;
let m; const secs = [];
while ((m = secRe.exec(html)) !== null) secs.push({ id: m[1], start: m.index });
if (!secs.length) {
lines.push(` (движок math6: статических sec[id] нет; якоря строятся из window.M6.paras → id="sec-<p.id>")`);
json.push({ book, chapter_slug: slug, subject, grade, engine: 'math6', note: 'paras in window.M6 config; anchors sec-<p.id>' });
continue;
}
for (let i = 0; i < secs.length; i++) {
const seg = html.slice(secs[i].start, secs[i + 1] ? secs[i + 1].start : secs[i].start + 4000);
const numM = seg.match(/class="sec-num"[^>]*>([\s\S]*?)<\//i);
const hM = seg.match(/class="sec-h"[^>]*>([\s\S]*?)<\//i);
const paraId = secs[i].id.replace(/^sec-/, ''); // p10 | final3
const num = numM ? strip(numM[1]) : '';
const title = hM ? strip(hM[1]) : '';
lines.push(` ${secs[i].id.padEnd(12)} ${num ? '['+num+'] ' : ''}${title}`);
if (/^p\d+$/.test(paraId)) {
json.push({ book, chapter_slug: slug, subject, grade, para_id: paraId, num, title });
}
}
}
fs.mkdirSync(path.dirname(OUT_MD), { recursive: true });
fs.writeFileSync(OUT_MD, lines.join('\n'), 'utf8');
fs.writeFileSync(OUT_JSON, JSON.stringify(json, null, 2), 'utf8');
console.log('Wrote', OUT_MD);
console.log('Wrote', OUT_JSON, '(' + json.length + ' sections)');
+32 -11
View File
@@ -41,7 +41,8 @@ if (examIdx !== -1 && args[examIdx + 1]) {
}
/* ── Taxonomy ─────────────────────────────────────────────────── */
const taxonomy = require('./data/g9_textbook_sections.json');
/* Generated by gen-exam-textbook-sections.js (re-run when textbook §s change). */
const taxonomy = require('./exam-textbook-sections.json');
// Build lookup: book -> [ {chapter_slug, para_id, num, title} ]
// and flat: chapter_slug+para_id -> para number (integer)
@@ -349,8 +350,9 @@ const SUBTOPIC_RULES = {
// Scale/map → math-6-ch2
{ slug: 'math-6-ch2', paragraph: null,
kw: [/масштаб|карт[ае]\s+изображ/i] },
// fallback: percentages (most common in word problems)
{ slug: 'math-6-ch2', paragraph: null, kw: [] },
// fallback: solving text problems via an equation (most generic g9 home,
// far better than defaulting every word problem to "percents")
{ slug: 'algebra-7-ch3', paragraph: 16, kw: [] },
],
/* ── geom-triangles ──────────────────────────────────────── */
@@ -523,6 +525,24 @@ const SUBTOPIC_RULES = {
],
};
/* Extract plain text of answer options (opts_json) so keyword scoring can see
the actual statement contents — crucial for theory-statements, whose question
text is just "Какое из утверждений неверно" with the substance in the options. */
function optsText(task) {
if (!task.opts_json) return '';
try {
const o = JSON.parse(task.opts_json);
const arr = Array.isArray(o) ? o : (o && Array.isArray(o.options) ? o.options : []);
return arr.map(x => {
if (typeof x === 'string') return x;
// exam_tasks stores options as [label, html] pairs, e.g. ["а","$b^{-3}=...$"]
if (Array.isArray(x)) return x.map(String).join(' ');
if (x && typeof x === 'object') return x.html || x.text || x.label || '';
return '';
}).join(' ');
} catch { return ''; }
}
/* ── Classifier ───────────────────────────────────────────── */
function classify(task) {
const subtopic = task.subtopic;
@@ -531,9 +551,15 @@ function classify(task) {
const rules = SUBTOPIC_RULES[subtopic];
if (!rules || !rules.length) return { slug: null, para: null };
const txt = stripText(task.text_html);
const txt = stripText(task.text_html + ' ' + optsText(task));
let bestScore = -1;
// Require at least one keyword match (score > 0) to override the fallback.
// Starting bestScore at 0 (NOT -1) means: when NOTHING matches, the explicit
// fallback (last entry) wins — not the first rule. Critical for subtopics like
// theory-statements / alg-word-problems where the question text often carries
// no distinctive keyword (otherwise every unmatched task collapsed onto the
// first rule — §15 progressions / math-6 percents).
let bestScore = 0;
let bestRule = rules[rules.length - 1]; // last = fallback
for (const rule of rules) {
@@ -548,18 +574,13 @@ function classify(task) {
}
}
// If nothing matched (bestScore == -1 and bestRule is fallback), use first entry (primary)
if (bestScore < 0) {
bestRule = rules[rules.length - 1]; // explicit fallback
}
return { slug: bestRule.slug, para: bestRule.paragraph };
}
/* ── Main ─────────────────────────────────────────────────── */
function main() {
const tasks = db.prepare(`
SELECT id, variant, task_idx, task_type, subtopic, text_html
SELECT id, variant, task_idx, task_type, subtopic, text_html, opts_json
FROM exam_tasks
WHERE exam_key = ?
ORDER BY variant, task_idx
+138
View File
@@ -0,0 +1,138 @@
# План: точная привязка задач экзамена math9 к § учебников
> Составлен Opus 2026-06-03 по итогам discovery. Исполнитель — Sonnet, по фазам, с верификацией.
> Эталон §-таксономии: `plans/exam-textbook-links/taxonomy.md` (читаемая) и
> `backend/scripts/data/g9_textbook_sections.json` (машиночитаемая: {chapter_slug, subject, grade, para_id, num, title}).
## Контекст (проверено по коду/БД)
- `exam_tasks`: 800 задач `math9`, у ВСЕХ заполнен `subtopic` (16 подтем) и `topic`.
- Текущая связь — КОСВЕННАЯ и грубая: `exam_tasks.subtopic``exam_topics.slug` → один
`textbook_slug`+`textbook_paragraph` на всю подтему (миграция 028). Контроллер
`backend/src/routes/exam-prep.js` штампует `topic_ref` через `getTopicRefMap()`/`shapeTask()`.
Фронт `frontend/js/exam-prep/task-card.js:42` строит ссылку `/textbook/<slug>#sec-p<N>`.
- Покрытие сейчас: 546/800 → конкретный §, 158 → только хаб `algebra-9` (alg-numbers/arithmetic/
powers/polynomials/word-problems), 96 (theory-statements) → никуда.
- Экзамен 9 кл. проверяет программу 5–9, а интерактивный учебник 9 кл. — только материал 9 года.
Учебники 5–11 все есть (см. dump в discovery). Для math9 релевантны 5–9.
### Готчи нумерации § (ВАЖНО для классификатора и ссылок)
- **algebra-7, algebra-9, geometry-7, geometry-9** — СКВОЗНАЯ нумерация `sec-pN` по всему учебнику,
но каждый § физически лежит в своём файле-главе. Ключ ссылки = (slug-главы, pN).
- **geometry-8** — ПОГЛАВНАЯ нумерация (каждая глава заново `sec-p1`). Поэтому ОБЯЗАТЕЛЬНО
(slug-главы, pN-внутри-этого-файла). JSON-таксономия уже хранит правильную пару.
- **algebra-8** — сквозная (`sec-p1..p18` по 3 главам).
- **math-5 / math-6** — рендерятся движком `frontend/js/math6_engine.js`
(`<section id="sec-"+p.id>`, p.id из `window.M6.paras`). Статических `sec-pN` в файле нет.
Якорь = `sec-<p.id>`. Если нужно вести в math-5/6 — para_id брать из конфига M6 главы.
### КРИТИЧНО: deep-link сейчас НЕ РАБОТАЕТ
- Статические страницы algebra/geometry (`algebra_9_ch3.html` и т.п.) подключают только
katex/api.js/xp.js — **`textbook-tracker.js` там НЕ подключён**. Их `init()` всегда
вызывает `goTo('p10')` и `location.hash` ИГНОРИРУЕТ. Используют `.psel-card[data-id]`.
- `textbook-tracker.js` (есть на math-5/6) `handleHashNav()` матчит только `/^#(p\d+)$/`
(т.е. `#pN`, НЕ `#sec-pN`) и кликает `.para-pill[data-para]`.
- exam-prep строит `#sec-pN`. → ссылка ведёт на главу, но НЕ открывает нужный §.
- Сервер отдаёт `/textbook/:slug` обычным `sendFile` (инъекция только при `?embed=1`,
см. `backend/src/server.js:437`). Есть `_renderEmbed()` + `_embedCache`.
## Цель
Каждая из 800 задач math9 ведёт на наиболее подходящий § учебника 5–9, и клик реально открывает этот §.
---
## Фаза 1 — Починить навигацию deep-link (prerequisite; без неё связь невидима)
Централизованный хелпер, внедряемый СЕРВЕРОМ в HTML учебника для всех режимов `/textbook/:slug`.
- `backend/src/server.js`: обобщить выдачу — всегда читать файл и инжектить
`<script id="__ls_deeplink__">…</script>` перед `</head>` (или перед `</body>`), кэш по
(filePath, mode='plain'|'embed'). Сейчас в обычном режиме `sendFile` — заменить на read+inject+send
c теми же no-store заголовками. Embed-инъекция остаётся как есть, плюс этот же хелпер.
- Хелпер (vanilla, идемпотентный): на `DOMContentLoaded` (+ небольшой setTimeout, чтобы билдеры/
движок успели построить карточки) и на `hashchange`:
- распарсить `location.hash`: принять `#sec-pN` И `#pN` → нормализовать к `id = 'p'+N`;
- навигация по приоритету: `document.querySelector('.psel-card[data-id="'+id+'"]')?.click()`
→ иначе `.para-pill[data-para="'+id+'"]'`?.click() → иначе `window.goTo?.(id)`
иначе `getElementById('sec-'+id)?.scrollIntoView()`.
- не запускать дважды; не конфликтовать с textbook-tracker (тот матчит `#pN` — наш хелпер
дополнительно поддержит `#sec-pN`). Если на странице есть textbook-tracker и хэш в форме
`#pN`, можно отдать навигацию ему (наш хелпер сработает как фолбэк, клик идемпотентен).
- НЕ ломать embed-bridge (`ls_tb_nav`/`ls_tb_apply`). Хелпер ставить ПОСЛЕ страничных скриптов.
- Проверка: `/textbook/algebra-9-ch3#sec-p13` открывает §13 (метод интервалов), не §10;
`/textbook/geometry-8-ch2#sec-p4` открывает «Площадь треугольника».
## Фаза 2 — Схема: per-task anchor
- Миграция `backend/src/db/migrations/0NN_exam_task_textbook.sql`:
`ALTER TABLE exam_tasks ADD COLUMN textbook_slug TEXT;`
`ALTER TABLE exam_tasks ADD COLUMN textbook_paragraph INTEGER;`
(ADD COLUMN — без пересборки; runner оборачивает в транзакцию.)
- `npm run migrate` на живой БД.
## Фаза 3 — Эвристический классификатор (ядро)
`backend/scripts/tag-exam-textbook.js` (по образцу существующего `tag-exam-tasks.js`):
- Грузит `backend/scripts/data/g9_textbook_sections.json` (§-таксономия 7–9).
- Для каждой задачи math9: `stripText(text_html)` (как в tag-exam-tasks.js) + `subtopic`
выбрать (slug, para):
1. По `subtopic` → набор кандидатных глав/§ (карта ниже).
2. Внутри кандидатов — keyword-скоринг по тексту (ключевые слова из § titles + синонимы:
«дискриминант/Виета»→квадратные, «процент»→math-6 проценты, «синус/косинус/теорема»→geometry-9,
«прогресс/разность d/знаменатель q»→прогрессии §15/§17, «параллелограмм/ромб/трапеция»→geometry-8-ch1, …).
3. Фолбэк: primary § подтемы (если уверенного матча нет).
- Флаги: `--exam math9`, `--dry-run`, `--report` (распределение по §, сколько без §).
Идемпотентно перезаписывает `exam_tasks.textbook_slug/paragraph`.
### Карта subtopic → primary §/главы (исправляет ошибки 028)
- `alg-numbers` → math-6 (рацион. числа) / math-5 (натуральные) по тексту; иначе хаб `math-6`.
- `alg-arithmetic` → math-5/6.
- `alg-powers``algebra-7-ch1` §1 (натур.), §2 (целый показатель), §3 (станд. вид).
- `alg-expressions``algebra-7-ch2` §45 / `algebra-9-ch1` §5 (преобр. рацион.).
- `alg-polynomials``algebra-7-ch2` §8–14 (одночлены/многочлены/ФСУ/разложение).
- `alg-fractions``algebra-9-ch1` §1–5 (рацион. дроби) ИЛИ math-6 (обыкн. дроби) по тексту.
- `alg-equations` → линейные `algebra-7-ch3` §15; квадратные `algebra-8-ch2` §79;
дробно-рацион. `algebra-9-ch3` §10; системы `algebra-7-ch4` §23–24 — по тексту.
- `alg-inequalities``algebra-8-ch3` §13–18; метод интервалов `algebra-9-ch3` §13 / `algebra-8-ch3` §17.
- `alg-functions` → линейная `algebra-7-ch3` §19–20; свойства/графики `algebra-9-ch2` §69.
- `alg-progressions``algebra-9-ch4`: арифм. §15/§16, геом. §1719 (по «d»/«q»).
- `alg-word-problems` → по теме: проценты→`math-6-ch2`; уравнением→`algebra-7-ch3` §16;
системой→`algebra-7-ch4` §25; квадратным→`algebra-8-ch2` §11.
- `geom-triangles` → признаки `geometry-7-ch2`; Пифагор `geometry-8-ch2` §11; подобие `geometry-8-ch3`;
тригонометрия пр. треуг. `geometry-9-ch1` — по тексту.
- `geom-quadrilaterals``geometry-8-ch1` §4–16 (паралл./прямоуг./ромб/квадрат/трапеция);
вписанные/описанные `geometry-9-ch2` §9.
- `geom-circle``geometry-8-ch4` (вписанные углы и т.п.) / `geometry-9-ch2`.
- `geom-coordinates` → уравнение окружности `algebra-9-ch3` §12; координаты — geometry/algebra по тексту.
- `theory-statements` → распределить по теме утверждения (тот же скоринг); иначе оставить NULL
(фолбэк на subtopic-уровень, см. Фазу 5).
## Фаза 4 — Контроллер: предпочесть task-level
`backend/src/routes/exam-prep.js`:
- В SELECT задач (`getVariantTasks`, `practiceRandom/Unsolved`, `pickRandomByDifficulty`,
`topicTasks*`, `weakBatchTasks`, `getTasksByIds`) добавить `t.textbook_slug, t.textbook_paragraph`.
- `shapeTask()` и формирование `topic_ref` в `/variants/:n/tasks`: если у задачи есть
`textbook_slug``topic_ref = { title, slug: task.textbook_slug, paragraph: task.textbook_paragraph }`
(title — из таксономии § или из подтемы), иначе фолбэк на `refMap.get(subtopic)`.
- Title для task-level: можно прокинуть из классификатора в отдельную таблицу/JSON или
собрать map para→title из таксономии при старте (как `getTopicRefMap`).
## Фаза 5 — Улучшить subtopic-фолбэк (миграция данных)
- Новая миграция: переписать `exam_topics.textbook_slug/paragraph` корректно (исправить
`alg-equations`→дробно-рацион. только частный случай и т.п.), заполнить хаб-only разумным §.
Это фолбэк для задач, которым классификатор не дал task-level.
## Фаза 6 — Тесты + верификация
- `backend/tests/exam-textbook-links.test.js`: миграция применилась (колонки есть);
после классификатора ≥90% задач имеют `textbook_slug` (или явно объяснённый остаток);
`GET /:examKey/variants/:n/tasks` отдаёт `topic_ref` с `paragraph` для размеченных задач;
ссылка формата `/textbook/<slug>#sec-p<N>` для валидного slug из таблицы textbooks.
- Прогон `node tag-exam-textbook.js --report` — приложить распределение.
- `node --test tests/*.test.js` в рамках baseline (3 Auth + флака «intro» chemistry8).
- Перезапуск сервера (подхватить миграцию + новые SELECT-поля; `_topicRefCache` для фолбэка).
## Ограничения исполнителю (Sonnet)
- БД: встроенный `node:sqlite` (DatabaseSync), НЕ better-sqlite3.
- Большие файлы (server.js, exam-prep.js, HTML) — ТОЛЬКО точечный `Edit`, НЕ Write целиком.
- ⛔ Без эмоджи; иконки — только inline SVG `.ic`.
- Миграции — ADD COLUMN/UPDATE; НЕ пересобирать users/центральные таблицы.
- `fetch` origin перед работой (в master параллельно коммитят другие сессии); `git add` поимённо.
- Поиск: ast-index/Read, НЕ Grep tool. Каждый Edit верифицировать.
- Коммитить поэтапно осмысленными сообщениями + push (CLAUDE.md), трейлер
`Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>`.
+249
View File
@@ -0,0 +1,249 @@
# §-таксономия учебников 5–9 (математика) — эталон для классификатора экзамена math9
## math-5
### math-5-ch1 — Математика 5 · Глава 1 · Натуральные числа
(движок math6: статических sec[id] нет; якоря строятся из window.M6.paras → id="sec-<p.id>")
### math-5-ch2 — Математика 5 · Глава 2 · Выражения. Уравнения
(движок math6: статических sec[id] нет; якоря строятся из window.M6.paras → id="sec-<p.id>")
### math-5-ch3 — Математика 5 · Глава 3 · Обыкновенные дроби
(движок math6: статических sec[id] нет; якоря строятся из window.M6.paras → id="sec-<p.id>")
## math-6
### math-6-ch1 — Математика 6 · Глава 1 · Десятичные дроби
(движок math6: статических sec[id] нет; якоря строятся из window.M6.paras → id="sec-<p.id>")
### math-6-ch2 — Математика 6 · Глава 2 · Проценты и пропорции
(движок math6: статических sec[id] нет; якоря строятся из window.M6.paras → id="sec-<p.id>")
### math-6-ch3 — Математика 6 · Глава 3 · Множество
(движок math6: статических sec[id] нет; якоря строятся из window.M6.paras → id="sec-<p.id>")
### math-6-ch4 — Математика 6 · Глава 4 · Рациональные числа
(движок math6: статических sec[id] нет; якоря строятся из window.M6.paras → id="sec-<p.id>")
### math-6-ch5 — Математика 6 · Глава 5 · Координатная плоскость
(движок math6: статических sec[id] нет; якоря строятся из window.M6.paras → id="sec-<p.id>")
### math-6-ch6 — Математика 6 · Глава 6 · Наглядная геометрия
(движок math6: статических sec[id] нет; якоря строятся из window.M6.paras → id="sec-<p.id>")
## algebra-7
### algebra-7-ch1 — Алгебра 7 · Глава 1 · Степени
sec-p1 [§ 1] Степень с натуральным показателем и её свойства
sec-p2 [§ 2] Степень с целым показателем и её свойства
sec-p3 [§ 3] Стандартный вид числа
sec-final1 [Финал главы] Итоги. Боссы главы 1
### algebra-7-ch2 — Алгебра 7 · Глава 2 · Выражения и преобразования
sec-p4 [§ 4] Числовые выражения и выражения с переменными
sec-p5 [§ 5] Тождество. Тождественные преобразования
sec-p6 [§ 6] Одночлен. Стандартный вид. Степень
sec-p7 [§ 7] Действия с одночленами
sec-p8 [§ 8] Многочлен. Стандартный вид. Степень
sec-p9 [§ 9] Сложение и вычитание многочленов
sec-p10 [§ 10] Умножение и деление многочлена на одночлен
sec-p11 [§ 11] Умножение многочленов
sec-p12 [§ 12] Квадрат суммы и квадрат разности
sec-p13 [§ 13] Разность квадратов: (ab)(a+b) = a\xB2b\xB2
sec-p14 [§ 14] Разложение многочлена на множители
sec-final2 [Финал главы] Итоги. 6 боссов главы 2
### algebra-7-ch3 — Алгебра 7 · Глава 3 · Уравнения, неравенства, функция
sec-p15 [§ 15] Линейные уравнения с одной переменной
sec-p16 [§ 16] Решение текстовых задач с помощью уравнений
sec-p17 [§ 17] Числовые неравенства и их свойства
sec-p18 [§ 18] Линейные неравенства с одной переменной
sec-p19 [§ 19] Функция
sec-p20 [§ 20] Линейная функция и её свойства
sec-final3 [Финал главы] Итоги. 5 боссов главы 3
### algebra-7-ch4 — Алгебра 7 · Глава 4 · Системы линейных уравнений
sec-p21 [§ 21] Линейное уравнение с двумя переменными
sec-p22 [§ 22] График линейного уравнения $ax + by = c$
sec-p23 [§ 23] Система линейных уравнений с двумя переменными
sec-p24 [§ 24] Способы решения системы (подстановка, сложение)
sec-p25 [§ 25] Решение текстовых задач с помощью системы
sec-final4 [Финал главы] Итоги. 5 боссов главы 4
## geometry-7
### geometry-7-ch1 — Геометрия 7 · Глава 1 · Начальные понятия
sec-p1 [§ 1] Повторение материала 5-6 классов
sec-p2 [§ 2] Предмет геометрии
sec-p3 [§ 3] Прямая. Луч. Отрезок. Ломаная
sec-p4 [§ 4] Окружность и круг
sec-p5 [§ 5] Угол. Виды углов
sec-p6 [§ 6] Смежные углы. Вертикальные углы
sec-p7 [§ 7] Перпендикулярные прямые
sec-final1 [Финал главы] Итоги. 5 боссов главы 1
### geometry-7-ch2 — Геометрия 7 · Глава 2 · Признаки равенства треугольников
sec-p8 [§ 8] Треугольники
sec-p9 [§ 9] Первый и второй признаки равенства
sec-p10 [§ 10] Высота, медиана и биссектриса треугольника
sec-p11 [§ 11] Равнобедренный треугольник
sec-p12 [§ 12] Признаки равнобедренного треугольника
sec-p13 [§ 13] Третий признак равенства треугольников
sec-p14 [§ 14] Серединный перпендикуляр к отрезку
sec-final2 [Финал главы] Итоги. 6 боссов главы 2
### geometry-7-ch3 — Геометрия 7 · Глава 3 · Параллельность прямых
sec-p15 [§ 15] Признаки параллельности прямых
sec-p16 [§ 16] Аксиома параллельных прямых
sec-p17 [§ 17] Свойства параллельных прямых
sec-p18 [§ 18] Углы со сторонами, соответственно параллельными или перпендикулярными
sec-final3 [Финал главы] Итоги. 5 боссов главы 3
### geometry-7-ch4 — Геометрия 7 · Глава 4 · Сумма углов треугольника
sec-p19 [§ 19] Сумма углов треугольника
sec-p20 [§ 20] Внешний угол треугольника
sec-p21 [§ 21] Соотношения между сторонами и углами
sec-p22 [§ 22] Неравенство треугольника
sec-p23 [§ 23] Прямоугольные треугольники
sec-p24 [§ 24] Признаки равенства прямоугольных треугольников
sec-p25 [§ 25] Биссектриса угла как ГМТ
sec-p26 [§ 26] Свойство катета против угла 30°
sec-final4 [Финал главы] Итоги. 5 боссов главы 4
### geometry-7-ch5 — Геометрия 7 · Глава 5 · Задачи на построение
sec-p27 [§ 27] Простейшие построения
sec-p28 [§ 28] Построение треугольника по 3 сторонам
sec-p29 [§ 29] Построение биссектрисы угла
sec-p30 [§ 30] Середина и перпендикуляр
sec-p31 [§ 31] Метод геометрических мест точек
sec-final5 [Финал главы] Итоги. 5 боссов главы 5
## algebra-8
### algebra-8-ch1 — Алгебра 8 — Глава 1 · Квадратные корни и действительные числа
sec-p1 [§ 1] Квадратный корень из числа. Арифметический квадратный корень
sec-p2 [§ 2] Множество иррациональных чисел. Множество действительных чисел
sec-p3 [§ 3] Свойства квадратных корней
sec-p4 [§ 4] Применение свойств квадратных корней
sec-p5 [§ 5] Числовые промежутки. Объединение и пересечение
sec-p6 [§ 6] Системы и совокупности линейных неравенств. Двойные неравенства
sec-final [Финал главы] Итоги. Практическая и увлекательная математика
### algebra-8-ch2 — Алгебра 8 · Глава 2 · Квадратные уравнения
sec-p7 [§ 7] Квадратные уравнения. Решение неполных квадратных уравнений
sec-p8 [§ 8] Формулы корней квадратного уравнения
sec-p9 [§ 9] Теорема Виета
sec-p10 [§ 10] Квадратный трёхчлен. Разложение на множители
sec-p11 [§ 11] Решение текстовых задач с помощью квадратных уравнений
sec-p12 [§ 12] Целые рациональные уравнения, сводящиеся к квадратным
sec-final2 [Финал главы] Итоги. Практическая и увлекательная математика
### algebra-8-ch3 — Алгебра 8 · Глава 3 · Неравенства
sec-p13 [§ 13] Числовые неравенства и их свойства
sec-p14 [§ 14] Сложение и умножение числовых неравенств. Оценка значений
sec-p15 [§ 15] Числовые промежутки. Линейные неравенства
sec-p16 [§ 16] Системы и совокупности линейных неравенств
sec-p17 [§ 17] Квадратные неравенства. Метод интервалов
sec-p18 [§ 18] Дробно-рациональные неравенства
sec-final3 [Финал главы] Итоги. Практическая и увлекательная математика
## geometry-8
### geometry-8-ch1 — Геометрия 8 · Глава 1 · Многоугольники
sec-p1 [§ 1] Выпуклые многоугольники. Диагональ. Периметр
sec-p2 [§ 2] Сумма углов выпуклого многоугольника
sec-p3 [§ 3] Сумма внешних углов выпуклого многоугольника
sec-p4 [§ 4] Параллелограмм
sec-p5 [§ 5] Свойства параллелограмма
sec-p6 [§ 6] Признаки параллелограмма
sec-p7 [§ 7] Прямоугольник. Свойство диагоналей
sec-p8 [§ 8] Признак прямоугольника
sec-p9 [§ 9] Ромб. Свойство диагоналей ромба. Признаки ромба
sec-p10 [§ 10] Квадрат. Свойства квадрата
sec-p11 [§ 11] Теорема Фалеса. Деление отрезка на равные части
sec-p12 [§ 12] Свойство медиан треугольника
sec-p13 [§ 13] Свойство средней линии треугольника
sec-p14 [§ 14] Трапеция. Свойство средней линии
sec-p15 [§ 15] Свойство углов и диагоналей равнобедренной трапеции
sec-p16 [§ 16] Признаки равнобедренной трапеции
sec-final1 [Финал главы] Итоги. Боссы главы 1
### geometry-8-ch2 — Геометрия 8 · Глава 2 · Площади
sec-p1 [§ 1] Площадь квадрата
sec-p2 [§ 2] Площадь прямоугольника
sec-p3 [§ 3] Площадь параллелограмма
sec-p4 [§ 4] Площадь треугольника
sec-p5 [§ 5] Площадь трапеции
sec-p6 [§ 6] Площадь ромба
sec-p7 [§ 7] Площадь прямоугольного треугольника
sec-p8 [§ 8] Высота, проведённая к гипотенузе
sec-p9 [§ 9] Треугольники с общей высотой
sec-p10 [§ 10] Свойства медианы для площадей
sec-p11 [§ 11] Теорема Пифагора
sec-p12 [§ 12] S и h равностороннего треугольника
sec-p13 [§ 13] Диагональ квадрата
sec-p14 [§ 14] Обратная теорема Пифагора
sec-p15 [§ 15] Пифагоровы тройки
sec-final2 [Финал главы] Итоги. Боссы главы 2
### geometry-8-ch3 — Геометрия 8 · Глава 3 · Подобные треугольники
sec-p1 [§ 1] Теорема Фалеса (обобщённая)
sec-p2 [§ 2] Деление отрезка в отношении m : n
sec-p3 [§ 3] Определение подобных треугольников
sec-p4 [§ 4] Свойство прямой, параллельной стороне треугольника
sec-p5 [§ 5] Первый признак подобия. Следствие
sec-p6 [§ 6] Второй признак подобия
sec-p7 [§ 7] Третий признак подобия
sec-p8 [§ 8] Свойство биссектрисы треугольника
sec-p9 [§ 9] Отношение площадей подобных треугольников
sec-final3 [Финал главы] Итоги. Боссы главы 3
### geometry-8-ch4 — Геометрия 8 · Глава 4 · Окружности
sec-p1 [§ 1] Касательная. Признак касательной
sec-p2 [§ 2] Свойство касательной
sec-p3 [§ 3] Свойство касательных из одной точки
sec-p4 [§ 4] Построение касательной
sec-p5 [§ 5] Свойство окружностей, вписанных в угол
sec-p6 [§ 6] Взаимное расположение окружностей
sec-p7 [§ 7] Длина общей внешней касательной
sec-p8 [§ 8] Центральный угол. Градусная мера дуги. Вписанный угол
sec-p9 [§ 9] Свойство вписанного угла
sec-p10 [§ 10] Вписанные углы, опирающиеся на одну дугу
sec-p11 [§ 11] Вписанный угол, опирающийся на диаметр
sec-p12 [§ 12] Угол между касательной и хордой
sec-p13 [§ 13] Угол между хордами
sec-p14 [§ 14] Угол между секущими
sec-p15 [§ 15] Свойство пересекающихся хорд
sec-p16 [§ 16] Свойство касательной и секущей
sec-final4 [Финал главы] Итоги. Боссы главы 4
## algebra-9
### algebra-9-ch1 — Алгебра 9 · Глава 1 · Рациональные выражения
sec-p1 [§ 1] Рациональная дробь
sec-p2 [§ 2] Основное свойство дроби
sec-p3 [§ 3] Сложение и вычитание
sec-p4 [§ 4] Умножение и деление
sec-p5 [§ 5] Преобразование выражений
sec-final1 [Финал главы] Итоги. 5 боссов главы 1
### algebra-9-ch2 — Алгебра 9 · Глава 2 · Функции
sec-p6 [§ 6] Функция числового аргумента
sec-p7 [§ 7] Свойства функции
sec-p8 [§ 8] Чётные и нечётные функции
sec-p9 [§ 9] Сдвиги графиков
sec-final2 [Финал главы] Итоги. 5 боссов главы 2
### algebra-9-ch3 — Алгебра 9 · Глава 3 · Дробно-рациональные уравнения и неравенства
sec-p10 [§ 10] Дробно-рациональные уравнения
sec-p11 [§ 11] Системы нелинейных уравнений
sec-p12 [§ 12] Уравнение окружности
sec-p13 [§ 13] Метод интервалов
sec-final3 [Финал главы] Итоги. 4 боссов главы 3
### algebra-9-ch4 — Алгебра 9 · Глава 4 · Прогрессии
sec-p14 [§ 14] Числовая последовательность
sec-p15 [§ 15] Арифметическая прогрессия
sec-p16 [§ 16] Сумма арифм. прогрессии
sec-p17 [§ 17] Геометрическая прогрессия
sec-p18 [§ 18] Сумма геом. прогрессии
sec-p19 [§ 19] Бесконечно убывающая
sec-final4 [Финал главы] Итоги. 6 боссов главы 4
## geometry-9
### geometry-9-ch1 — Геометрия 9 · Глава 1 · Соотношения в прямоугольном треугольнике
sec-p1 [§ 1] sin, cos, tg, ctg острого угла
sec-p2 [§ 2] Решение прямоугольного треугольника
sec-p3 [§ 3] Тригонометрические формулы
sec-p4 [§ 4] sin, cos, tg, ctg тупого угла
sec-p5 [§ 5] Формулы площади
sec-p6 [§ 6] Среднее геометрическое
sec-final1 [Финал главы] Итоги главы 1
### geometry-9-ch2 — Геометрия 9 · Глава 2 · Окружности
sec-p7 [§ 7] Описанная и вписанная окружности треугольника
sec-p8 [§ 8] Окружности прямоугольного треугольника
sec-p9 [§ 9] Вписанные и описанные четырёхугольники
sec-final2 [★] Итоги главы 2
### geometry-9-ch3 — Геометрия 9 · Глава 3 · Теоремы синусов и косинусов
sec-p10 [§ 10] Теорема синусов
sec-p11 [§ 11] Теорема косинусов
sec-p12 [§ 12] Формула Герона. Решение треугольников
sec-final3 [★] Итоги главы 3
### geometry-9-ch4 — Геометрия 9 · Глава 4 · Правильные многоугольники
sec-p13 [§ 13] Правильные многоугольники
sec-p14 [§ 14] Формулы радиусов
sec-p15 [§ 15] Треугольник, квадрат, шестиугольник
sec-p16 [§ 16] Длина окружности и площадь круга
sec-final4 [★] Итоги главы 4