Files
Learn_System/frontend/textbooks/math_6_ch1.html
T
Maxim Dolgolyov 85c516e811 feat(math6): обогащение всех глав — хук, разбор по шагам, факты в каждом §
Каждый содержательный параграф 6 глав дополнен (Sonnet, по главе):
- карточка «Где это в жизни» (реальный контекст темы);
- «Разбор по шагам» (нумерованный алгоритм решения);
- «А знаешь ли ты?» (интересный факт/история);
- доведено до ≥2 рабочих интерактивов (где было меньше — добавлены).
Движок/общие файлы не трогались; структура M6/порядок init сохранены.
Проверено: тесты math6 18/18, честный рендер 4 глав — контент появляется,
рантайм-ошибок нет (только jsdom scrollTo-заглушка).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 21:14:56 +03:00

1071 lines
109 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<title>Математика 6 · Глава 1 · Десятичные дроби</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"
onload="renderMathInElement(document.body,{delimiters:[{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false},{left:'\\[',right:'\\]',display:true},{left:'\\(',right:'\\)',display:false}],throwOnError:false})"></script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Unbounded:wght@700;800;900&family=JetBrains+Mono:wght@500;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/css/math6.css">
<script src="/js/api.js" defer></script>
<script src="/js/xp.js" defer></script>
<script src="/js/math6_svg.js" defer></script>
<script src="/js/math6_engine.js" defer></script>
<style>:root{--pri:#4f46e5;--pri2:#3730a3;--pri-soft:#e0e7ff;--acc:#6366f1;--acc2:#4f46e5;--acc-soft:#eef2ff}</style>
</head>
<body>
<header class="hdr" data-wm="0,5">
<div class="hdr-row">
<div>
<h1>Математика 6 · Глава 1</h1>
<div class="hdr-sub">Десятичные дроби: запись и разряды · сравнение и округление · действия · бесконечные дроби</div>
</div>
<div class="hdr-side">
<a href="/textbook/math-6" class="hdr-btn" title="Ко всем главам"><svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg> К математике 6</a>
<button id="search-btn" class="hdr-btn" title="Поиск (Ctrl+K)"><svg class="ic" viewBox="0 0 24 24"><circle cx="11" cy="11" r="7"/><path d="m21 21-4-4"/></svg> <span>Поиск</span></button>
<button id="sidebar-btn" class="hdr-btn" title="Шпаргалка"><svg class="ic" viewBox="0 0 24 24"><line x1="4" y1="6" x2="20" y2="6"/><line x1="4" y1="12" x2="20" y2="12"/><line x1="4" y1="18" x2="14" y2="18"/></svg> Шпаргалка</button>
<button id="theme-btn" class="hdr-btn" title="Сменить тему"><svg class="ic" viewBox="0 0 24 24"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg> <span id="theme-lab">Тёмная</span></button>
</div>
</div>
</header>
<main class="main">
<div class="col-main">
<section class="hero" data-wm="0,5">
<h2>Десятичные дроби</h2>
<p>Десятичная дробь — это привычная запись чисел с запятой: цена, рост, масса, показания приборов. В этой главе мы научимся <b>читать и записывать</b> десятичные дроби по разрядам, <b>сравнивать и округлять</b> их, отмечать на координатном луче и выполнять <b>все четыре действия</b> — вплоть до деления на десятичную дробь и перевода обыкновенных дробей в десятичные.</p>
<div class="hero-row">
<button class="btn-primary" onclick="goTo('p1')"><svg class="ic" viewBox="0 0 24 24"><polygon points="6 4 20 12 6 20 6 4" fill="currentColor" stroke="none"/></svg> Начать § 1</button>
<div class="hero-progress"><span class="hp-label">Прогресс по главе</span><div class="hp-bar"><div id="hero-hp-fill" class="hp-fill"></div></div><span id="hero-hp-text" class="hp-text">0%</span></div>
<div id="hero-xp-badge" class="hero-xp-badge" title="Опыт" data-gamified></div>
</div>
</section>
<section class="psel"><div class="psel-title">Параграфы главы</div><div id="psel-grid" class="psel-grid"></div></section>
<div id="sections"></div>
</div>
<aside class="col-side" id="col-side"><div id="sidebar-content"></div></aside>
<div class="col-side-backdrop" id="col-side-backdrop"></div>
</main>
<footer class="foot" id="m6-foot">Интерактивный учебник «Математика 6» · Глава 1 · Десятичные дроби · LearnSpace</footer>
<div id="ach-popup" class="ach-popup"><svg class="ic" viewBox="0 0 24 24" style="width:22px;height:22px"><polygon points="12,2 22,20 2,20"/></svg><span id="ach-text">Достижение!</span></div>
<div id="gloss-tip" class="gloss-tip"></div>
<div id="search-modal" class="search-modal" role="dialog" aria-label="Поиск по главе">
<div class="search-box">
<input type="text" id="search-input" class="search-input" placeholder="Поиск: понятие, действие, параграф…" autocomplete="off">
<div id="search-results" class="search-results"></div>
<div class="search-foot"><span><kbd>&#8593;&#8595;</kbd> навигация</span><span><kbd>Enter</kbd> открыть</span><span><kbd>Esc</kbd> закрыть</span></div>
</div>
</div>
<script>
'use strict';
window.M6 = {
slug: 'math-6-ch1', lsPrefix: 'math6_ch1', xpKey: 'math6_xp', wm: '0,5',
paras: [
{ id:'p1', num:'§ 1', name:'Десятичная запись дробей. Разряды', sub:'Как устроена запись с запятой' },
{ id:'p2', num:'§ 2', name:'Сравнение и округление', sub:'Что больше и как округлить' },
{ id:'p3', num:'§ 3', name:'Изображение на координатном луче', sub:'Дробь как точка на луче' },
{ id:'p4', num:'§ 4', name:'Сложение и вычитание', sub:'Запятая под запятой' },
{ id:'p5', num:'§ 5', name:'Умножение и деление на 10, 100, 1000', sub:'Сдвиг запятой' },
{ id:'p6', num:'§ 6', name:'Умножение десятичных дробей', sub:'Считаем знаки после запятой' },
{ id:'p7', num:'§ 7', name:'Деление на натуральное число', sub:'Деление уголком' },
{ id:'p8', num:'§ 8', name:'Деление на десятичную дробь', sub:'Переносим запятую' },
{ id:'p9', num:'§ 9', name:'Конечные и бесконечные дроби', sub:'Период дроби' },
{ id:'p10', num:'§ 10', name:'Преобразования выражений', sub:'Обыкновенные и десятичные вместе' },
{ id:'app', num:'§ 12', name:'Математика вокруг нас', sub:'Десятичные дроби в жизни', applied:true },
{ id:'final', num:'★', name:'Финал главы', sub:'Тест · боссы главы 1', final:true }
],
achLabels: {
start:'Начало главы 1!', p1_done:'Разряды освоены!', p2_done:'Сравнение и округление — легко!',
p3_done:'Координатный луч покорён!', p4_done:'Сложение и вычитание — точно!', p5_done:'Сдвиг запятой освоен!',
p6_done:'Умножение десятичных — мастер!', p7_done:'Деление уголком — уверенно!', p8_done:'Деление на дробь — без страха!',
p9_done:'Период дроби найден!', p10_done:'Преобразования — на отлично!', app_done:'Математика вокруг нас!',
ch1_done:'Глава 1 пройдена!'
},
startAch: ['start','Начало главы 1!'],
finalAch: ['ch1_done','Глава 1 пройдена!'],
sidebars: {}, tips: [], glossary: [], builders: {},
footer: 'Интерактивный учебник «Математика 6» · Глава 1 · Десятичные дроби · LearnSpace'
};
/* ===================== ВСПОМОГАТЕЛЬНОЕ ===================== */
function _ri(a,b){ return a + Math.floor(Math.random()*(b-a+1)); }
function _pick(a){ return a[_ri(0,a.length-1)]; }
function _kf(x){ return String(x).replace('.','{,}'); } /* число → KaTeX с запятой */
function _round(n,d){ var p=Math.pow(10,d); return Math.round(n*p)/p; }
/* ===================== § 1. ЗАПИСЬ И РАЗРЯДЫ ===================== */
function buildP1(){
var box=document.getElementById('p1-body'); var h='';
h+=makeCard('oral','Где это в жизни','1.0',
'<p>Десятичные дроби окружают нас каждый день. Цена в чеке: <b>2,50 руб.</b> Температура тела: <b>36,6 °C</b>. Показание счётчика воды: <b>123,47 м³</b>. Даже спортивный результат на 100 метров объявляют с десятыми секунды: <b>9,58 с</b> — рекорд мира. Без умения читать эти цифры не обойтись нигде.</p>');
h+=makeCard('theory','Что такое десятичная дробь','1.1',
'<p><b>Десятичная дробь</b> — это дробь со знаменателем $10$, $100$, $1000$ и&nbsp;т.&nbsp;д. Такие дроби записывают <b>без знаменателя</b>, отделяя целую часть от дробной <b>запятой</b>.</p>'
+'<p>$\\dfrac{7}{10}=0{,}7$ &nbsp;·&nbsp; $\\dfrac{25}{100}=0{,}25$ &nbsp;·&nbsp; $3\\dfrac{4}{100}=3{,}04$</p>'
+'<p>Слева от запятой — <b>целая</b> часть, справа — <b>дробная</b>. Сколько нулей в знаменателе, столько цифр после запятой.</p>');
h+=makeCard('rule','Разряды десятичной дроби','1.2',
'<p>После запятой идут разряды: <b>десятые</b> $\\bigl(\\tfrac{1}{10}\\bigr)$, <b>сотые</b> $\\bigl(\\tfrac{1}{100}\\bigr)$, <b>тысячные</b> $\\bigl(\\tfrac{1}{1000}\\bigr)$ и далее.</p>'
+'<table class="tbl"><tr><th>дес.</th><th>ед.</th><th>,</th><th>десятые</th><th>сотые</th><th>тысячные</th></tr>'
+'<tr><td>1</td><td>2</td><td><b>,</b></td><td>3</td><td>0</td><td>5</td></tr></table>'
+'<p>Это число $12{,}305$ — «двенадцать целых триста пять тысячных».</p>');
h+=makeCard('example','Читаем по разрядам','1.3',
'<p>$0{,}7$ — семь десятых; &nbsp; $0{,}09$ — девять сотых; &nbsp; $5{,}28$ — пять целых двадцать восемь сотых.</p>'
+'<p>Приписывание нулей <b>справа</b> не меняет дробь: $0{,}5=0{,}50=0{,}500$.</p>');
h+=makeCard('example','Разбор по шагам','1.4',
'<p>Запишем дробь $\\dfrac{305}{1000}$ в десятичном виде.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Считаем нули в знаменателе: $1\\underbrace{000}_{3}$ — три нуля.</li>'
+'<li>Значит, после запятой будет <b>3 цифры</b>.</li>'
+'<li>Числитель $305$ — три цифры: $3,\\,0,\\,5$.</li>'
+'<li>Записываем: $0{,}305$ — ноль целых триста пять тысячных.</li>'
+'<li>Проверка: десятые — $3$, сотые — $0$, тысячные — $5$. Верно!</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','1.5',
'<p>Запятую в записи дробей начали использовать в Европе около 400 лет назад. В большинстве стран разделителем служит <b>запятая</b> (Беларусь, Россия, Германия…), а в США и Великобритании — <b>точка</b>: $3.14$ и $3{,}14$ означают одно и то же число!</p>');
h+='<div class="wg" id="p1-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Разрядный конструктор</div></div>'
+'<div class="wg-help">Двигай ползунки разрядов — число собирается из целой части и десятых, сотых, тысячных.</div>'
+'<div class="sliders">'
+'<label>Целые = <b id="p1-cv">3</b><input type="range" id="p1-c" min="0" max="20" value="3"></label>'
+'<label>Десятые = <b id="p1-tv">2</b><input type="range" id="p1-t" min="0" max="9" value="2"></label>'
+'<label>Сотые = <b id="p1-hv">5</b><input type="range" id="p1-h" min="0" max="9" value="5"></label>'
+'<label>Тысячные = <b id="p1-thv">0</b><input type="range" id="p1-th" min="0" max="9" value="0"></label>'
+'</div><div id="p1-iv1-out" class="qbox"></div></div>';
h+='<div class="wg" id="p1-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Какая цифра в разряде?</div></div>'
+'<div class="wg-help">Назови цифру в указанном разряде данного числа. Введи одну цифру (09).</div>'
+'<div class="score-display"><span>Вопрос <b id="p1-qi">1</b> / 6</span><span>Очки: <b id="p1-qs">0</b> / 6</span></div>'
+'<div id="p1-qq" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p1-qa" class="tinp" style="width:90px;text-align:center" min="0" max="9"><button class="btn primary" id="p1-qgo">Проверить</button></div>'
+'<div class="feedback" id="p1-qfb"></div></div>';
h+=secNav(null,'p2')+readBtn('p1');
box.innerHTML=h; renderMath(box);
(function(){
var c=document.getElementById('p1-c'),t=document.getElementById('p1-t'),hh=document.getElementById('p1-h'),th=document.getElementById('p1-th'),out=document.getElementById('p1-iv1-out');
function upd(){
document.getElementById('p1-cv').textContent=c.value; document.getElementById('p1-tv').textContent=t.value;
document.getElementById('p1-hv').textContent=hh.value; document.getElementById('p1-thv').textContent=th.value;
var ci=+c.value,ti=+t.value,hi=+hh.value,thi=+th.value, total=ci*1000+ti*100+hi*10+thi, val=total/1000;
out.innerHTML='<div style="font-size:1.5rem;font-weight:800;color:var(--pri2)">$'+_kf(val)+'$</div>'
+'<div style="font-size:.88rem;color:var(--muted);margin-top:6px">$'+ci+' + '+ti+'\\cdot 0{,}1 + '+hi+'\\cdot 0{,}01 + '+thi+'\\cdot 0{,}001 = \\dfrac{'+total+'}{1000}$</div>';
renderMath(out);
}
c.oninput=t.oninput=hh.oninput=th.oninput=upd; upd();
})();
(function(){
var places=[['десятков',2],['единиц',1],['десятых',-1],['сотых',-2],['тысячных',-3]];
var i=0,score=0,cur=null;
function gen(){ var ws=String(_ri(10,99)), ds=String(_ri(0,999)).padStart(3,'0'), pl=_pick(places), dg;
if(pl[1]===2)dg=+ws[0]; else if(pl[1]===1)dg=+ws[1]; else if(pl[1]===-1)dg=+ds[0]; else if(pl[1]===-2)dg=+ds[1]; else dg=+ds[2];
cur={num:ws+','+ds, place:pl[0], digit:dg}; }
function show(){
if(i>=6){ document.getElementById('p1-qq').innerHTML='<b>Готово!</b> Результат: '+score+' / 6'; if(score>=5){addXp(15,'p1-iv2');bumpProgress('p1',30);}else if(score>=3){addXp(8,'p1-iv2');bumpProgress('p1',18);} return; }
gen(); document.getElementById('p1-qi').textContent=i+1;
document.getElementById('p1-qq').innerHTML='Число <b style="font-family:JetBrains Mono,monospace;font-size:1.25rem">'+cur.num+'</b>. Какая цифра в разряде <b>'+cur.place+'</b>?';
document.getElementById('p1-qa').value=''; document.getElementById('p1-qfb').style.display='none';
}
function go(){ if(i>=6)return; var fb=document.getElementById('p1-qfb'), a=parseInt(document.getElementById('p1-qa').value,10);
if(isNaN(a)){ feedback(fb,false,'Введи одну цифру 0–9.'); return; }
if(a===cur.digit){ score++; feedback(fb,true,'✓ Верно! В разряде '+cur.place+' стоит '+cur.digit+'.'); } else feedback(fb,false,'✗ Нет. Правильный ответ: '+cur.digit+'.');
document.getElementById('p1-qs').textContent=score; i++; setTimeout(show,1100); }
document.getElementById('p1-qgo').addEventListener('click',go);
document.getElementById('p1-qa').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
}
/* ===================== § 2. СРАВНЕНИЕ И ОКРУГЛЕНИЕ ===================== */
function buildP2(){
var box=document.getElementById('p2-body'); var h='';
h+=makeCard('oral','Где это в жизни','2.0',
'<p>Округление используется повсюду. Кассир округляет сдачу до копеек. Синоптик сообщает: «температура <b>минус 12 °C</b>», хотя прибор показал $-12{,}4$ °C. В спорте прыгун в длину прыгнул $7{,}847$ м — результат записывают как $7{,}84$ м (до сотых). Умение сравнивать дроби нужно, чтобы выбрать более выгодную цену или более тёплый день.</p>');
h+=makeCard('rule','Как сравнивать десятичные дроби','2.1',
'<p>1) Сначала сравнивают <b>целые</b> части: больше та дробь, у которой целая часть больше.</p>'
+'<p>2) Если целые части равны — сравнивают <b>поразрядно</b> слева направо: десятые, потом сотые и&nbsp;т.&nbsp;д.</p>'
+'<p>Чтобы было удобно, число знаков после запятой <b>уравнивают</b> нулями: $0{,}5$ и $0{,}48 \\Rightarrow 0{,}50$ и $0{,}48$, значит $0{,}5>0{,}48$.</p>');
h+=makeCard('rule','Округление до разряда','2.2',
'<p>Чтобы округлить дробь до некоторого разряда, смотрят на <b>следующую</b> цифру:</p>'
+'<ul style="padding-left:22px;line-height:1.9"><li>если она $0,1,2,3,4$ — разряд <b>оставляют</b>, остальное отбрасывают;</li>'
+'<li>если она $5,6,7,8,9$ — разряд <b>увеличивают на 1</b>.</li></ul>'
+'<p>$3{,}472 \\approx 3{,}5$ (до десятых), $\\;3{,}472 \\approx 3$ (до целых).</p>');
h+=makeCard('example','Примеры','2.3',
'<p>$0{,}9>0{,}89$, ведь $0{,}90>0{,}89$. &nbsp; $2{,}1<2{,}15$. &nbsp; $7{,}0=7$.</p>'
+'<p>$12{,}96 \\approx 13{,}0$ (до десятых) — при округлении $9$ превратилось в $10$, перенос в целые.</p>');
h+=makeCard('example','Разбор по шагам','2.4',
'<p>Сравним $3{,}07$ и $3{,}7$.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Целые части: у обоих $3$. Равны — смотрим дальше.</li>'
+'<li>Уравняем знаки: $3{,}07$ и $3{,}70$.</li>'
+'<li>Десятые: $0 < 7$. Значит $3{,}07 < 3{,}7$.</li>'
+'</ol>'
+'<p>Округлим $4{,}853$ до <b>десятых</b>: смотрим на сотые — $5$. Так как $5 \\ge 5$, десятые увеличиваем: $4{,}9$.</p>');
h+=makeCard('theory','А знаешь ли ты?','2.5',
'<p>Правило «от 5 и выше — увеличиваем» знали ещё математики Древней Индии. Именно они первыми стали записывать дробные части чисел с помощью позиционной системы. Само слово «цифра» пришло из арабского языка — оттуда, откуда к нам пришла эта система записи чисел.</p>');
h+='<div class="wg" id="p2-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Что больше?</div></div>'
+'<div class="wg-help">Сравни два числа на координатной прямой и выбери верный знак.</div>'
+'<div class="score-display"><span>Вопрос <b id="p2-ci">1</b> / 6</span><span>Очки: <b id="p2-cs">0</b> / 6</span></div>'
+'<div id="p2-cfig"></div><div id="p2-cq" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;flex-wrap:wrap"><button class="btn primary" data-cmp=">">a &gt; b</button><button class="btn primary" data-cmp="=">a = b</button><button class="btn primary" data-cmp="<">a &lt; b</button></div>'
+'<div class="feedback" id="p2-cfb"></div></div>';
h+='<div class="wg" id="p2-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Округли число</div></div>'
+'<div class="wg-help">Округли данное число до указанного разряда. Десятичную запятую вводи как точку или запятую.</div>'
+'<div class="score-display"><span>Вопрос <b id="p2-ri">1</b> / 5</span><span>Очки: <b id="p2-rs">0</b> / 5</span></div>'
+'<div id="p2-rq" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="text" id="p2-ra" class="tinp" style="width:120px;text-align:center" placeholder="ответ"><button class="btn primary" id="p2-rgo">Проверить</button></div>'
+'<div class="feedback" id="p2-rfb"></div></div>';
h+=secNav('p1','p3')+readBtn('p2');
box.innerHTML=h; renderMath(box);
(function(){
var i=0,score=0,cur=null;
function gen(){ var a=_ri(0,49)/10, b=_ri(0,49)/10; cur={a:a,b:b}; }
function show(){
if(i>=6){ document.getElementById('p2-cq').innerHTML='<b>Готово!</b> Результат: '+score+' / 6'; document.getElementById('p2-cfig').innerHTML=''; if(score>=5){addXp(15,'p2-iv1');bumpProgress('p2',30);}else if(score>=3){addXp(8,'p2-iv1');bumpProgress('p2',16);} return; }
gen(); document.getElementById('p2-ci').textContent=i+1;
document.getElementById('p2-cfig').innerHTML=Math6.numberLine({min:0,max:5,minor:0.5,major:1,width:560,marks:[{v:cur.a,label:'a',color:'#4f46e5'},{v:cur.b,label:'b',color:'#e11d48',above:false}]});
document.getElementById('p2-cq').innerHTML='$a='+_kf(cur.a)+'$, &nbsp; $b='+_kf(cur.b)+'$. Что верно?'; renderMath(document.getElementById('p2-cq'));
document.getElementById('p2-cfb').style.display='none';
}
function ans(sym){ if(i>=6)return; var fb=document.getElementById('p2-cfb'), correct=cur.a>cur.b?'>':(cur.a<cur.b?'<':'=');
if(sym===correct){ score++; feedback(fb,true,'✓ Верно: $'+_kf(cur.a)+' '+correct+' '+_kf(cur.b)+'$.'); } else feedback(fb,false,'✗ Нет. Верно: $'+_kf(cur.a)+' '+correct+' '+_kf(cur.b)+'$.');
document.getElementById('p2-cs').textContent=score; i++; setTimeout(show,1100); }
document.querySelectorAll('#p2-iv1 [data-cmp]').forEach(function(b){ b.addEventListener('click',function(){ ans(b.getAttribute('data-cmp')); }); });
show();
})();
(function(){
var i=0,score=0,cur=null;
function gen(){ var n=_ri(105,4995)/100, pl=_pick([['целых',0],['десятых',1]]); cur={n:n, place:pl[0], d:pl[1], ans:_round(n,pl[1])}; }
function show(){
if(i>=5){ document.getElementById('p2-rq').innerHTML='<b>Готово!</b> Результат: '+score+' / 5'; if(score>=4){addXp(15,'p2-iv2');bumpProgress('p2',30);}else if(score>=2){addXp(8,'p2-iv2');bumpProgress('p2',16);} return; }
gen(); document.getElementById('p2-ri').textContent=i+1;
document.getElementById('p2-rq').innerHTML='Округли $'+_kf(n_str(cur.n))+'$ до <b>'+cur.place+'</b>.'; renderMath(document.getElementById('p2-rq'));
document.getElementById('p2-ra').value=''; document.getElementById('p2-rfb').style.display='none';
}
function n_str(x){ return x; }
function go(){ if(i>=5)return; var fb=document.getElementById('p2-rfb'), raw=document.getElementById('p2-ra').value.replace(',','.').trim(); var v=parseFloat(raw);
if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; }
if(Math.abs(v-cur.ans)<1e-9){ score++; feedback(fb,true,'✓ Верно: $'+_kf(cur.ans)+'$.'); } else feedback(fb,false,'✗ Нет. Правильно: $'+_kf(cur.ans)+'$.');
document.getElementById('p2-rs').textContent=score; i++; setTimeout(show,1200); }
document.getElementById('p2-rgo').addEventListener('click',go);
document.getElementById('p2-ra').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
}
/* ===================== § 3. КООРДИНАТНЫЙ ЛУЧ ===================== */
function buildP3(){
var box=document.getElementById('p3-body'); var h='';
h+=makeCard('oral','Где это в жизни','3.0',
'<p>Координатный луч — основа любой шкалы вокруг нас: термометр, линейка, шкала весов, ось времени в редакторе видео. Когда ты видишь, что «стрелка показывает $36{,}6$», ты фактически читаешь координату точки на луче. Географические карты тоже построены на системе координат — из двух таких лучей!</p>');
h+=makeCard('theory','Координатный луч','3.1',
'<p><b>Координатный луч</b> — это луч с началом в точке $O$, которой соответствует число $0$, выбранным <b>единичным отрезком</b> и направлением.</p>'
+'<p>Каждой точке луча соответствует <b>координата</b> — число, показывающее, на каком расстоянии (в единичных отрезках) от начала она находится.</p>');
h+=makeCard('rule','Как отметить десятичную дробь','3.2',
'<p>Чтобы отметить десятые, единичный отрезок делят на <b>10</b> равных частей. Тогда $0{,}7$ — это $7$ маленьких делений от нуля.</p>'
+'<p>$1{,}3$ лежит между $1$ и $2$, ближе к $1$; $2{,}5$ — ровно посередине между $2$ и $3$.</p>');
h+=makeCard('example','Пример','3.3',
'<p>Точка с координатой $0{,}4$ — четвёртое деление после нуля. Точка с координатой $1{,}8$ — восьмое деление после единицы.</p>');
h+=makeCard('example','Разбор по шагам','3.4',
'<p>Отметим точку с координатой $1{,}3$ на луче с единичным отрезком $1$ см.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Целая часть — $1$: отмечаем точку $1$ на луче.</li>'
+'<li>Дробная часть — $0{,}3$: надо пройти $3$ деления из $10$.</li>'
+'<li>Делим отрезок от $1$ до $2$ на $10$ равных частей.</li>'
+'<li>От точки $1$ идём вправо $3$ деления — вот наша точка $1{,}3$.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','3.5',
'<p>Систему координат придумал французский математик и философ <b>Рене Декарт</b> в XVII веке — по легенде, он лежал в постели и наблюдал за мухой на потолке: «В каком месте потолка находится муха?» Именно этот вопрос навёл его на идею задавать положение точки двумя числами.</p>');
h+='<div class="wg" id="p3-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Прочитай координату</div></div>'
+'<div class="wg-help">Определи координату отмеченной точки. Запятую вводи как точку или запятую.</div>'
+'<div class="score-display"><span>Вопрос <b id="p3-ai">1</b> / 5</span><span>Очки: <b id="p3-as">0</b> / 5</span></div>'
+'<div id="p3-afig"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="text" id="p3-aa" class="tinp" style="width:120px;text-align:center" placeholder="координата"><button class="btn primary" id="p3-ago">Проверить</button></div>'
+'<div class="feedback" id="p3-afb"></div></div>';
h+='<div class="wg" id="p3-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Найди точку</div></div>'
+'<div class="wg-help">Какая из точек $A, B, C, D$ имеет указанную координату?</div>'
+'<div class="score-display"><span>Вопрос <b id="p3-bi">1</b> / 5</span><span>Очки: <b id="p3-bs">0</b> / 5</span></div>'
+'<div id="p3-bfig"></div><div id="p3-bq" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;flex-wrap:wrap"><button class="btn primary" data-pt="A">A</button><button class="btn primary" data-pt="B">B</button><button class="btn primary" data-pt="C">C</button><button class="btn primary" data-pt="D">D</button></div>'
+'<div class="feedback" id="p3-bfb"></div></div>';
h+=secNav('p2','p4')+readBtn('p3');
box.innerHTML=h; renderMath(box);
(function(){
var i=0,score=0,cur=0;
function show(){
if(i>=5){ document.getElementById('p3-afig').innerHTML='<b>Готово!</b> Результат: '+score+' / 5'; if(score>=4){addXp(15,'p3-iv1');bumpProgress('p3',30);}else if(score>=2){addXp(8,'p3-iv1');bumpProgress('p3',16);} return; }
cur=_ri(1,29)/10; document.getElementById('p3-ai').textContent=i+1;
document.getElementById('p3-afig').innerHTML=Math6.numberLine({min:0,max:3,minor:0.1,major:1,ray:true,width:560,marks:[{v:cur,label:'?',color:'#e11d48'}]});
document.getElementById('p3-aa').value=''; document.getElementById('p3-afb').style.display='none';
}
function go(){ if(i>=5)return; var fb=document.getElementById('p3-afb'), v=parseFloat(document.getElementById('p3-aa').value.replace(',','.').trim());
if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; }
if(Math.abs(v-cur)<0.001){ score++; feedback(fb,true,'✓ Верно: $'+_kf(cur)+'$.'); } else feedback(fb,false,'✗ Нет. Координата: $'+_kf(cur)+'$.');
document.getElementById('p3-as').textContent=score; i++; setTimeout(show,1200); }
document.getElementById('p3-ago').addEventListener('click',go);
document.getElementById('p3-aa').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
(function(){
var i=0,score=0,cur=null;
function gen(){ var set={}; var vals=[]; while(vals.length<4){ var v=_ri(2,48)/10; if(!set[v]){ set[v]=1; vals.push(v); } } vals.sort(function(a,b){return a-b;});
var labels=['A','B','C','D']; var marks=vals.map(function(v,k){ return {v:v,label:labels[k],color:'#4f46e5'}; });
var ti=_ri(0,3); cur={marks:marks, target:vals[ti], label:labels[ti]}; }
function show(){
if(i>=5){ document.getElementById('p3-bfig').innerHTML=''; document.getElementById('p3-bq').innerHTML='<b>Готово!</b> Результат: '+score+' / 5'; if(score>=4){addXp(15,'p3-iv2');bumpProgress('p3',30);}else if(score>=2){addXp(8,'p3-iv2');bumpProgress('p3',16);} return; }
gen(); document.getElementById('p3-bi').textContent=i+1;
document.getElementById('p3-bfig').innerHTML=Math6.numberLine({min:0,max:5,minor:0.5,major:1,width:560,marks:cur.marks});
document.getElementById('p3-bq').innerHTML='Точка с координатой $'+_kf(cur.target)+'$ — это ...?'; renderMath(document.getElementById('p3-bq'));
document.getElementById('p3-bfb').style.display='none';
}
function ans(lab){ if(i>=5)return; var fb=document.getElementById('p3-bfb');
if(lab===cur.label){ score++; feedback(fb,true,'✓ Верно — это точка '+cur.label+'.'); } else feedback(fb,false,'✗ Нет. Это точка '+cur.label+'.');
document.getElementById('p3-bs').textContent=score; i++; setTimeout(show,1100); }
document.querySelectorAll('#p3-iv2 [data-pt]').forEach(function(b){ b.addEventListener('click',function(){ ans(b.getAttribute('data-pt')); }); });
show();
})();
}
/* ===================== § 4. СЛОЖЕНИЕ И ВЫЧИТАНИЕ ===================== */
function _dec(x){ var s=String(x), i=s.indexOf('.'); return i<0?0:s.length-i-1; }
function _mant(x,d){ return Math.round(x*Math.pow(10,d)); }
function _splitNum(x){ var s=String(x).replace(',','.').split('.'); return {i:s[0], f:s[1]||''}; }
function _rnum(maxd){ var d=_ri(0,maxd==null?2:maxd); var m=_ri(1, d===0?99:(d===1?499:4999)); return m/Math.pow(10,d); }
function _colText(a,b,op){
var A=_splitNum(a),B=_splitNum(b), iw=Math.max(A.i.length,B.i.length), fw=Math.max(A.f.length,B.f.length);
function line(sign,N){ var f=fw?(','+N.f.padEnd(fw,'0')):''; return sign+' '+N.i.padStart(iw)+f; }
var w=2+iw+(fw?fw+1:0);
return '<div style="font-family:JetBrains Mono,monospace;font-size:1.3rem;white-space:pre;display:inline-block;color:var(--pri2)">'+line(' ',A)+'\n'+line(op,B)+'\n'+'─'.repeat(w)+'</div>';
}
function buildP4(){
var box=document.getElementById('p4-body'); var h='';
h+=makeCard('oral','Где это в жизни','4.0',
'<p>Сложение и вычитание десятичных дробей нужно каждый раз, когда ты платишь в магазине или считаешь сдачу. Купил булочку за <b>0,85 руб.</b> и сок за <b>1,4 руб.</b> — сколько всего? Ошибка в «запятой под запятой» стоит денег в прямом смысле. Кассовые программы делают это за тебя, но ошибки случаются — и тут на помощь приходит проверка вручную.</p>');
h+=makeCard('rule','Сложение и вычитание «в столбик»','4.1',
'<p>1) Записывают числа так, чтобы <b>запятая стояла под запятой</b>, одинаковые разряды — друг под другом.</p>'
+'<p>2) Уравнивают число знаков после запятой <b>нулями</b>.</p>'
+'<p>3) Складывают или вычитают как натуральные числа, не глядя на запятую.</p>'
+'<p>4) В ответе ставят запятую <b>под запятыми</b>.</p>');
h+=makeCard('example','Примеры','4.2',
'<p>$3{,}4 + 12{,}65 = 3{,}40 + 12{,}65 = 16{,}05$.</p>'
+'<p>$7 - 2{,}3 = 7{,}0 - 2{,}3 = 4{,}7$.</p>');
h+=makeCard('example','Разбор по шагам','4.3',
'<p>Вычислим $5{,}6 + 3{,}47$.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Уравниваем знаки: $5{,}60$ и $3{,}47$ (дописали ноль).</li>'
+'<li>Записываем столбиком: запятая строго под запятой.</li>'
+'<li>Складываем сотые: $0+7=7$.</li>'
+'<li>Складываем десятые: $6+4=10$ — пишем $0$, переносим $1$.</li>'
+'<li>Складываем единицы: $5+3+1=9$.</li>'
+'<li>Итог: $9{,}07$. Запятая — под запятыми.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','4.4',
'<p>Самая частая ошибка школьников при сложении десятичных дробей — выровнять числа по <b>правому краю</b>, как натуральные. Из-за этого $3{,}4 + 12{,}65$ превращается в неверный «$12{,}99$» вместо правильного $16{,}05$. Запятая под запятой — золотое правило!</p>');
h+='<div class="wg" id="p4-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Столбик: посчитай сам</div></div>'
+'<div class="wg-help">Запятая под запятой — выполни действие и введи ответ (запятая или точка).</div>'
+'<div class="score-display"><span>Пример <b id="p4-i">1</b> / 6</span><span>Очки: <b id="p4-s">0</b> / 6</span></div>'
+'<div id="p4-fig" style="text-align:center;margin-bottom:10px"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="text" id="p4-a" class="tinp" style="width:130px;text-align:center" placeholder="ответ"><button class="btn primary" id="p4-go">Проверить</button></div>'
+'<div class="feedback" id="p4-fb"></div></div>';
h+='<div class="wg" id="p4-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Найди ошибку выравнивания</div></div>'
+'<div class="wg-help">Частая ошибка — сложить «по правому краю», не выровняв запятую. Выбери <b>верный</b> ответ.</div>'
+'<div class="score-display"><span>Вопрос <b id="p4-ei">1</b> / 5</span><span>Очки: <b id="p4-es">0</b> / 5</span></div>'
+'<div id="p4-eq" class="qbox"></div><div id="p4-eopts" style="display:flex;gap:10px;justify-content:center;flex-wrap:wrap"></div>'
+'<div class="feedback" id="p4-efb"></div></div>';
h+=secNav('p3','p5')+readBtn('p4');
box.innerHTML=h; renderMath(box);
(function(){
var i=0,score=0,cur=null;
function gen(){ var op=_pick(['+','']), a=_rnum(2), b=_rnum(2); if(op===''&&b>a){ var t=a;a=b;b=t; }
var D=Math.max(_dec(a),_dec(b)), A=_mant(a,D),B=_mant(b,D), r=(op==='+'?A+B:A-B)/Math.pow(10,D); cur={a:a,b:b,op:op,r:r}; }
function show(){
if(i>=6){ document.getElementById('p4-fig').innerHTML='<b>Готово!</b> Результат: '+score+' / 6'; if(score>=5){addXp(15,'p4-iv1');bumpProgress('p4',30);}else if(score>=3){addXp(8,'p4-iv1');bumpProgress('p4',16);} return; }
gen(); document.getElementById('p4-i').textContent=i+1;
document.getElementById('p4-fig').innerHTML=_colText(cur.a,cur.b,cur.op);
document.getElementById('p4-a').value=''; document.getElementById('p4-fb').style.display='none';
}
function go(){ if(i>=6)return; var fb=document.getElementById('p4-fb'), v=parseFloat(document.getElementById('p4-a').value.replace(',','.').trim());
if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; }
if(Math.abs(v-cur.r)<1e-9){ score++; feedback(fb,true,'✓ Верно: $'+_kf(cur.r)+'$.'); } else feedback(fb,false,'✗ Нет. Правильно: $'+_kf(cur.r)+'$.');
document.getElementById('p4-s').textContent=score; i++; setTimeout(show,1200); }
document.getElementById('p4-go').addEventListener('click',go);
document.getElementById('p4-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
(function(){
var i=0,score=0,cur=null;
function gen(){ var a=_rnum(2), b=_rnum(2); var D=Math.max(_dec(a),_dec(b)), r=(_mant(a,D)+_mant(b,D))/Math.pow(10,D);
// ловушка: выравнивание по правому краю (складываем мантиссы как целые)
var trapD=Math.max(_dec(a),_dec(b)); var trap=(_mant(a,_dec(a))+_mant(b,_dec(b)))/Math.pow(10,trapD);
var opts=[r]; if(Math.abs(trap-r)>1e-9)opts.push(trap); opts.push(_round(r+_pick([0.1,-0.1,1,-1]),2));
opts=opts.filter(function(v,k,arr){return arr.indexOf(v)===k;}); while(opts.length<3)opts.push(_round(r+_ri(1,9)/10,2));
// перемешать
for(var j=opts.length-1;j>0;j--){ var k=_ri(0,j); var t=opts[j];opts[j]=opts[k];opts[k]=t; }
cur={a:a,b:b,r:r,opts:opts.slice(0,3)}; }
function show(){
if(i>=5){ document.getElementById('p4-eq').innerHTML='<b>Готово!</b> Результат: '+score+' / 5'; document.getElementById('p4-eopts').innerHTML=''; if(score>=4){addXp(15,'p4-iv2');bumpProgress('p4',30);}else if(score>=2){addXp(8,'p4-iv2');bumpProgress('p4',16);} return; }
gen(); document.getElementById('p4-ei').textContent=i+1;
document.getElementById('p4-eq').innerHTML='Чему равно $'+_kf(cur.a)+' + '+_kf(cur.b)+'$?'; renderMath(document.getElementById('p4-eq'));
document.getElementById('p4-eopts').innerHTML=cur.opts.map(function(o){ return '<button class="btn primary" data-v="'+o+'">$'+_kf(o)+'$</button>'; }).join('');
document.querySelectorAll('#p4-eopts [data-v]').forEach(function(b){ b.addEventListener('click',function(){ ans(parseFloat(b.getAttribute('data-v'))); }); });
renderMath(document.getElementById('p4-eopts'));
document.getElementById('p4-efb').style.display='none';
}
function ans(v){ if(i>=5)return; var fb=document.getElementById('p4-efb');
if(Math.abs(v-cur.r)<1e-9){ score++; feedback(fb,true,'✓ Верно: $'+_kf(cur.r)+'$. Запятая под запятой!'); } else feedback(fb,false,'✗ Нет. Правильно $'+_kf(cur.r)+'$ — выравнивай по запятой.');
document.getElementById('p4-es').textContent=score; i++; setTimeout(show,1300); }
show();
})();
}
/* ===================== § 5. УМНОЖЕНИЕ И ДЕЛЕНИЕ НА 10, 100, 1000 ===================== */
function buildP5(){
var box=document.getElementById('p5-body'); var h='';
h+=makeCard('oral','Где это в жизни','5.0',
'<p>Перевод единиц — это всегда умножение или деление на степень десяти. $3{,}5$ км = $3{,}5 \\cdot 1000 = 3500$ м. $750$ г = $750 \\div 1000 = 0{,}75$ кг. В магазине, на кухне, в физике — этот приём работает мгновенно в уме, без калькулятора. Запомни: умножать — запятая вправо, делить — влево.</p>');
h+=makeCard('rule','Сдвиг запятой','5.1',
'<p>Чтобы <b>умножить</b> десятичную дробь на $10$, $100$, $1000$, запятую переносят <b>вправо</b> на $1$, $2$, $3$ знака.</p>'
+'<p>Чтобы <b>разделить</b> на $10$, $100$, $1000$, запятую переносят <b>влево</b> на $1$, $2$, $3$ знака.</p>'
+'<p>Если цифр не хватает — дописывают <b>нули</b>: $3{,}5\\cdot 100 = 350$, &nbsp; $4\\div 100 = 0{,}04$.</p>');
h+=makeCard('example','Примеры','5.2',
'<p>$2{,}71\\cdot 10 = 27{,}1$ &nbsp;·&nbsp; $0{,}6\\cdot 1000 = 600$ &nbsp;·&nbsp; $58{,}3\\div 100 = 0{,}583$.</p>');
h+=makeCard('example','Разбор по шагам','5.3',
'<p>Вычислим $0{,}047 \\cdot 1000$.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>У $1000$ три нуля, значит запятая сдвигается <b>вправо</b> на $3$ знака.</li>'
+'<li>Запись: $0{,}047$ → сдвигаем: $0\\mathbf{,}047$ → $00{,}47$ → $004{,}7$ → $047{,}$</li>'
+'<li>Убираем ведущие нули: $47$.</li>'
+'<li>Ответ: $0{,}047 \\cdot 1000 = 47$.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','5.4',
'<p>Именно потому что в нашей системе счёта <b>10 цифр</b> (09), умножение на 10 такое простое — достаточно сдвинуть запятую. Если бы мы считали, как компьютеры, — в двоичной системе (двойками), — тогда так же просто работало бы умножение на $2$, $4$, $8$… Но умножение на $10$ было бы сложным!</p>');
h+='<div class="wg" id="p5-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Куда сдвинуть запятую?</div></div>'
+'<div class="wg-help">Выбери число и действие — посмотри, как и куда переносится запятая.</div>'
+'<div class="sliders"><label>Число = <b id="p5-nv">3,45</b><input type="range" id="p5-n" min="0" max="5" value="2"></label></div>'
+'<div style="display:flex;gap:8px;justify-content:center;flex-wrap:wrap;margin-bottom:8px">'
+'<button class="btn" data-op="0.001">÷1000</button><button class="btn" data-op="0.01">÷100</button><button class="btn" data-op="0.1">÷10</button>'
+'<button class="btn primary" data-op="10">×10</button><button class="btn primary" data-op="100">×100</button><button class="btn primary" data-op="1000">×1000</button></div>'
+'<div id="p5-out" class="qbox"></div></div>';
h+='<div class="wg" id="p5-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Вычисли в уме</div></div>'
+'<div class="wg-help">Перенеси запятую и введи ответ.</div>'
+'<div class="score-display"><span>Пример <b id="p5-i">1</b> / 6</span><span>Очки: <b id="p5-s">0</b> / 6</span></div>'
+'<div id="p5-q" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="text" id="p5-a" class="tinp" style="width:130px;text-align:center" placeholder="ответ"><button class="btn primary" id="p5-go">Проверить</button></div>'
+'<div class="feedback" id="p5-fb"></div></div>';
h+=secNav('p4','p6')+readBtn('p5');
box.innerHTML=h; renderMath(box);
(function(){
var NUMS=[0.6,2.71,3.45,58.3,0.04,12.5]; var sl=document.getElementById('p5-n'), out=document.getElementById('p5-out');
function shift(n,f){ var d=_dec(n); if(f>=1){ var k=Math.round(Math.log10(f)); return {res:_round(n*f, Math.max(0,d-k)), dir:'вправо', k:k}; } var k2=Math.round(-Math.log10(f)); return {res:_round(n/Math.pow(10,k2), d+k2), dir:'влево', k:k2}; }
var lastF=10;
function render(){ var n=NUMS[+sl.value]; document.getElementById('p5-nv').textContent=_kf(n).replace('{,}',','); var r=shift(n,lastF);
var sign=lastF>=1?'\\cdot '+lastF:'\\div '+Math.round(1/lastF);
out.innerHTML='<div style="font-size:1.4rem;font-weight:800;color:var(--pri2)">$'+_kf(n)+' '+sign+' = '+_kf(r.res)+'$</div>'
+'<div style="font-size:.88rem;color:var(--muted);margin-top:6px">Запятая сдвигается <b>'+r.dir+'</b> на '+r.k+' '+(r.k===1?'знак':'знака')+'.</div>'; renderMath(out); }
sl.oninput=render;
document.querySelectorAll('#p5-iv1 [data-op]').forEach(function(b){ b.addEventListener('click',function(){ lastF=parseFloat(b.getAttribute('data-op')); render(); }); });
render();
})();
(function(){
var i=0,score=0,cur=null, fs=[10,100,1000,0.1,0.01,0.001];
function gen(){ var n=_rnum(2), f=_pick(fs); var d=_dec(n), r; if(f>=1){ var k=Math.round(Math.log10(f)); r=_round(n*f,Math.max(0,d-k)); } else { var k2=Math.round(-Math.log10(f)); r=_round(n/Math.pow(10,k2), d+k2); } cur={n:n,f:f,r:r}; }
function show(){
if(i>=6){ document.getElementById('p5-q').innerHTML='<b>Готово!</b> Результат: '+score+' / 6'; if(score>=5){addXp(15,'p5-iv2');bumpProgress('p5',30);}else if(score>=3){addXp(8,'p5-iv2');bumpProgress('p5',16);} return; }
gen(); document.getElementById('p5-i').textContent=i+1;
var sign=cur.f>=1?'\\cdot '+cur.f:'\\div '+Math.round(1/cur.f);
document.getElementById('p5-q').innerHTML='Вычисли $'+_kf(cur.n)+' '+sign+'$'; renderMath(document.getElementById('p5-q'));
document.getElementById('p5-a').value=''; document.getElementById('p5-fb').style.display='none';
}
function go(){ if(i>=6)return; var fb=document.getElementById('p5-fb'), v=parseFloat(document.getElementById('p5-a').value.replace(',','.').trim());
if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; }
if(Math.abs(v-cur.r)<1e-9){ score++; feedback(fb,true,'✓ Верно: $'+_kf(cur.r)+'$.'); } else feedback(fb,false,'✗ Нет. Правильно: $'+_kf(cur.r)+'$.');
document.getElementById('p5-s').textContent=score; i++; setTimeout(show,1200); }
document.getElementById('p5-go').addEventListener('click',go);
document.getElementById('p5-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
}
/* ===================== § 6. УМНОЖЕНИЕ ДЕСЯТИЧНЫХ ДРОБЕЙ ===================== */
function buildP6(){
var box=document.getElementById('p6-body'); var h='';
h+=makeCard('oral','Где это в жизни','6.0',
'<p>Умножение десятичных дробей — это цена × количество. Ткань стоит $3{,}5$ руб. за метр, тебе нужно $1{,}2$ м — сколько заплатить? Или: скорость $72{,}5$ км/ч, время $0{,}4$ ч — какое расстояние проедет машина? Все эти задачи решаются одним действием — умножением десятичных дробей.</p>');
h+=makeCard('rule','Как умножать десятичные дроби','6.1',
'<p>1) Умножают числа, <b>не обращая внимания на запятые</b> (как натуральные).</p>'
+'<p>2) В произведении отделяют запятой <b>столько</b> цифр справа, сколько их после запятой у <b>обоих</b> множителей вместе.</p>');
h+=makeCard('example','Пример','6.2',
'<p>$1{,}2\\cdot 0{,}3$: умножаем $12\\cdot 3 = 36$; всего знаков после запятой $1+1=2$, значит $1{,}2\\cdot 0{,}3 = 0{,}36$.</p>'
+'<p>$0{,}25\\cdot 4 = 1$ (знаков $2+0=2$: $100\\to 1{,}00 = 1$).</p>');
h+=makeCard('example','Разбор по шагам','6.3',
'<p>Вычислим $2{,}4 \\cdot 0{,}15$.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Считаем знаки: у $2{,}4$ — одна цифра после запятой, у $0{,}15$ — две. Итого: $1+2=3$.</li>'
+'<li>Множим как натуральные: $24 \\cdot 15 = 360$.</li>'
+'<li>В результате $360$ отсчитываем <b>3 цифры</b> справа налево: $360 \\to 0{,}360$.</li>'
+'<li>Убираем незначащий ноль: $0{,}36$.</li>'
+'<li>Ответ: $2{,}4 \\cdot 0{,}15 = 0{,}36$.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','6.4',
'<p>Число $\\pi \\approx 3{,}14159\\ldots$ — бесконечная непериодическая дробь. Архимед вычислял её, умножая и деля вручную. Современные компьютеры рассчитали более <b>100 триллионов</b> знаков числа $\\pi$ после запятой — и конца им не видно!</p>');
h+='<div class="wg" id="p6-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Считаем знаки после запятой</div></div>'
+'<div class="wg-help">Двигай множители — смотри, как число знаков после запятой определяет ответ.</div>'
+'<div class="sliders"><label>Первый = <b id="p6-av">1,2</b><input type="range" id="p6-asl" min="0" max="5" value="1"></label>'
+'<label>Второй = <b id="p6-bv">0,3</b><input type="range" id="p6-bsl" min="0" max="5" value="2"></label></div>'
+'<div id="p6-out" class="qbox"></div></div>';
h+='<div class="wg" id="p6-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Тренажёр умножения</div></div>'
+'<div class="wg-help">Перемножь десятичные дроби и введи ответ.</div>'
+'<div class="score-display"><span>Пример <b id="p6-i">1</b> / 6</span><span>Очки: <b id="p6-s">0</b> / 6</span></div>'
+'<div id="p6-q" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="text" id="p6-a" class="tinp" style="width:130px;text-align:center" placeholder="ответ"><button class="btn primary" id="p6-go">Проверить</button></div>'
+'<div class="feedback" id="p6-fb"></div></div>';
h+=secNav('p5','p7')+readBtn('p6');
box.innerHTML=h; renderMath(box);
(function(){
var AS=[0.4,1.2,0.25,3.5,0.06,2.5], BS=[0.3,4,0.2,1.5,0.7,0.08];
var asl=document.getElementById('p6-asl'), bsl=document.getElementById('p6-bsl'), out=document.getElementById('p6-out');
function render(){ var a=AS[+asl.value], b=BS[+bsl.value]; document.getElementById('p6-av').textContent=_kf(a).replace('{,}',','); document.getElementById('p6-bv').textContent=_kf(b).replace('{,}',',');
var da=_dec(a),db=_dec(b), ma=_mant(a,da),mb=_mant(b,db), p=ma*mb, r=p/Math.pow(10,da+db);
out.innerHTML='<div style="font-size:.95rem;color:var(--muted)">$'+ma+'\\cdot '+mb+' = '+p+'$, знаков после запятой: $'+da+'+'+db+'='+(da+db)+'$</div>'
+'<div style="font-size:1.4rem;font-weight:800;color:var(--pri2);margin-top:6px">$'+_kf(a)+'\\cdot '+_kf(b)+' = '+_kf(r)+'$</div>'; renderMath(out); }
asl.oninput=render; bsl.oninput=render; render();
})();
(function(){
var i=0,score=0,cur=null;
function gen(){ var a=_rnum(_pick([1,2])), b=_rnum(_pick([0,1])); var da=_dec(a),db=_dec(b), r=_mant(a,da)*_mant(b,db)/Math.pow(10,da+db); cur={a:a,b:b,r:r}; }
function show(){
if(i>=6){ document.getElementById('p6-q').innerHTML='<b>Готово!</b> Результат: '+score+' / 6'; if(score>=5){addXp(15,'p6-iv2');bumpProgress('p6',30);}else if(score>=3){addXp(8,'p6-iv2');bumpProgress('p6',16);} return; }
gen(); document.getElementById('p6-i').textContent=i+1;
document.getElementById('p6-q').innerHTML='Вычисли $'+_kf(cur.a)+'\\cdot '+_kf(cur.b)+'$'; renderMath(document.getElementById('p6-q'));
document.getElementById('p6-a').value=''; document.getElementById('p6-fb').style.display='none';
}
function go(){ if(i>=6)return; var fb=document.getElementById('p6-fb'), v=parseFloat(document.getElementById('p6-a').value.replace(',','.').trim());
if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; }
if(Math.abs(v-cur.r)<1e-9){ score++; feedback(fb,true,'✓ Верно: $'+_kf(cur.r)+'$.'); } else feedback(fb,false,'✗ Нет. Правильно: $'+_kf(cur.r)+'$.');
document.getElementById('p6-s').textContent=score; i++; setTimeout(show,1200); }
document.getElementById('p6-go').addEventListener('click',go);
document.getElementById('p6-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
}
/* ===================== § 7. ДЕЛЕНИЕ НА НАТУРАЛЬНОЕ ЧИСЛО ===================== */
function _gcd(a,b){ a=Math.abs(a);b=Math.abs(b); while(b){ var t=b; b=a%b; a=t; } return a||1; }
function _finite(p,q){ var g=_gcd(p,q); q=q/g; while(q%2===0)q/=2; while(q%5===0)q/=5; return q===1; }
function _fracDec(p,q){ var ip=Math.floor(p/q), rem=p%q; if(rem===0)return String(ip); var dg='',seen={},pos=0,ps=-1;
while(rem!==0){ if(seen[rem]!==undefined){ ps=seen[rem]; break; } seen[rem]=pos; rem*=10; dg+=Math.floor(rem/q); rem%=q; pos++; }
if(rem===0) return ip+','+dg; return ip+','+dg.slice(0,ps)+'('+dg.slice(ps)+')'; }
function buildP7(){
var box=document.getElementById('p7-body'); var h='';
h+=makeCard('oral','Где это в жизни','7.0',
'<p>Деление используется, когда нужно разделить поровну: три друга складываются на подарок и платят $7{,}5$ руб. — сколько с каждого? Или: нитку длиной $3{,}6$ м нарезают на $4$ равных куска — какова длина каждого? Эти задачи решаются за секунды, если знать алгоритм деления уголком.</p>');
h+=makeCard('rule','Деление десятичной дроби на натуральное число','7.1',
'<p>Делят «уголком», как натуральные числа. Как только заканчивается <b>целая</b> часть делимого, в частном ставят <b>запятую</b> и продолжают деление.</p>'
+'<p>Если делимое меньше делителя, целая часть частного равна $0$. Если деление «не заканчивается» — дописывают нули к делимому.</p>');
h+=makeCard('example','Примеры','7.2',
'<p>$7{,}2 \\div 3 = 2{,}4$ &nbsp;·&nbsp; $1 \\div 4 = 0{,}25$ &nbsp;·&nbsp; $9{,}6 \\div 8 = 1{,}2$</p>');
h+=makeCard('example','Разбор по шагам','7.3',
'<p>Вычислим $5{,}4 \\div 4$.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Делим целую часть: $5 \\div 4 = 1$, остаток $1$.</li>'
+'<li>Перешли к дробной части — ставим в частном <b>запятую</b>.</li>'
+'<li>Опускаем десятые: $10+4=14$. $14 \\div 4 = 3$, остаток $2$.</li>'
+'<li>Остаток есть, дописываем ноль к делимому: $20 \\div 4 = 5$, остаток $0$.</li>'
+'<li>Деление закончилось. Ответ: $5{,}4 \\div 4 = 1{,}35$.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','7.4',
'<p>Алгоритм деления «уголком» (столбиком) использовали ещё в Средние века. Тогда его называли «галера» — схема записи напоминала паруса корабля. Сейчас мы рисуем уголок, но принцип тот же: делим по частям, не пугаясь больших чисел.</p>');
h+='<div class="wg" id="p7-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Тренажёр деления</div></div>'
+'<div class="wg-help">Раздели десятичную дробь на натуральное число. Ответ — десятичная дробь.</div>'
+'<div class="score-display"><span>Пример <b id="p7-i">1</b> / 6</span><span>Очки: <b id="p7-s">0</b> / 6</span></div>'
+'<div id="p7-q" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="text" id="p7-a" class="tinp" style="width:130px;text-align:center" placeholder="ответ"><button class="btn primary" id="p7-go">Проверить</button></div>'
+'<div class="feedback" id="p7-fb"></div></div>';
h+='<div class="wg" id="p7-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Восстанови делимое</div></div>'
+'<div class="wg-help">Известны частное и делитель. Найди делимое (проверка делением наоборот).</div>'
+'<div class="score-display"><span>Пример <b id="p7-ri">1</b> / 5</span><span>Очки: <b id="p7-rs">0</b> / 5</span></div>'
+'<div id="p7-rq" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="text" id="p7-ra" class="tinp" style="width:130px;text-align:center" placeholder="делимое"><button class="btn primary" id="p7-rgo">Проверить</button></div>'
+'<div class="feedback" id="p7-rfb"></div></div>';
h+=secNav('p6','p8')+readBtn('p7');
box.innerHTML=h; renderMath(box);
(function(){
var i=0,score=0,cur=null;
function gen(){ var r=_rnum(_pick([1,1,2])), n=_ri(2,9), dr=_dec(r), a=_mant(r,dr)*n/Math.pow(10,dr); cur={a:a,n:n,r:r}; }
function show(){ if(i>=6){ document.getElementById('p7-q').innerHTML='<b>Готово!</b> Результат: '+score+' / 6'; if(score>=5){addXp(15,'p7-iv1');bumpProgress('p7',30);}else if(score>=3){addXp(8,'p7-iv1');bumpProgress('p7',16);} return; }
gen(); document.getElementById('p7-i').textContent=i+1;
document.getElementById('p7-q').innerHTML='Вычисли $'+_kf(cur.a)+' \\div '+cur.n+'$'; renderMath(document.getElementById('p7-q'));
document.getElementById('p7-a').value=''; document.getElementById('p7-fb').style.display='none'; }
function go(){ if(i>=6)return; var fb=document.getElementById('p7-fb'), v=parseFloat(document.getElementById('p7-a').value.replace(',','.').trim());
if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; }
if(Math.abs(v-cur.r)<1e-9){ score++; feedback(fb,true,'✓ Верно: $'+_kf(cur.r)+'$.'); } else feedback(fb,false,'✗ Нет. Правильно: $'+_kf(cur.r)+'$.');
document.getElementById('p7-s').textContent=score; i++; setTimeout(show,1200); }
document.getElementById('p7-go').addEventListener('click',go);
document.getElementById('p7-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); }); show();
})();
(function(){
var i=0,score=0,cur=null;
function gen(){ var r=_rnum(_pick([1,2])), n=_ri(2,9), dr=_dec(r), a=_mant(r,dr)*n/Math.pow(10,dr); cur={a:a,n:n,r:r}; }
function show(){ if(i>=5){ document.getElementById('p7-rq').innerHTML='<b>Готово!</b> Результат: '+score+' / 5'; if(score>=4){addXp(15,'p7-iv2');bumpProgress('p7',30);}else if(score>=2){addXp(8,'p7-iv2');bumpProgress('p7',16);} return; }
gen(); document.getElementById('p7-ri').textContent=i+1;
document.getElementById('p7-rq').innerHTML='Частное $'+_kf(cur.r)+'$, делитель $'+cur.n+'$. Чему равно делимое?'; renderMath(document.getElementById('p7-rq'));
document.getElementById('p7-ra').value=''; document.getElementById('p7-rfb').style.display='none'; }
function go(){ if(i>=5)return; var fb=document.getElementById('p7-rfb'), v=parseFloat(document.getElementById('p7-ra').value.replace(',','.').trim());
if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; }
if(Math.abs(v-cur.a)<1e-9){ score++; feedback(fb,true,'✓ Верно: $'+_kf(cur.a)+' \\div '+cur.n+' = '+_kf(cur.r)+'$.'); } else feedback(fb,false,'✗ Нет. Делимое: $'+_kf(cur.a)+'$.');
document.getElementById('p7-rs').textContent=score; i++; setTimeout(show,1300); }
document.getElementById('p7-rgo').addEventListener('click',go);
document.getElementById('p7-ra').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); }); show();
})();
}
/* ===================== § 8. ДЕЛЕНИЕ НА ДЕСЯТИЧНУЮ ДРОБЬ ===================== */
function buildP8(){
var box=document.getElementById('p8-body'); var h='';
h+=makeCard('oral','Где это в жизни','8.0',
'<p>Деление на десятичную дробь встречается при расчёте количества: купили $1{,}5$ м ткани по цене $0{,}75$ руб. за метр — сколько метров можно купить на $3$ руб.? Или: одна таблетка весит $0{,}25$ г, пачка весит $3$ г — сколько таблеток в пачке? Ответ: $3 \\div 0{,}25 = 12$.</p>');
h+=makeCard('rule','Деление на десятичную дробь','8.1',
'<p>Чтобы разделить на десятичную дробь, в <b>делимом и делителе</b> переносят запятую вправо на столько знаков, сколько их после запятой у <b>делителя</b>. Получается деление на <b>натуральное</b> число.</p>'
+'<p>$4{,}5 \\div 0{,}5 = 45 \\div 5 = 9$ &nbsp;·&nbsp; $1{,}2 \\div 0{,}03 = 120 \\div 3 = 40$.</p>');
h+=makeCard('example','Почему так можно','8.2',
'<p>Деление — это дробь. Умножив делимое и делитель на одно и то же число ($10$, $100$…), значение дроби не меняется: $\\dfrac{4{,}5}{0{,}5}=\\dfrac{45}{5}=9$.</p>');
h+=makeCard('example','Разбор по шагам','8.3',
'<p>Вычислим $3{,}6 \\div 0{,}12$.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>У делителя $0{,}12$ — два знака после запятой.</li>'
+'<li>Умножаем оба числа на $100$: $3{,}6 \\cdot 100 = 360$, &nbsp;$0{,}12 \\cdot 100 = 12$.</li>'
+'<li>Теперь делим натуральные числа: $360 \\div 12 = 30$.</li>'
+'<li>Ответ: $3{,}6 \\div 0{,}12 = 30$.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','8.4',
'<p>Приём «умножить делимое и делитель на одно число» — это свойство дроби: числитель и знаменатель можно умножить на одно и то же (не ноль), и дробь не изменится. Это позволяет превращать любое деление на десятичную дробь в деление на целое число — удобный математический трюк!</p>');
h+='<div class="wg" id="p8-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Превращаем в деление на натуральное</div></div>'
+'<div class="wg-help">Выбери пример — увидишь, как перенос запятой превращает делитель в натуральное число.</div>'
+'<div id="p8-pick" style="display:flex;gap:8px;justify-content:center;flex-wrap:wrap;margin-bottom:10px"></div>'
+'<div id="p8-out" class="qbox"></div></div>';
h+='<div class="wg" id="p8-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Тренажёр деления</div></div>'
+'<div class="wg-help">Раздели на десятичную дробь. Ответ — целое или десятичная дробь.</div>'
+'<div class="score-display"><span>Пример <b id="p8-i">1</b> / 6</span><span>Очки: <b id="p8-s">0</b> / 6</span></div>'
+'<div id="p8-q" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="text" id="p8-a" class="tinp" style="width:130px;text-align:center" placeholder="ответ"><button class="btn primary" id="p8-go">Проверить</button></div>'
+'<div class="feedback" id="p8-fb"></div></div>';
h+=secNav('p7','p9')+readBtn('p8');
box.innerHTML=h; renderMath(box);
function mk(R,b){ var db=_dec(b), a=_mant(R,0)*_mant(b,db)/Math.pow(10,db); return {a:a,b:b,R:R,k:db,a2:_mant(a, _dec(a)), }; }
(function(){
var EX=[[9,0.5],[40,0.03],[6,0.25],[12,1.5],[8,0.2],[15,0.4]];
var pick=document.getElementById('p8-pick'), out=document.getElementById('p8-out');
pick.innerHTML=EX.map(function(e,k){ return '<button class="btn'+(k===0?' primary':'')+'" data-k="'+k+'">$'+_kf(_round(e[0]*e[1], _dec(e[1])))+' \\div '+_kf(e[1])+'$</button>'; }).join('');
function render(k){ var R=EX[k][0], b=EX[k][1], db=_dec(b), a=_round(R*b,db); var a2=_round(a*Math.pow(10,db), Math.max(0,_dec(a)-db)), b2=Math.round(b*Math.pow(10,db));
out.innerHTML='<div style="font-size:1.3rem;font-weight:800;color:var(--pri2)">$'+_kf(a)+' \\div '+_kf(b)+' = '+a2+' \\div '+b2+' = '+R+'$</div>'
+'<div style="font-size:.88rem;color:var(--muted);margin-top:6px">Переносим запятую на '+db+' '+(db===1?'знак':'знака')+' вправо у обоих чисел.</div>'; renderMath(out); }
pick.querySelectorAll('[data-k]').forEach(function(b){ b.addEventListener('click',function(){ pick.querySelectorAll('button').forEach(function(x){x.classList.remove('primary');}); b.classList.add('primary'); render(+b.getAttribute('data-k')); }); });
render(0);
})();
(function(){
var i=0,score=0,cur=null, BS=[0.5,0.2,0.25,0.4,0.05,1.5,0.8,0.3];
function gen(){ var R=_ri(2,30), b=_pick(BS), db=_dec(b), a=_round(R*b,db); cur={a:a,b:b,R:R}; }
function show(){ if(i>=6){ document.getElementById('p8-q').innerHTML='<b>Готово!</b> Результат: '+score+' / 6'; if(score>=5){addXp(15,'p8-iv2');bumpProgress('p8',30);}else if(score>=3){addXp(8,'p8-iv2');bumpProgress('p8',16);} return; }
gen(); document.getElementById('p8-i').textContent=i+1;
document.getElementById('p8-q').innerHTML='Вычисли $'+_kf(cur.a)+' \\div '+_kf(cur.b)+'$'; renderMath(document.getElementById('p8-q'));
document.getElementById('p8-a').value=''; document.getElementById('p8-fb').style.display='none'; }
function go(){ if(i>=6)return; var fb=document.getElementById('p8-fb'), v=parseFloat(document.getElementById('p8-a').value.replace(',','.').trim());
if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; }
if(Math.abs(v-cur.R)<1e-9){ score++; feedback(fb,true,'✓ Верно: $'+cur.R+'$.'); } else feedback(fb,false,'✗ Нет. Правильно: $'+cur.R+'$.');
document.getElementById('p8-s').textContent=score; i++; setTimeout(show,1200); }
document.getElementById('p8-go').addEventListener('click',go);
document.getElementById('p8-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); }); show();
})();
}
/* ===================== § 9. КОНЕЧНЫЕ И БЕСКОНЕЧНЫЕ ДРОБИ ===================== */
function buildP9(){
var box=document.getElementById('p9-body'); var h='';
h+=makeCard('oral','Где это в жизни','9.0',
'<p>Треть пиццы на троих — это $1 \\div 3 = 0{,}3333\\ldots$ — бесконечная дробь! Поэтому на калькуляторе мы видим $0{,}333333$, а не точный ответ. Компьютеры хранят числа с ограниченным числом знаков после запятой, и это порой приводит к маленьким ошибкам. Понимание конечных и бесконечных дробей помогает предсказать, когда возможна погрешность.</p>');
h+=makeCard('theory','Конечные и бесконечные десятичные дроби','9.1',
'<p>Обыкновенную дробь обращают в десятичную <b>делением</b> числителя на знаменатель. Иногда деление заканчивается — получается <b>конечная</b> дробь ($\\tfrac{3}{4}=0{,}75$).</p>'
+'<p>Иногда цифры начинают <b>повторяться</b> без конца — это <b>бесконечная периодическая</b> дробь. Повторяющуюся группу (период) пишут в скобках: $\\tfrac{1}{3}=0{,}(3)$, $\\tfrac{1}{6}=0{,}1(6)$.</p>');
h+=makeCard('rule','Когда дробь конечная','9.2',
'<p>Несократимая обыкновенная дробь обращается в <b>конечную</b> десятичную тогда и только тогда, когда в разложении её знаменателя есть только множители <b>2 и 5</b>.</p>'
+'<p>$\\tfrac{7}{20}$ — конечная ($20=2^2\\cdot5$); $\\tfrac{5}{6}$ — бесконечная ($6=2\\cdot3$).</p>');
h+=makeCard('example','Разбор по шагам','9.3',
'<p>Определим вид дроби $\\dfrac{7}{12}$.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Сокращаем: $\\gcd(7,12)=1$ — дробь несократима.</li>'
+'<li>Разложим знаменатель: $12 = 2^2 \\cdot 3$.</li>'
+'<li>Есть множитель $3$ — значит дробь <b>бесконечная</b>.</li>'
+'<li>Проверка делением: $7 \\div 12 = 0{,}58333\\ldots = 0{,}58(3)$.</li>'
+'<li>Период — цифра $3$, он не заканчивается.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','9.4',
'<details class="spoiler"><summary>Что такое число $0{,}(9)$? Нажми, чтобы узнать.</summary>'
+'<p>$0{,}999\\ldots = 0{,}(9) = 1$ — это не ошибка, это математический факт! Докажем: пусть $x = 0{,}(9)$. Тогда $10x = 9{,}(9)$. Вычитаем: $10x - x = 9{,}(9) - 0{,}(9) = 9$, откуда $9x=9$, $x=1$. Бесконечные дроби умеют удивлять!</p>'
+'</details>');
h+='<div class="wg" id="p9-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Конечная или бесконечная?</div></div>'
+'<div class="wg-help">Реши, обращается ли дробь в конечную десятичную (проверь множители знаменателя).</div>'
+'<div class="score-display"><span>Вопрос <b id="p9-i">1</b> / 6</span><span>Очки: <b id="p9-s">0</b> / 6</span></div>'
+'<div id="p9-q" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;flex-wrap:wrap"><button class="btn primary" data-fin="1">Конечная</button><button class="btn primary" data-fin="0">Бесконечная</button></div>'
+'<div class="feedback" id="p9-fb"></div></div>';
h+='<div class="wg" id="p9-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Запиши десятичную дробь</div></div>'
+'<div class="wg-help">Выбери верную десятичную запись дроби (период — в скобках).</div>'
+'<div class="score-display"><span>Вопрос <b id="p9-di">1</b> / 5</span><span>Очки: <b id="p9-ds">0</b> / 5</span></div>'
+'<div id="p9-dq" class="qbox"></div><div id="p9-dopts" style="display:flex;gap:10px;justify-content:center;flex-wrap:wrap"></div>'
+'<div class="feedback" id="p9-dfb"></div></div>';
h+=secNav('p8','p10')+readBtn('p9');
box.innerHTML=h; renderMath(box);
(function(){
var i=0,score=0,cur=null;
function gen(){ var q=_ri(2,16), p=_ri(1,q-1), g=_gcd(p,q); p/=g; q/=g; cur={p:p,q:q,fin:_finite(p,q)}; }
function show(){ if(i>=6){ document.getElementById('p9-q').innerHTML='<b>Готово!</b> Результат: '+score+' / 6'; if(score>=5){addXp(15,'p9-iv1');bumpProgress('p9',30);}else if(score>=3){addXp(8,'p9-iv1');bumpProgress('p9',16);} return; }
gen(); document.getElementById('p9-i').textContent=i+1;
document.getElementById('p9-q').innerHTML='Дробь $\\dfrac{'+cur.p+'}{'+cur.q+'}$ — какая десятичная?'; renderMath(document.getElementById('p9-q'));
document.getElementById('p9-fb').style.display='none'; }
function ans(f){ if(i>=6)return; var fb=document.getElementById('p9-fb'); var correct=cur.fin?1:0;
if(f===correct){ score++; feedback(fb,true,'✓ Верно — $\\dfrac{'+cur.p+'}{'+cur.q+'} = '+_fracDec(cur.p,cur.q).replace(/,/g,'{,}')+'$.'); } else feedback(fb,false,'✗ Нет. $\\dfrac{'+cur.p+'}{'+cur.q+'} = '+_fracDec(cur.p,cur.q).replace(/,/g,'{,}')+'$ — '+(cur.fin?'конечная':'бесконечная')+'.');
document.getElementById('p9-s').textContent=score; i++; setTimeout(show,1500); }
document.querySelectorAll('#p9-iv1 [data-fin]').forEach(function(b){ b.addEventListener('click',function(){ ans(+b.getAttribute('data-fin')); }); }); show();
})();
(function(){
var POOL=[[1,2],[1,4],[3,4],[1,5],[1,8],[3,8],[1,3],[2,3],[1,6],[5,6],[1,9],[7,10]];
var i=0,score=0,cur=null;
function gen(){ var f=_pick(POOL), correct=_fracDec(f[0],f[1]); var opts=[correct];
while(opts.length<3){ var g=_pick(POOL), s=_fracDec(g[0],g[1]); if(opts.indexOf(s)<0)opts.push(s); }
for(var j=opts.length-1;j>0;j--){ var k=_ri(0,j); var t=opts[j];opts[j]=opts[k];opts[k]=t; }
cur={f:f,correct:correct,opts:opts}; }
function show(){ if(i>=5){ document.getElementById('p9-dq').innerHTML='<b>Готово!</b> Результат: '+score+' / 5'; document.getElementById('p9-dopts').innerHTML=''; if(score>=4){addXp(15,'p9-iv2');bumpProgress('p9',30);}else if(score>=2){addXp(8,'p9-iv2');bumpProgress('p9',16);} return; }
gen(); document.getElementById('p9-di').textContent=i+1;
document.getElementById('p9-dq').innerHTML='$\\dfrac{'+cur.f[0]+'}{'+cur.f[1]+'} = ?$'; renderMath(document.getElementById('p9-dq'));
document.getElementById('p9-dopts').innerHTML=cur.opts.map(function(o){ return '<button class="btn primary" data-o="'+o+'">$'+o.replace(/,/g,'{,}')+'$</button>'; }).join('');
document.querySelectorAll('#p9-dopts [data-o]').forEach(function(b){ b.addEventListener('click',function(){ ans(b.getAttribute('data-o')); }); }); renderMath(document.getElementById('p9-dopts'));
document.getElementById('p9-dfb').style.display='none'; }
function ans(o){ if(i>=5)return; var fb=document.getElementById('p9-dfb');
if(o===cur.correct){ score++; feedback(fb,true,'✓ Верно!'); } else feedback(fb,false,'✗ Нет. Правильно: '+cur.correct.replace('.',','));
document.getElementById('p9-ds').textContent=score; i++; setTimeout(show,1300); }
show();
})();
}
/* ===================== § 10. ПРЕОБРАЗОВАНИЯ ВЫРАЖЕНИЙ ===================== */
function buildP10(){
var box=document.getElementById('p10-body'); var h='';
h+=makeCard('oral','Где это в жизни','10.0',
'<p>В реальных задачах числа бывают «смешанными»: рецепт требует $\\tfrac{1}{4}$ стакана масла, а у тебя весы, которые показывают $0{,}25$. Или задача по физике: скорость дана в виде $\\tfrac{3}{4}$ м/с, а нужно сложить с $0{,}5$ м/с. Умение свободно переходить между видами дробей — это математическая гибкость, которая пригодится и в химии, и в физике, и на кухне.</p>');
h+=makeCard('rule','Обыкновенные и десятичные вместе','10.1',
'<p>Десятичную дробь переводят в обыкновенную «по разрядам» и сокращают: $0{,}4=\\dfrac{4}{10}=\\dfrac{2}{5}$.</p>'
+'<p>Обыкновенную дробь переводят в десятичную делением (если она конечная). В смешанном выражении удобно привести всё к <b>одному виду</b>.</p>');
h+=makeCard('example','Пример','10.2',
'<p>$0{,}2 + \\dfrac{1}{4} = \\dfrac{1}{5} + \\dfrac{1}{4} = \\dfrac{9}{20} = 0{,}45$, или сразу $0{,}2 + 0{,}25 = 0{,}45$.</p>');
h+=makeCard('example','Разбор по шагам','10.3',
'<p>Вычислим $\\dfrac{3}{4} - 0{,}2$.</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Проверяем: $\\tfrac{3}{4}$ — конечная? Знаменатель $4=2^2$, только двойки. <b>Да</b>.</li>'
+'<li>Переводим: $\\tfrac{3}{4} = 3 \\div 4 = 0{,}75$.</li>'
+'<li>Вычитаем: $0{,}75 - 0{,}20 = 0{,}55$.</li>'
+'<li>Ответ: $\\dfrac{3}{4} - 0{,}2 = 0{,}55$.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','10.4',
'<p>Перевод обыкновенных дробей в десятичные использовали картографы ещё в XVI веке при составлении морских карт. Фламандский математик <b>Симон Стевин</b> в 1585 году написал книгу «Десятина», где показал, как упрощает расчёты запись дробей через запятую. С его лёгкой руки эта запись распространилась по всей Европе.</p>');
h+='<div class="wg" id="p10-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Сопоставь дробь и десятичную</div></div>'
+'<div class="wg-help">Перетащи каждую десятичную дробь к равной ей обыкновенной (или нажми карточку, потом — ящик).</div>'
+'<div class="dnd-hint"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 11V6a3 3 0 0 1 6 0v5"/><path d="M9 11h6v8a4 4 0 0 1-8 0z"/></svg> 5 десятичных — 5 ящиков</div>'
+'<div id="p10-pool"></div>'
+'<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:10px;margin-top:8px">'
+'<div class="drop-box"><h5 data-cat="a">$\\frac{1}{2}$</h5><div class="drop-items" data-cat="a"></div></div>'
+'<div class="drop-box"><h5 data-cat="b">$\\frac{1}{4}$</h5><div class="drop-items" data-cat="b"></div></div>'
+'<div class="drop-box"><h5 data-cat="c">$\\frac{1}{5}$</h5><div class="drop-items" data-cat="c"></div></div>'
+'<div class="drop-box"><h5 data-cat="d">$\\frac{3}{4}$</h5><div class="drop-items" data-cat="d"></div></div>'
+'<div class="drop-box"><h5 data-cat="e">$\\frac{1}{8}$</h5><div class="drop-items" data-cat="e"></div></div></div>'
+'<div class="actions"><button class="btn primary" id="p10-check">Проверить</button><button class="btn" id="p10-reset">Сначала</button></div>'
+'<div class="feedback" id="p10-fb"></div></div>';
h+='<div class="wg" id="p10-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Вычисли значение выражения</div></div>'
+'<div class="wg-help">Приведи к удобному виду и запиши ответ десятичной дробью.</div>'
+'<div class="score-display"><span>Пример <b id="p10-i">1</b> / 5</span><span>Очки: <b id="p10-s">0</b> / 5</span></div>'
+'<div id="p10-q" class="qbox"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="text" id="p10-a" class="tinp" style="width:130px;text-align:center" placeholder="ответ"><button class="btn primary" id="p10-go">Проверить</button></div>'
+'<div class="feedback" id="p10-afb"></div></div>';
h+=secNav('p9','app')+readBtn('p10');
box.innerHTML=h; renderMath(box);
(function(){
var items=[{id:'i1',cat:'a',html:'$0{,}5$'},{id:'i2',cat:'b',html:'$0{,}25$'},{id:'i3',cat:'c',html:'$0{,}2$'},{id:'i4',cat:'d',html:'$0{,}75$'},{id:'i5',cat:'e',html:'$0{,}125$'}];
var sorter=setupSorter({ poolId:'p10-pool', scopeSelector:'#p10-iv1', items:items, cats:['a','b','c','d','e'], columnLayout:false });
document.getElementById('p10-check').addEventListener('click',function(){ var fb=document.getElementById('p10-fb');
var all=items.every(function(it){ return sorter.placed[it.id]===it.cat; });
var placed=items.filter(function(it){ return sorter.placed[it.id]; }).length;
if(all){ feedback(fb,true,'✓ Все 5 равенств верны! +12 XP'); addXp(12,'p10-iv1'); bumpProgress('p10',35); }
else if(placed<items.length){ feedback(fb,false,'✗ Размести все 5 карточек.'); }
else{ var c=items.filter(function(it){ return sorter.placed[it.id]===it.cat; }).length; feedback(fb,false,'✗ Верно '+c+' из 5. Попробуй ещё.'); } });
document.getElementById('p10-reset').addEventListener('click',function(){ sorter.reset(); document.getElementById('p10-fb').style.display='none'; });
})();
(function(){
var EX=[['0{,}5 + \\dfrac{1}{4}',0.75],['\\dfrac{1}{2} + 0{,}25',0.75],['0{,}2 + \\dfrac{1}{4}',0.45],['\\dfrac{3}{4} - 0{,}25',0.5],['0{,}6 + \\dfrac{1}{5}',0.8],['\\dfrac{1}{8} + 0{,}375',0.5],['0{,}5 \\cdot \\dfrac{1}{2}',0.25],['\\dfrac{1}{4} + 0{,}1',0.35]];
var i=0,score=0,cur=null,used=[];
function gen(){ var e; do{ e=_pick(EX); }while(used.length<EX.length && used.indexOf(e)>=0); used.push(e); cur=e; }
function show(){ if(i>=5){ document.getElementById('p10-q').innerHTML='<b>Готово!</b> Результат: '+score+' / 5'; if(score>=4){addXp(15,'p10-iv2');bumpProgress('p10',30);}else if(score>=2){addXp(8,'p10-iv2');bumpProgress('p10',16);} return; }
gen(); document.getElementById('p10-i').textContent=i+1;
document.getElementById('p10-q').innerHTML='Вычисли $'+cur[0]+'$'; renderMath(document.getElementById('p10-q'));
document.getElementById('p10-a').value=''; document.getElementById('p10-afb').style.display='none'; }
function go(){ if(i>=5)return; var fb=document.getElementById('p10-afb'), v=parseFloat(document.getElementById('p10-a').value.replace(',','.').trim());
if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; }
if(Math.abs(v-cur[1])<1e-9){ score++; feedback(fb,true,'✓ Верно: $'+_kf(cur[1])+'$.'); } else feedback(fb,false,'✗ Нет. Правильно: $'+_kf(cur[1])+'$.');
document.getElementById('p10-s').textContent=score; i++; setTimeout(show,1300); }
document.getElementById('p10-go').addEventListener('click',go);
document.getElementById('p10-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); }); show();
})();
}
/* ===================== § 12. МАТЕМАТИКА ВОКРУГ НАС ===================== */
function buildApp(){
var box=document.getElementById('app-body'); var h='';
h+=makeCard('oral','Где это в жизни','12.0',
'<p>Этот параграф — про то, как математика работает вне учебника. Ты идёшь в магазин, оцениваешь погоду по температуре, проверяешь скорость на спидометре, сравниваешь время в соревнованиях — и везде тебе нужны десятичные дроби. Попробуй решить задачи так, как будто это реальная ситуация.</p>');
h+=makeCard('theory','Десятичные дроби в жизни','12.1',
'<p>Цены и сдача в магазине, рост и масса, показания счётчиков, спортивные результаты, средние значения — всё это <b>десятичные дроби</b>. Решим практические задачи.</p>'
+'<p>В рублях, метрах, килограммах, секундах — десятичная дробь показывает «часть» единицы: $0{,}5$ кг — это полкилограмма, $1{,}25$ ч — это час с четвертью.</p>');
h+=makeCard('example','Разбор по шагам','12.2',
'<p>Задача: в магазине купили $1{,}5$ кг яблок по $2{,}4$ руб. за кг и $0{,}8$ кг груш по $3{,}5$ руб. за кг. Сколько заплатили всего?</p>'
+'<ol style="padding-left:22px;line-height:2">'
+'<li>Стоимость яблок: $1{,}5 \\cdot 2{,}4 = 3{,}60$ руб.</li>'
+'<li>Стоимость груш: $0{,}8 \\cdot 3{,}5 = 2{,}80$ руб.</li>'
+'<li>Итого: $3{,}60 + 2{,}80 = 6{,}40$ руб.</li>'
+'<li>Ответ: заплатили $6{,}4$ руб.</li>'
+'</ol>');
h+=makeCard('theory','А знаешь ли ты?','12.3',
'<p>Индекс массы тела (ИМТ) — показатель здоровья — это тоже десятичная дробь. Его считают по формуле: масса (кг) делить на рост (м) в квадрате. Например: масса $45$ кг, рост $1{,}5$ м: $45 \\div (1{,}5 \\cdot 1{,}5) = 45 \\div 2{,}25 = 20$. Это и есть ИМТ — совершенно нормальный показатель для шестиклассника!</p>');
h+='<div class="wg" id="app-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Задачи из жизни</div></div>'
+'<div class="wg-help">Реши практическую задачу. Ответ — число (запятая или точка), без единиц.</div>'
+'<div class="score-display"><span>Задача <b id="app-i">1</b> / 6</span><span>Очки: <b id="app-s">0</b> / 6</span></div>'
+'<div id="app-q" class="qbox" style="font-size:1rem;text-align:left"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="text" id="app-a" class="tinp" style="width:130px;text-align:center" placeholder="ответ"><button class="btn primary" id="app-go">Проверить</button></div>'
+'<div class="feedback" id="app-fb"></div></div>';
h+='<div class="wg" id="app-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Среднее значение</div></div>'
+'<div class="wg-help">Среднее = сумма всех значений, делённая на их количество.</div>'
+'<div class="score-display"><span>Задача <b id="app-ai">1</b> / 5</span><span>Очки: <b id="app-as">0</b> / 5</span></div>'
+'<div id="app-aq" class="qbox" style="font-size:1rem;text-align:left"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="text" id="app-aa" class="tinp" style="width:130px;text-align:center" placeholder="среднее"><button class="btn primary" id="app-ago">Проверить</button></div>'
+'<div class="feedback" id="app-afb"></div></div>';
h+=secNav('p10','final')+readBtn('app');
box.innerHTML=h; renderMath(box);
(function(){
var PROB=[
{q:'Булочка стоит 0,85 руб., сок — 1,4 руб. Сколько стоит вся покупка?',a:2.25},
{q:'Тетрадь стоит 0,6 руб. Сколько стоят 4 такие тетради?',a:2.4},
{q:'За товар ценой 3,7 руб. дали 5 руб. Сколько сдачи?',a:1.3},
{q:'1 кг яблок стоит 2,5 руб. Сколько заплатят за 1,2 кг?',a:3},
{q:'Ленту длиной 2,5 м разрезали на 5 равных частей. Какова длина одной части (в метрах)?',a:0.5},
{q:'Литр бензина стоит 1,45 руб. Сколько стоят 10 л?',a:14.5},
{q:'Шоколадка стоила 1,2 руб. и подешевела на 0,3 руб. Новая цена?',a:0.9},
{q:'Три друга поровну разделили 7,5 руб. Сколько досталось каждому?',a:2.5}
];
var order=[],i=0,score=0,cur=null;
function reorder(){ order=PROB.map(function(_,k){return k;}); for(var j=order.length-1;j>0;j--){ var k=_ri(0,j); var t=order[j];order[j]=order[k];order[k]=t; } }
reorder();
function show(){ if(i>=6){ document.getElementById('app-q').innerHTML='<b>Готово!</b> Результат: '+score+' / 6'; if(score>=5){addXp(15,'app-iv1');bumpProgress('app',30);}else if(score>=3){addXp(8,'app-iv1');bumpProgress('app',16);} return; }
cur=PROB[order[i]]; document.getElementById('app-i').textContent=i+1;
document.getElementById('app-q').innerHTML=cur.q;
document.getElementById('app-a').value=''; document.getElementById('app-fb').style.display='none'; }
function go(){ if(i>=6)return; var fb=document.getElementById('app-fb'), v=parseFloat(document.getElementById('app-a').value.replace(',','.').trim());
if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; }
if(Math.abs(v-cur.a)<1e-9){ score++; feedback(fb,true,'✓ Верно: '+_kf(cur.a).replace('{,}',',')+'.'); } else feedback(fb,false,'✗ Нет. Правильно: '+_kf(cur.a).replace('{,}',',')+'.');
document.getElementById('app-s').textContent=score; i++; setTimeout(show,1300); }
document.getElementById('app-go').addEventListener('click',go);
document.getElementById('app-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); }); show();
})();
(function(){
var AVG=[
{q:'Найди среднее чисел 4,2 и 5,8.',a:5},
{q:'Температуры за три дня: 1,5°; 2,5°; 3,5°. Средняя температура?',a:2.5},
{q:'Оценки: 8; 9; 7; 8. Средний балл?',a:8},
{q:'Рост двух мальчиков 1,4 м и 1,6 м. Средний рост?',a:1.5},
{q:'Найди среднее чисел 0,2; 0,4; 0,6.',a:0.4},
{q:'Время кругов: 2,4 с и 2,6 с. Среднее время?',a:2.5}
];
var order=[],i=0,score=0,cur=null;
order=AVG.map(function(_,k){return k;}); for(var j=order.length-1;j>0;j--){ var k=_ri(0,j); var t=order[j];order[j]=order[k];order[k]=t; }
function show(){ if(i>=5){ document.getElementById('app-aq').innerHTML='<b>Готово!</b> Результат: '+score+' / 5'; if(score>=4){addXp(15,'app-iv2');bumpProgress('app',30);}else if(score>=2){addXp(8,'app-iv2');bumpProgress('app',16);} return; }
cur=AVG[order[i]]; document.getElementById('app-ai').textContent=i+1;
document.getElementById('app-aq').innerHTML=cur.q;
document.getElementById('app-aa').value=''; document.getElementById('app-afb').style.display='none'; }
function go(){ if(i>=5)return; var fb=document.getElementById('app-afb'), v=parseFloat(document.getElementById('app-aa').value.replace(',','.').trim());
if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; }
if(Math.abs(v-cur.a)<1e-9){ score++; feedback(fb,true,'✓ Верно: '+_kf(cur.a).replace('{,}',',')+'.'); } else feedback(fb,false,'✗ Нет. Правильно: '+_kf(cur.a).replace('{,}',',')+'.');
document.getElementById('app-as').textContent=score; i++; setTimeout(show,1300); }
document.getElementById('app-ago').addEventListener('click',go);
document.getElementById('app-aa').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); }); show();
})();
}
/* ===================== ФИНАЛ ГЛАВЫ — БОССЫ ===================== */
function buildFinal(){
var box=document.getElementById('final-body'); var h='';
h+=makeCard('theory','Финал главы 1','★',
'<p>Пять боссов проверят всё, что ты освоил: разряды, округление, действия с десятичными дробями, деление на дробь и преобразования. Победи всех — и глава покорена!</p>');
h+='<div class="wg" id="fin"><div class="wg-header"><span class="wg-badge">Боссы</span><div class="wg-title">Сразись с главой 1</div></div>'
+'<div class="hp-boss"><div class="hp-boss-fill" id="fin-hp" style="width:100%"></div></div>'
+'<div class="score-display"><span>Босс <b id="fin-i">1</b> / 5</span><span>Побеждено: <b id="fin-s">0</b> / 5</span></div>'
+'<div id="fin-name" style="font-weight:800;color:#b91c1c;text-align:center;margin-bottom:6px"></div>'
+'<div id="fin-q" class="boss-q"></div>'
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="text" id="fin-a" class="tinp" style="width:150px;text-align:center" placeholder="ответ"><button class="btn primary" id="fin-go">Удар!</button></div>'
+'<div class="feedback" id="fin-fb"></div></div>';
h+=secNav('app',null)+readBtn('final','Завершить главу 1 (+10 XP)');
box.innerHTML=h; renderMath(box);
(function(){
var bosses=[
function(){ var ws=String(_ri(10,99)), ds=String(_ri(100,999)); var num=ws+','+ds; return {name:'Страж Разрядов', q:'В числе $'+num.replace(',','{,}')+'$ назови цифру в разряде <b>сотых</b>.', ans:+ds[1]}; },
function(){ var n=_ri(115,985)/100; return {name:'Округлитель', q:'Округли $'+_kf(n)+'$ до <b>десятых</b>.', ans:_round(n,1)}; },
function(){ var a=_rnum(2),b=_rnum(2),op=_pick(['+','']); if(op===''&&b>a){var t=a;a=b;b=t;} var D=Math.max(_dec(a),_dec(b)), r=(op==='+'?_mant(a,D)+_mant(b,D):_mant(a,D)-_mant(b,D))/Math.pow(10,D); return {name:'Сумматор', q:'Вычисли $'+_kf(a)+' '+op+' '+_kf(b)+'$.', ans:r}; },
function(){ var a=_rnum(1),b=_rnum(1), da=_dec(a),db=_dec(b), r=_mant(a,da)*_mant(b,db)/Math.pow(10,da+db); return {name:'Множитель', q:'Вычисли $'+_kf(a)+' \\cdot '+_kf(b)+'$.', ans:r}; },
function(){ var R=_ri(2,20), b=_pick([0.5,0.2,0.25,0.4,0.05]), a=_round(R*b,_dec(b)); return {name:'Делитель', q:'Вычисли $'+_kf(a)+' \\div '+_kf(b)+'$.', ans:R}; }
];
var i=0,score=0,cur=null,done=false;
function show(){
if(i>=5){ done=true; document.getElementById('fin-name').textContent=''; document.getElementById('fin-q').innerHTML=(score>=4?'<b>Победа!</b> Глава 1 пройдена. ':'<b>Бой окончен.</b> ')+'Побеждено боссов: '+score+' / 5.';
document.getElementById('fin-hp').style.width=(score>=4?0:40)+'%';
if(score>=4){ addXp(40,'final'); bumpProgress('final',100); if(window.confetti)try{confetti();}catch(e){} } else { bumpProgress('final',60); }
return; }
cur=bosses[i](); document.getElementById('fin-i').textContent=i+1; document.getElementById('fin-s').textContent=score;
document.getElementById('fin-name').textContent='Босс '+(i+1)+': '+cur.name;
document.getElementById('fin-hp').style.width=(100-i*20)+'%';
document.getElementById('fin-q').innerHTML=cur.q; renderMath(document.getElementById('fin-q'));
document.getElementById('fin-a').value=''; document.getElementById('fin-fb').style.display='none';
}
function go(){ if(done||i>=5)return; var fb=document.getElementById('fin-fb'), v=parseFloat(document.getElementById('fin-a').value.replace(',','.').trim());
if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; }
if(Math.abs(v-cur.ans)<1e-9){ score++; feedback(fb,true,'✓ Босс повержен! Ответ $'+_kf(cur.ans)+'$.'); } else feedback(fb,false,'✗ Босс устоял. Верный ответ: $'+_kf(cur.ans)+'$.');
document.getElementById('fin-s').textContent=score; i++; setTimeout(show,1400); }
document.getElementById('fin-go').addEventListener('click',go);
document.getElementById('fin-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
show();
})();
}
/* ===================== ДАННЫЕ САЙДБАРА / ГЛОССАРИЯ ===================== */
var SIDEBARS = {
p1:{ title:'Шпаргалка § 1', rows:[
['Десятичная дробь','знаменатель $10,100,1000\\ldots$, пишут через запятую'],
['Целая часть','слева от запятой'],
['Дробная часть','справа от запятой'],
['Разряды','десятые, сотые, тысячные …'],
['Нули справа','$0{,}5=0{,}50=0{,}500$'] ]},
p2:{ title:'Шпаргалка § 2', rows:[
['Сравнение','сначала целые части, потом поразрядно'],
['Уравнять знаки','дописать нули: $0{,}5=0{,}50$'],
['Округление','следующая цифра $<5$ — отбросить'],
['','следующая цифра $\\ge 5$ — прибавить 1'] ]},
p3:{ title:'Шпаргалка § 3', rows:[
['Координатный луч','начало $O$, $0$, единичный отрезок'],
['Координата','расстояние от $0$ в единичных отрезках'],
['Десятые','единичный отрезок делим на 10'],
['$2{,}5$','посередине между 2 и 3'] ]},
p4:{ title:'Шпаргалка § 4', rows:[
['Запятая','под запятой'],
['Уравнять','нулями справа'],
['Считаем','как натуральные'],
['$7-2{,}3$','$=7{,}0-2{,}3=4{,}7$'] ]},
p5:{ title:'Шпаргалка § 5', rows:[
['× 10, 100, 1000','запятая вправо на 1, 2, 3'],
['÷ 10, 100, 1000','запятая влево на 1, 2, 3'],
['Не хватает цифр','дописываем нули'],
['$0{,}6\\cdot 1000$','$=600$'] ]},
p6:{ title:'Шпаргалка § 6', rows:[
['Умножение','как натуральные числа'],
['Запятая','знаков = сумма знаков множителей'],
['$1{,}2\\cdot 0{,}3$','$12\\cdot3=36$, 2 знака → $0{,}36$'] ]},
p7:{ title:'Шпаргалка § 7', rows:[
['Деление на натур.','делим уголком'],
['Запятая в частном','когда кончилась целая часть'],
['Не делится','дописываем нули'],
['$1\\div4$','$=0{,}25$'] ]},
p8:{ title:'Шпаргалка § 8', rows:[
['Делитель — дробь','переносим запятую вправо'],
['На сколько','на число знаков делителя'],
['У обоих','и у делимого, и у делителя'],
['$4{,}5\\div0{,}5$','$=45\\div5=9$'] ]},
p9:{ title:'Шпаргалка § 9', rows:[
['Конечная','деление заканчивается'],
['Бесконечная','цифры периода в скобках'],
['Признак конечной','знаменатель — только 2 и 5'],
['$\\frac13$','$=0{,}(3)$'] ]},
p10:{ title:'Шпаргалка § 10', rows:[
['Десятичная → обыкн.','по разрядам и сократить'],
['Обыкн. → десятичная','делением (если конечная)'],
['В выражении','привести к одному виду'],
['$0{,}4$','$=\\frac{2}{5}$'] ]},
app:{ title:'Шпаргалка § 12', rows:[
['Покупка','складываем цены'],
['Сдача','деньги − стоимость'],
['Среднее','сумма ÷ количество'],
['Единицы','$0{,}5$ кг — это полкилограмма'] ]},
final:{ title:'Финал главы 1', rows:[
['5 боссов','разряды, округление, действия, деление, преобразования'],
['Победа','4 из 5 и больше'],
['Награда','+40 XP и достижение «Глава 1 пройдена»'] ]}
};
var TIPS = [
{ sec:'p1', html:'Число цифр после запятой = числу нулей в знаменателе. У $0{,}305$ три цифры → знаменатель $1000$.' },
{ sec:'p2', html:'Перед сравнением мысленно <b>уравняй</b> число знаков нулями: $0{,}5$ это $0{,}50$, и сразу видно, что $0{,}50>0{,}48$.' },
{ sec:'p3', html:'Чтобы отметить десятые, дели единичный отрезок на 10. $1{,}7$ — это $1$ и ещё $7$ маленьких делений.' },
{ sec:'p4', html:'Перед сложением «лесенкой» допиши нули: $7$ это $7{,}0$, тогда $7{,}0-2{,}3$ считается легко.' },
{ sec:'p5', html:'Считай нули множителя: у $1000$ их три → запятая прыгает на 3 знака. Умножаем — вправо, делим — влево.' },
{ sec:'p6', html:'Сначала перемножь без запятых. Потом отсчитай справа столько знаков, сколько их после запятой у обоих множителей вместе.' },
{ sec:'p7', html:'Запятую в частном ставят ровно тогда, когда переходят от целой части делимого к дробной. Не делится нацело — припиши нули.' },
{ sec:'p8', html:'Считай знаки <b>только у делителя</b>. Перенеси запятую на столько знаков вправо и у делимого, и у делителя — делитель станет целым.' },
{ sec:'p9', html:'Чтобы понять, конечная ли дробь, разложи знаменатель на множители. Только 2 и 5 — конечная; есть 3, 7, … — бесконечная.' },
{ sec:'p10', html:'Если все десятичные конечные — переведи дроби в десятичные и считай в десятичных. Иначе приводи к обыкновенным с общим знаменателем.' },
{ sec:'app', html:'Читай задачу внимательно: «сколько всего» — складываем; «сколько сдачи» — вычитаем; «поровну» — делим; «среднее» — сумма делить на количество.' },
{ sec:'final', html:'Не спеши — у каждого босса один удар важен. Перечитай условие, прикинь ответ в уме, и только потом вводи число.' }
];
var GLOSSARY = [
{ term:'десятичная дробь', def:'Дробь со знаменателем $10,100,1000,\\ldots$, записанная через запятую.', sec:'p1', aliases:['десятичная дробь','десятичной дроби','десятичные дроби','десятичных дробей','десятичную дробь'] },
{ term:'разряд', def:'Место цифры в записи числа: десятые, сотые, тысячные и т. д.', sec:'p1', aliases:['разряд','разряда','разряде','разряды','разрядов'] },
{ term:'координатный луч', def:'Луч с началом $O$ (число $0$), единичным отрезком и направлением.', sec:'p3', aliases:['координатный луч','координатном луче','координатного луча'] },
{ term:'координата', def:'Число, показывающее расстояние точки от начала в единичных отрезках.', sec:'p3', aliases:['координата','координату','координаты','координатой'] },
{ term:'округление', def:'Замена числа близким с меньшим числом разрядов по правилу: следующая цифра $\\ge5$ — разряд увеличивают.', sec:'p2', aliases:['округление','округления','округлить','округлении'] },
{ term:'множитель', def:'Число, которое умножают. В произведении число знаков после запятой равно сумме знаков множителей.', sec:'p6', aliases:['множитель','множителя','множители','множителей'] },
{ term:'произведение', def:'Результат умножения. $1{,}2\\cdot 0{,}3 = 0{,}36$.', sec:'p6', aliases:['произведение','произведения','произведении'] },
{ term:'частное', def:'Результат деления. В $a\\div b$ число $a$ — делимое, $b$ — делитель.', sec:'p7', aliases:['частное','частного','частном'] },
{ term:'периодическая дробь', def:'Бесконечная десятичная дробь, в которой группа цифр (период) повторяется: $0{,}(3)$.', sec:'p9', aliases:['периодическая дробь','периодической дроби','период','периода','периодом'] },
{ term:'конечная дробь', def:'Десятичная дробь с конечным числом знаков после запятой ($0{,}75$).', sec:'p9', aliases:['конечная дробь','конечной дроби','конечная десятичная'] }
];
var BUILDERS = { p1:buildP1, p2:buildP2, p3:buildP3, p4:buildP4, p5:buildP5, p6:buildP6, p7:buildP7, p8:buildP8, p9:buildP9, p10:buildP10, app:buildApp, final:buildFinal };
Object.assign(window.M6, { sidebars:SIDEBARS, tips:TIPS, glossary:GLOSSARY, builders:BUILDERS });
</script>
</body>
</html>