Files
Learn_System/frontend/textbooks/math_6_ch1.html
T
Maxim Dolgolyov 4b949f7ce2 feat(math6): Глава 1, волна 4 — §12 прикладной + финал-боссы (глава завершена)
§12 «Математика вокруг нас»: задачи из жизни (покупки, сдача, измерения)
+ среднее значение. Финал главы: бой с 5 боссами (разряды, округление,
сложение/вычитание, умножение, деление на дробь) с HP-баром; победа 4/5+
даёт +40 XP и достижение «Глава 1 пройдена». Эталонная Глава 1 готова: все
12 параграфов наполнены. Тесты 12/12.

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

929 lines
90 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('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+='<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('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+='<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('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+='<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('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+='<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('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+='<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('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+='<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('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+='<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('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+='<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('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+='<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('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+='<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('theory','Десятичные дроби в жизни','12.1',
'<p>Цены и сдача в магазине, рост и масса, показания счётчиков, спортивные результаты, средние значения — всё это <b>десятичные дроби</b>. Решим практические задачи.</p>'
+'<p>В рублях, метрах, килограммах, секундах — десятичная дробь показывает «часть» единицы: $0{,}5$ кг — это полкилограмма, $1{,}25$ ч — это час с четвертью.</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>