From 21853bdc2726317a73718c1cffd3277b4fb28247 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Tue, 2 Jun 2026 20:08:48 +0300 Subject: [PATCH] =?UTF-8?q?feat(math6):=20=D0=93=D0=BB=D0=B0=D0=B2=D0=B0?= =?UTF-8?q?=204=20=E2=80=94=20=D0=A0=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=B0?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D1=87=D0=B8=D1=81=D0=BB=D0=B0?= =?UTF-8?q?=20(=C2=A71=E2=80=93=C2=A711=20+=20=D1=84=D0=B8=D0=BD=D0=B0?= =?UTF-8?q?=D0=BB)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §1 числа со знаком + координатная прямая; §2 модуль, противоположные, диаграмма N⊂Z⊂Q; §3 сравнение (прямая + наибольшее из трёх); §4 сложение (демонстратор на прямой + тренажёр); §5 вычитание = +противоп. (тренажёр + перепиши сложением); §6 законы сложения (удобный счёт + определи закон); §7 умножение (таблица знаков + тренажёр); §8 деление (тренажёр + знак частного); §9 порядок действий; §11 прикладной (температуры/долги/глубина); финал — 6 боссов. ВСЕ 6 глав готовы. Тесты math6: 17/17. Co-Authored-By: Claude Opus 4.8 (1M context) --- backend/tests/math6-page.test.js | 19 + frontend/textbooks/math_6_ch4.html | 537 +++++++++++++++++++++++++++++ 2 files changed, 556 insertions(+) diff --git a/backend/tests/math6-page.test.js b/backend/tests/math6-page.test.js index cd38b8b..a918613 100644 --- a/backend/tests/math6-page.test.js +++ b/backend/tests/math6-page.test.js @@ -102,6 +102,25 @@ test('ch3: множество — интерактивы + финал', async () assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | ')); }); +test('ch4: рациональные числа — интерактивы + финал', async () => { + const { doc, errors } = await loadDom('math_6_ch4.html'); + const win = doc.defaultView; + assert.ok(doc.querySelector('#p1-fig svg') && doc.querySelectorAll('#p1-iv2 [data-v]').length === 3, 'координатная прямая §1'); + win.goTo('p2'); await wait(80); + assert.ok(doc.querySelector('#p2-q') && doc.querySelector('#p2-oq'), 'модуль и противоположные §2'); + win.goTo('p4'); await wait(80); + assert.ok(doc.querySelector('#p4-asl') && doc.querySelector('#p4-fig svg'), 'сложение на прямой §4'); + win.goTo('p7'); await wait(80); + assert.ok(doc.querySelectorAll('#p7-iv1 [data-s]').length === 4 && doc.querySelector('#p7-q'), 'знаки умножения §7'); + win.goTo('p9'); await wait(80); + assert.ok(doc.querySelector('#p9-q'), 'порядок действий §9'); + win.goTo('final'); await wait(80); + assert.ok(doc.querySelector('#fin-go'), 'арена боссов §4'); + win.bumpProgress('final', 100); await wait(20); + assert.ok(win.M6STATE.achievements.has('ch4_done'), 'достижение «Глава 4 пройдена»'); + assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | ')); +}); + test('ch5: координатная плоскость — интерактивы §1–§3 + финал', async () => { const { doc, errors } = await loadDom('math_6_ch5.html'); const win = doc.defaultView; diff --git a/frontend/textbooks/math_6_ch4.html b/frontend/textbooks/math_6_ch4.html index d334ce2..8206c24 100644 --- a/frontend/textbooks/math_6_ch4.html +++ b/frontend/textbooks/math_6_ch4.html @@ -98,6 +98,543 @@ window.M6 = { sidebars: {}, tips: [], glossary: [], builders: {}, footer: 'Интерактивный учебник «Математика 6» · Глава 4 · Рациональные числа · 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 _nz(a,b){ var v; do{ v=_ri(a,b); }while(v===0); return v; } +function _par(x){ return x<0 ? '('+x+')' : ''+x; } +function svgWrap(w,h,inner){ return '
'+inner+'
'; } + +/* ===================== § 1. ПОЛОЖИТЕЛЬНЫЕ И ОТРИЦАТЕЛЬНЫЕ. КООРДИНАТНАЯ ПРЯМАЯ ===================== */ +function buildP1(){ + var box=document.getElementById('p1-body'); var h=''; + h+=makeCard('theory','Числа со знаком','1.1', + '

Числа бывают положительные ($+3$, или просто $3$), отрицательные ($-3$) и ноль (не положителен и не отрицателен). Отрицательными измеряют температуру ниже нуля, долги, глубину.

'); + h+=makeCard('rule','Координатная прямая','1.2', + '

Координатная прямая — прямая с началом $O$ (точка $0$), положительным направлением (вправо) и единичным отрезком. Положительные числа — справа от нуля, отрицательные — слева.

' + +'

Каждому числу соответствует точка, и наоборот; это его координата.

'); + h+='
Интерактив 1
Прочитай координату
' + +'
Определи координату отмеченной точки (может быть отрицательной).
' + +'
Вопрос 1 / 6Очки: 0 / 6
' + +'
' + +'
' + +'
'; + h+='
Интерактив 2
Положительное, отрицательное или ноль?
' + +'
Определи знак числа.
' + +'
Вопрос 1 / 6Очки: 0 / 6
' + +'
' + +'
' + +'
'; + h+=secNav(null,'p2')+readBtn('p1'); + box.innerHTML=h; renderMath(box); + + (function(){ + var i=0,score=0,cur=0; + function show(){ if(i>=6){ document.getElementById('p1-fig').innerHTML='Готово! '+score+' / 6'; if(score>=5){addXp(15,'p1-iv1');bumpProgress('p1',30);}else if(score>=3){addXp(8,'p1-iv1');bumpProgress('p1',16);} return; } + cur=_ri(-6,6); document.getElementById('p1-i').textContent=i+1; + document.getElementById('p1-fig').innerHTML=Math6.numberLine({min:-7,max:7,minor:1,major:1,width:580,marks:[{v:cur,label:'?',color:'#e11d48'}]}); + document.getElementById('p1-a').value=''; document.getElementById('p1-fb').style.display='none'; } + function go(){ if(i>=6)return; var fb=document.getElementById('p1-fb'), v=parseInt(document.getElementById('p1-a').value,10); + if(isNaN(v)){ feedback(fb,false,'Введи число (можно со знаком −).'); return; } + if(v===cur){ score++; feedback(fb,true,'✓ Верно: '+cur+'.'); } else feedback(fb,false,'✗ Нет. Координата: '+cur+'.'); + document.getElementById('p1-s').textContent=score; i++; setTimeout(show,1200); } + document.getElementById('p1-go').addEventListener('click',go); + document.getElementById('p1-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); }); show(); + })(); + + (function(){ + var i=0,score=0,cur=null; + function gen(){ var v=_ri(-9,9); cur={v:v, k:v>0?'p':(v<0?'n':'z')}; } + function show(){ if(i>=6){ document.getElementById('p1-cq').innerHTML='Готово! '+score+' / 6'; if(score>=5){addXp(15,'p1-iv2');bumpProgress('p1',30);}else if(score>=3){addXp(8,'p1-iv2');bumpProgress('p1',16);} return; } + gen(); document.getElementById('p1-ci').textContent=i+1; document.getElementById('p1-cq').innerHTML='Число $'+cur.v+'$ — какое?'; renderMath(document.getElementById('p1-cq')); + document.getElementById('p1-cfb').style.display='none'; } + function ans(k){ if(i>=6)return; var fb=document.getElementById('p1-cfb'), nm={p:'положительное',n:'отрицательное',z:'ноль'}; + if(k===cur.k){ score++; feedback(fb,true,'✓ Верно — '+nm[cur.k]+'.'); } else feedback(fb,false,'✗ Нет. $'+cur.v+'$ — '+nm[cur.k]+'.'); + document.getElementById('p1-cs').textContent=score; i++; setTimeout(show,1200); } + document.querySelectorAll('#p1-iv2 [data-v]').forEach(function(b){ b.addEventListener('click',function(){ ans(b.getAttribute('data-v')); }); }); show(); + })(); +} + +/* ===================== § 2. МОДУЛЬ. ПРОТИВОПОЛОЖНЫЕ. Z И Q ===================== */ +function buildP2(){ + var box=document.getElementById('p2-body'); var h=''; + h+=makeCard('theory','Модуль и противоположные числа','2.1', + '

Модуль числа $|a|$ — это расстояние от точки $a$ до нуля; он всегда $\\ge 0$: $|{-7}|=7$, $|5|=5$, $|0|=0$.

' + +'

Противоположные числа отличаются только знаком ($5$ и $-5$); их сумма равна нулю, а модули равны.

'); + h+=makeCard('theory','Множества чисел: N ⊂ Z ⊂ Q','2.2', + '

Натуральные $\\mathbb{N}=\\{1;2;3;\\ldots\\}$ — для счёта. Целые $\\mathbb{Z}$ — натуральные, им противоположные и ноль. Рациональные $\\mathbb{Q}$ — все числа, представимые дробью $\\frac{m}{n}$ (включая десятичные и отрицательные).

' + +svgWrap(240,180,'Q (рациональные)Z (целые)N: 1,2,3…')); + h+='
Интерактив 1
Найди модуль
' + +'
Модуль — расстояние до нуля, всегда неотрицателен.
' + +'
Вопрос 1 / 6Очки: 0 / 6
' + +'
' + +'
' + +'
'; + h+='
Интерактив 2
Противоположное число
' + +'
Назови число, противоположное данному.
' + +'
Вопрос 1 / 5Очки: 0 / 5
' + +'
' + +'
' + +'
'; + h+=secNav('p1','p3')+readBtn('p2'); + box.innerHTML=h; renderMath(box); + + (function(){ + var i=0,score=0,cur=0; + function show(){ if(i>=6){ document.getElementById('p2-q').innerHTML='Готово! '+score+' / 6'; if(score>=5){addXp(15,'p2-iv1');bumpProgress('p2',30);}else if(score>=3){addXp(8,'p2-iv1');bumpProgress('p2',16);} return; } + cur=_ri(-15,15); document.getElementById('p2-i').textContent=i+1; document.getElementById('p2-q').innerHTML='Вычисли $|'+cur+'|$.'; renderMath(document.getElementById('p2-q')); + document.getElementById('p2-a').value=''; document.getElementById('p2-fb').style.display='none'; } + function go(){ if(i>=6)return; var fb=document.getElementById('p2-fb'), v=parseInt(document.getElementById('p2-a').value,10); + if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; } + if(v===Math.abs(cur)){ score++; feedback(fb,true,'✓ Верно: '+Math.abs(cur)+'.'); } else feedback(fb,false,'✗ Нет. $|'+cur+'|='+Math.abs(cur)+'$.'); + document.getElementById('p2-s').textContent=score; i++; setTimeout(show,1200); } + document.getElementById('p2-go').addEventListener('click',go); + document.getElementById('p2-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); }); show(); + })(); + + (function(){ + var i=0,score=0,cur=0; + function show(){ if(i>=5){ document.getElementById('p2-oq').innerHTML='Готово! '+score+' / 5'; if(score>=4){addXp(15,'p2-iv2');bumpProgress('p2',30);}else if(score>=2){addXp(8,'p2-iv2');bumpProgress('p2',16);} return; } + cur=_nz(-12,12); document.getElementById('p2-oi').textContent=i+1; document.getElementById('p2-oq').innerHTML='Число, противоположное $'+cur+'$ — это?'; renderMath(document.getElementById('p2-oq')); + document.getElementById('p2-oa').value=''; document.getElementById('p2-ofb').style.display='none'; } + function go(){ if(i>=5)return; var fb=document.getElementById('p2-ofb'), v=parseInt(document.getElementById('p2-oa').value,10); + if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; } + if(v===-cur){ score++; feedback(fb,true,'✓ Верно: '+(-cur)+'.'); } else feedback(fb,false,'✗ Нет. Противоположное: '+(-cur)+'.'); + document.getElementById('p2-os').textContent=score; i++; setTimeout(show,1200); } + document.getElementById('p2-ogo').addEventListener('click',go); + document.getElementById('p2-oa').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); }); show(); + })(); +} + +/* ===================== § 3. СРАВНЕНИЕ РАЦИОНАЛЬНЫХ ===================== */ +function buildP3(){ + var box=document.getElementById('p3-body'); var h=''; + h+=makeCard('rule','Сравнение на координатной прямой','3.1', + '

Из двух чисел больше то, которое правее на координатной прямой.

' + +'

Любое положительное $>$ любого отрицательного; $0$ больше любого отрицательного. Из двух отрицательных больше то, у которого меньше модуль (ближе к нулю): $-2 > -5$.

'); + h+='
Интерактив 1
Сравни числа
' + +'
Сравни два числа на координатной прямой.
' + +'
Вопрос 1 / 6Очки: 0 / 6
' + +'
' + +'
' + +'
'; + h+='
Интерактив 2
Наибольшее из трёх
' + +'
Выбери наибольшее из трёх чисел.
' + +'
Вопрос 1 / 5Очки: 0 / 5
' + +'
' + +'
'; + h+=secNav('p2','p4')+readBtn('p3'); + box.innerHTML=h; renderMath(box); + + (function(){ + var i=0,score=0,cur=null; + function gen(){ var a=_ri(-6,6), b=_ri(-6,6); if(a===b)b=b>=0?b-1:b+1; cur={a:a,b:b}; } + function show(){ if(i>=6){ document.getElementById('p3-fig').innerHTML=''; document.getElementById('p3-q').innerHTML='Готово! '+score+' / 6'; if(score>=5){addXp(15,'p3-iv1');bumpProgress('p3',30);}else if(score>=3){addXp(8,'p3-iv1');bumpProgress('p3',16);} return; } + gen(); document.getElementById('p3-i').textContent=i+1; + document.getElementById('p3-fig').innerHTML=Math6.numberLine({min:-7,max:7,minor:1,major:1,width:580,marks:[{v:cur.a,label:'a',color:'#4f46e5'},{v:cur.b,label:'b',color:'#e11d48',above:false}]}); + document.getElementById('p3-q').innerHTML='$a='+cur.a+'$, $b='+cur.b+'$. Что верно?'; renderMath(document.getElementById('p3-q')); + document.getElementById('p3-fb').style.display='none'; } + function ans(c){ if(i>=6)return; var fb=document.getElementById('p3-fb'), correct=cur.a>cur.b?'>':'<'; + if(c===correct){ score++; feedback(fb,true,'✓ Верно: $'+cur.a+' '+correct+' '+cur.b+'$.'); } else feedback(fb,false,'✗ Нет: $'+cur.a+' '+correct+' '+cur.b+'$.'); + document.getElementById('p3-s').textContent=score; i++; setTimeout(show,1200); } + document.querySelectorAll('#p3-iv1 [data-c]').forEach(function(b){ b.addEventListener('click',function(){ ans(b.getAttribute('data-c')); }); }); show(); + })(); + + (function(){ + var i=0,score=0,cur=null; + function gen(){ var s=[]; while(s.length<3){ var v=_ri(-9,9); if(s.indexOf(v)<0)s.push(v); } var mx=Math.max.apply(null,s); cur={s:s,mx:mx}; } + function show(){ if(i>=5){ document.getElementById('p3-mopts').innerHTML='Готово! '+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-mi').textContent=i+1; + document.getElementById('p3-mopts').innerHTML=cur.s.map(function(v){ return ''; }).join(''); + document.querySelectorAll('#p3-mopts [data-v]').forEach(function(b){ b.addEventListener('click',function(){ ans(+b.getAttribute('data-v')); }); }); renderMath(document.getElementById('p3-mopts')); + document.getElementById('p3-mfb').style.display='none'; } + function ans(v){ if(i>=5)return; var fb=document.getElementById('p3-mfb'); + if(v===cur.mx){ score++; feedback(fb,true,'✓ Верно: '+cur.mx+'.'); } else feedback(fb,false,'✗ Нет. Наибольшее: '+cur.mx+'.'); + document.getElementById('p3-ms').textContent=score; i++; setTimeout(show,1200); } + show(); + })(); +} + +/* ===================== § 4. СЛОЖЕНИЕ РАЦИОНАЛЬНЫХ ===================== */ +function buildP4(){ + var box=document.getElementById('p4-body'); var h=''; + h+=makeCard('rule','Правила сложения','4.1', + '

Одинаковые знаки: складываем модули, ставим общий знак: $-3+(-4)=-7$.

' + +'

Разные знаки: из большего модуля вычитаем меньший, ставим знак числа с бо́льшим модулем: $-7+4=-3$,   $7+(-4)=3$.

' + +'

Сумма противоположных равна нулю: $6+(-6)=0$.

'); + h+='
Интерактив 1
Сложение на прямой
' + +'
Двигай слагаемые — результат отмечается на координатной прямой.
' + +'
' + +'
'; + h+='
Интерактив 2
Тренажёр сложения
' + +'
Сложи рациональные числа.
' + +'
Пример 1 / 6Очки: 0 / 6
' + +'
' + +'
' + +'
'; + h+=secNav('p3','p5')+readBtn('p4'); + box.innerHTML=h; renderMath(box); + + (function(){ + var asl=document.getElementById('p4-asl'), bsl=document.getElementById('p4-bsl'), fig=document.getElementById('p4-fig'), out=document.getElementById('p4-out'); + function render(){ var a=+asl.value,b=+bsl.value,s=a+b; document.getElementById('p4-av').textContent=a; document.getElementById('p4-bv').textContent=b; + fig.innerHTML=Math6.numberLine({min:-12,max:12,minor:1,major:2,width:580,marks:[{v:a,label:'a',color:'#4f46e5'},{v:s,label:'a+b',color:'#059669',above:false}]}); + out.innerHTML='
$'+a+' + '+_par(b)+' = '+s+'$
'; renderMath(out); } + asl.oninput=render; bsl.oninput=render; render(); + })(); + + (function(){ + var i=0,score=0,cur=null; + function gen(){ var a=_nz(-12,12), b=_nz(-12,12); cur={a:a,b:b,s:a+b}; } + function show(){ if(i>=6){ document.getElementById('p4-q').innerHTML='Готово! '+score+' / 6'; if(score>=5){addXp(15,'p4-iv2');bumpProgress('p4',30);}else if(score>=3){addXp(8,'p4-iv2');bumpProgress('p4',16);} return; } + gen(); document.getElementById('p4-i').textContent=i+1; document.getElementById('p4-q').innerHTML='Вычисли $'+cur.a+' + '+_par(cur.b)+'$'; renderMath(document.getElementById('p4-q')); + 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=parseInt(document.getElementById('p4-a').value,10); + if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; } + if(v===cur.s){ score++; feedback(fb,true,'✓ Верно: '+cur.s+'.'); } else feedback(fb,false,'✗ Нет. $'+cur.a+'+'+_par(cur.b)+'='+cur.s+'$.'); + 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(); + })(); +} + +/* ===================== § 5. ВЫЧИТАНИЕ РАЦИОНАЛЬНЫХ ===================== */ +function buildP5(){ + var box=document.getElementById('p5-body'); var h=''; + h+=makeCard('rule','Вычитание — это прибавление противоположного','5.1', + '

Чтобы из числа вычесть другое, нужно к нему прибавить противоположное: $a - b = a + (-b)$.

' + +'

$5 - 8 = 5 + (-8) = -3$;   $-4 - 3 = -4 + (-3) = -7$;   $2 - (-6) = 2 + 6 = 8$.

'); + h+='
Интерактив 1
Тренажёр вычитания
' + +'
Замени вычитание сложением с противоположным и вычисли.
' + +'
Пример 1 / 6Очки: 0 / 6
' + +'
' + +'
' + +'
'; + h+='
Интерактив 2
Перепиши как сложение
' + +'
Выбери верную запись вычитания в виде сложения.
' + +'
Вопрос 1 / 5Очки: 0 / 5
' + +'
' + +'
'; + h+=secNav('p4','p6')+readBtn('p5'); + box.innerHTML=h; renderMath(box); + + (function(){ + var i=0,score=0,cur=null; + function gen(){ var a=_ri(-10,10), b=_nz(-10,10); cur={a:a,b:b,d:a-b}; } + function show(){ if(i>=6){ document.getElementById('p5-q').innerHTML='Готово! '+score+' / 6'; if(score>=5){addXp(15,'p5-iv1');bumpProgress('p5',30);}else if(score>=3){addXp(8,'p5-iv1');bumpProgress('p5',16);} return; } + gen(); document.getElementById('p5-i').textContent=i+1; document.getElementById('p5-q').innerHTML='Вычисли $'+cur.a+' - '+_par(cur.b)+'$'; 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=parseInt(document.getElementById('p5-a').value,10); + if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; } + if(v===cur.d){ score++; feedback(fb,true,'✓ Верно: '+cur.a+' + '+_par(-cur.b)+' = '+cur.d+'.'); } else feedback(fb,false,'✗ Нет. $'+cur.a+'-'+_par(cur.b)+'='+cur.a+'+'+_par(-cur.b)+'='+cur.d+'$.'); + document.getElementById('p5-s').textContent=score; i++; setTimeout(show,1300); } + document.getElementById('p5-go').addEventListener('click',go); + document.getElementById('p5-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); }); show(); + })(); + + (function(){ + var i=0,score=0,cur=null; + function gen(){ var a=_ri(-8,8), b=_nz(-8,8); cur={a:a,b:b}; } + function show(){ if(i>=5){ document.getElementById('p5-rq').innerHTML='Готово! '+score+' / 5'; document.getElementById('p5-ropts').innerHTML=''; if(score>=4){addXp(15,'p5-iv2');bumpProgress('p5',30);}else if(score>=2){addXp(8,'p5-iv2');bumpProgress('p5',16);} return; } + gen(); document.getElementById('p5-ri').textContent=i+1; document.getElementById('p5-rq').innerHTML='Как записать $'+cur.a+' - '+_par(cur.b)+'$ в виде сложения?'; renderMath(document.getElementById('p5-rq')); + var right=cur.a+' + '+_par(-cur.b); var w1=cur.a+' + '+_par(cur.b); var w2=(-cur.a)+' + '+_par(-cur.b); + var opts=[right,w1,w2]; for(var j=opts.length-1;j>0;j--){var k=_ri(0,j),t=opts[j];opts[j]=opts[k];opts[k]=t;} + document.getElementById('p5-ropts').innerHTML=opts.map(function(o){ return ''; }).join(''); + document.querySelectorAll('#p5-ropts [data-o]').forEach(function(b){ b.addEventListener('click',function(){ ans(b.getAttribute('data-o'),right); }); }); renderMath(document.getElementById('p5-ropts')); + document.getElementById('p5-rfb').style.display='none'; } + function ans(o,right){ if(i>=5)return; var fb=document.getElementById('p5-rfb'); + if(o===right){ score++; feedback(fb,true,'✓ Верно: $'+right+'$.'); } else feedback(fb,false,'✗ Нет. Правильно: $'+right+'$.'); + document.getElementById('p5-rs').textContent=score; i++; setTimeout(show,1300); } + show(); + })(); +} + +/* ===================== § 6. ЗАКОНЫ СЛОЖЕНИЯ ===================== */ +function buildP6(){ + var box=document.getElementById('p6-body'); var h=''; + h+=makeCard('rule','Законы сложения','6.1', + '

Переместительный: $a+b=b+a$ (слагаемые можно менять местами).

' + +'

Сочетательный: $(a+b)+c=a+(b+c)$ (слагаемые можно группировать).

' + +'

Их используют для удобства: сначала складывают противоположные или «круглые» числа: $-7+15+7 = (-7+7)+15 = 15$.

'); + h+='
Интерактив 1
Вычисли удобным способом
' + +'
Сгруппируй слагаемые, чтобы считать было легко.
' + +'
Пример 1 / 5Очки: 0 / 5
' + +'
' + +'
' + +'
'; + h+='
Интерактив 2
Какой закон применён?
' + +'
Определи, какой закон сложения использован в равенстве.
' + +'
Вопрос 1 / 5Очки: 0 / 5
' + +'
' + +'
' + +'
'; + h+=secNav('p5','p7')+readBtn('p6'); + box.innerHTML=h; renderMath(box); + + (function(){ + var P=[['-7 + 15 + 7',15],['23 + (-18) + (-23)',-18],['-12 + 30 + 12',30],['8 + (-15) + (-8)',-15],['-5 + (-9) + 5',-9],['-20 + 14 + 20',14]]; + var order=P.map(function(_,k){return k;}); for(var j=order.length-1;j>0;j--){var k=_ri(0,j),t=order[j];order[j]=order[k];order[k]=t;} + var i=0,score=0,cur=null; + function show(){ if(i>=5){ document.getElementById('p6-q').innerHTML='Готово! '+score+' / 5'; if(score>=4){addXp(15,'p6-iv1');bumpProgress('p6',30);}else if(score>=2){addXp(8,'p6-iv1');bumpProgress('p6',16);} return; } + cur=P[order[i]]; document.getElementById('p6-i').textContent=i+1; document.getElementById('p6-q').innerHTML='Вычисли удобным способом: $'+cur[0]+'$'; renderMath(document.getElementById('p6-q')); + document.getElementById('p6-a').value=''; document.getElementById('p6-fb').style.display='none'; } + function go(){ if(i>=5)return; var fb=document.getElementById('p6-fb'), v=parseInt(document.getElementById('p6-a').value,10); + if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; } + if(v===cur[1]){ score++; feedback(fb,true,'✓ Верно: '+cur[1]+'.'); } else feedback(fb,false,'✗ Нет. Правильно: '+cur[1]+'.'); + document.getElementById('p6-s').textContent=score; i++; setTimeout(show,1300); } + document.getElementById('p6-go').addEventListener('click',go); + document.getElementById('p6-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); }); show(); + })(); + + (function(){ + var Q=[['a+b = b+a','p'],['(a+b)+c = a+(b+c)','s'],['7 + (-5) = -5 + 7','p'],['(2+8)+5 = 2+(8+5)','s'],['(-3+4)+1 = -3+(4+1)','s'],['12 + 9 = 9 + 12','p']]; + var order=Q.map(function(_,k){return k;}); for(var j=order.length-1;j>0;j--){var k=_ri(0,j),t=order[j];order[j]=order[k];order[k]=t;} + var i=0,score=0,cur=null; + function show(){ if(i>=5){ document.getElementById('p6-lq').innerHTML='Готово! '+score+' / 5'; if(score>=4){addXp(15,'p6-iv2');bumpProgress('p6',30);}else if(score>=2){addXp(8,'p6-iv2');bumpProgress('p6',16);} return; } + cur=Q[order[i]]; document.getElementById('p6-li').textContent=i+1; document.getElementById('p6-lq').innerHTML='$'+cur[0]+'$'; renderMath(document.getElementById('p6-lq')); + document.getElementById('p6-lfb').style.display='none'; } + function ans(l){ if(i>=5)return; var fb=document.getElementById('p6-lfb'), nm={p:'переместительный',s:'сочетательный'}; + if(l===cur[1]){ score++; feedback(fb,true,'✓ Верно — '+nm[cur[1]]+'.'); } else feedback(fb,false,'✗ Нет. Это '+nm[cur[1]]+' закон.'); + document.getElementById('p6-ls').textContent=score; i++; setTimeout(show,1300); } + document.querySelectorAll('#p6-iv2 [data-l]').forEach(function(b){ b.addEventListener('click',function(){ ans(b.getAttribute('data-l')); }); }); show(); + })(); +} + +/* ===================== § 7. УМНОЖЕНИЕ РАЦИОНАЛЬНЫХ ===================== */ +function buildP7(){ + var box=document.getElementById('p7-body'); var h=''; + h+=makeCard('rule','Правило знаков при умножении','7.1', + '

Перемножают модули, а знак определяют по правилу:

' + +'
$\\times$$+$$-$
$+$$+$$-$
$-$$-$$+$
' + +'

«Минус на минус даёт плюс». $-3\\cdot(-4)=12$,   $-3\\cdot 4=-12$. Умножение на $0$ даёт $0$.

'); + h+='
Интерактив 1
Знак произведения
' + +'
Выбери знаки множителей — узнай знак произведения.
' + +'
' + +'
'; + h+='
Интерактив 2
Тренажёр умножения
' + +'
Перемножь рациональные числа со знаками.
' + +'
Пример 1 / 6Очки: 0 / 6
' + +'
' + +'
' + +'
'; + h+=secNav('p6','p8')+readBtn('p7'); + box.innerHTML=h; renderMath(box); + + (function(){ + var out=document.getElementById('p7-out'); + function render(s){ var map={pp:['$(+)\\cdot(+)=+$','плюс'],pn:['$(+)\\cdot(-)=-$','минус'],np:['$(-)\\cdot(+)=-$','минус'],nn:['$(-)\\cdot(-)=+$','плюс']}; + out.innerHTML='
'+map[s][0]+'
Знак произведения — '+map[s][1]+'.
'; renderMath(out); } + document.querySelectorAll('#p7-iv1 [data-s]').forEach(function(b){ b.addEventListener('click',function(){ document.querySelectorAll('#p7-iv1 [data-s]').forEach(function(x){x.classList.remove('primary');}); b.classList.add('primary'); render(b.getAttribute('data-s')); }); }); + render('nn'); + })(); + + (function(){ + var i=0,score=0,cur=null; + function gen(){ var a=_nz(-9,9), b=_nz(-9,9); cur={a:a,b:b,p:a*b}; } + function show(){ if(i>=6){ document.getElementById('p7-q').innerHTML='Готово! '+score+' / 6'; if(score>=5){addXp(15,'p7-iv2');bumpProgress('p7',30);}else if(score>=3){addXp(8,'p7-iv2');bumpProgress('p7',16);} return; } + gen(); document.getElementById('p7-i').textContent=i+1; document.getElementById('p7-q').innerHTML='Вычисли $'+_par(cur.a)+' \\cdot '+_par(cur.b)+'$'; 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=parseInt(document.getElementById('p7-a').value,10); + if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; } + if(v===cur.p){ score++; feedback(fb,true,'✓ Верно: '+cur.p+'.'); } else feedback(fb,false,'✗ Нет. $'+_par(cur.a)+'\\cdot'+_par(cur.b)+'='+cur.p+'$.'); + 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(); + })(); +} + +/* ===================== § 8. ДЕЛЕНИЕ РАЦИОНАЛЬНЫХ ===================== */ +function buildP8(){ + var box=document.getElementById('p8-body'); var h=''; + h+=makeCard('rule','Правило знаков при делении','8.1', + '

Делят модули, а знак — по тому же правилу, что и при умножении: одинаковые знаки дают $+$, разные — $-$.

' + +'

$-12\\div(-3)=4$,   $-12\\div 3=-4$,   $12\\div(-4)=-3$. На ноль делить нельзя.

'); + h+='
Интерактив 1
Тренажёр деления
' + +'
Раздели рациональные числа (деление нацело).
' + +'
Пример 1 / 6Очки: 0 / 6
' + +'
' + +'
' + +'
'; + h+='
Интерактив 2
Какой знак результата?
' + +'
Определи знак частного, не вычисляя значение.
' + +'
Вопрос 1 / 5Очки: 0 / 5
' + +'
' + +'
' + +'
'; + h+=secNav('p7','p9')+readBtn('p8'); + box.innerHTML=h; renderMath(box); + + (function(){ + var i=0,score=0,cur=null; + function gen(){ var q=_nz(-9,9), b=_nz(-6,6); cur={a:q*b,b:b,q:q}; } + function show(){ if(i>=6){ document.getElementById('p8-q').innerHTML='Готово! '+score+' / 6'; if(score>=5){addXp(15,'p8-iv1');bumpProgress('p8',30);}else if(score>=3){addXp(8,'p8-iv1');bumpProgress('p8',16);} return; } + gen(); document.getElementById('p8-i').textContent=i+1; document.getElementById('p8-q').innerHTML='Вычисли $'+_par(cur.a)+' \\div '+_par(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=parseInt(document.getElementById('p8-a').value,10); + if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; } + if(v===cur.q){ score++; feedback(fb,true,'✓ Верно: '+cur.q+'.'); } else feedback(fb,false,'✗ Нет. $'+_par(cur.a)+'\\div'+_par(cur.b)+'='+cur.q+'$.'); + 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(); + })(); + + (function(){ + var i=0,score=0,cur=null; + function gen(){ var a=_nz(-9,9), b=_nz(-9,9); cur={a:a,b:b,z:(a*b>0)?'+':'-'}; } + function show(){ if(i>=5){ document.getElementById('p8-zq').innerHTML='Готово! '+score+' / 5'; if(score>=4){addXp(15,'p8-iv2');bumpProgress('p8',30);}else if(score>=2){addXp(8,'p8-iv2');bumpProgress('p8',16);} return; } + gen(); document.getElementById('p8-zi').textContent=i+1; document.getElementById('p8-zq').innerHTML='Какой знак у $'+_par(cur.a)+' \\div '+_par(cur.b)+'$?'; renderMath(document.getElementById('p8-zq')); + document.getElementById('p8-zfb').style.display='none'; } + function ans(z){ if(i>=5)return; var fb=document.getElementById('p8-zfb'); + if(z===cur.z){ score++; feedback(fb,true,'✓ Верно — '+(cur.z==='+'?'положительный':'отрицательный')+'.'); } else feedback(fb,false,'✗ Нет. Знак '+(cur.z==='+'?'положительный':'отрицательный')+'.'); + document.getElementById('p8-zs').textContent=score; i++; setTimeout(show,1200); } + document.querySelectorAll('#p8-iv2 [data-z]').forEach(function(b){ b.addEventListener('click',function(){ ans(b.getAttribute('data-z')); }); }); show(); + })(); +} + +/* ===================== § 9. ЗАДАЧИ НА ВСЕ ДЕЙСТВИЯ ===================== */ +function buildP9(){ + var box=document.getElementById('p9-body'); var h=''; + h+=makeCard('rule','Порядок действий со знаками','9.1', + '

Сначала действия в скобках, затем умножение и деление, потом сложение и вычитание. Внимательно следи за знаками.

' + +'

$-3 + 4\\cdot(-2) = -3 + (-8) = -11$.

'); + h+='
Интерактив 1
Вычисли выражение
' + +'
Соблюдай порядок действий и правила знаков.
' + +'
Пример 1 / 6Очки: 0 / 6
' + +'
' + +'
' + +'
'; + h+=secNav('p8','app')+readBtn('p9'); + box.innerHTML=h; renderMath(box); + + (function(){ + var P=[['-3 + 4\\cdot(-2)',-11],['(-5+2)\\cdot 3',-9],['10 - 3\\cdot 4',-2],['-2\\cdot(-3) + 1',7],['(-8)\\div 2 - 1',-5],['-1 - (-6)',5],['5\\cdot(-2) + 12',2],['(-4)\\cdot 2 + (-3)',-11],['(-12)\\div(-4) - 5',-2],['6 + (-2)\\cdot 5',-4]]; + var order=P.map(function(_,k){return k;}); for(var j=order.length-1;j>0;j--){var k=_ri(0,j),t=order[j];order[j]=order[k];order[k]=t;} + var i=0,score=0,cur=null; + function show(){ if(i>=6){ document.getElementById('p9-q').innerHTML='Готово! '+score+' / 6'; if(score>=5){addXp(20,'p9-iv1');bumpProgress('p9',50);}else if(score>=3){addXp(10,'p9-iv1');bumpProgress('p9',26);} return; } + cur=P[order[i]]; document.getElementById('p9-i').textContent=i+1; document.getElementById('p9-q').innerHTML='Вычисли $'+cur[0]+'$'; renderMath(document.getElementById('p9-q')); + document.getElementById('p9-a').value=''; document.getElementById('p9-fb').style.display='none'; } + function go(){ if(i>=6)return; var fb=document.getElementById('p9-fb'), v=parseInt(document.getElementById('p9-a').value,10); + if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; } + if(v===cur[1]){ score++; feedback(fb,true,'✓ Верно: '+cur[1]+'.'); } else feedback(fb,false,'✗ Нет. Правильно: '+cur[1]+'.'); + document.getElementById('p9-s').textContent=score; i++; setTimeout(show,1300); } + document.getElementById('p9-go').addEventListener('click',go); + document.getElementById('p9-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); }); show(); + })(); +} + +/* ===================== § 11. МАТЕМАТИКА ВОКРУГ НАС ===================== */ +function buildApp(){ + var box=document.getElementById('app-body'); var h=''; + h+=makeCard('theory','Отрицательные числа вокруг нас','11.1', + '

Температура ниже нуля, долги и доходы, высота над уровнем моря и глубина, координаты в играх и на карте — всюду нужны отрицательные числа.

'); + h+='
Интерактив 1
Задачи из жизни
' + +'
Реши практическую задачу. Ответ — целое число (можно со знаком −).
' + +'
Задача 1 / 6Очки: 0 / 6
' + +'
' + +'
' + +'
'; + h+=secNav('p9','final')+readBtn('app'); + box.innerHTML=h; renderMath(box); + + (function(){ + var P=[ + {q:'Утром было −5°, днём потеплело на 8°. Какая температура стала (°C)?',a:3}, + {q:'Температура −3° понизилась ещё на 6°. Сколько стало (°C)?',a:-9}, + {q:'На счёте было 200 руб., сняли долг 250 руб. Сколько на счёте (руб.)?',a:-50}, + {q:'Подводная лодка на глубине −80 м поднялась на 30 м. На какой глубине теперь (м)?',a:-50}, + {q:'Игрок имел −15 очков и заработал 40. Сколько очков стало?',a:25}, + {q:'Температура поднялась с −7° до 5°. На сколько градусов потеплело?',a:12}, + {q:'Лифт с −2 этажа поднялся на 7 этажей. На каком этаже он теперь?',a:5} + ]; + var order=P.map(function(_,k){return k;}); for(var j=order.length-1;j>0;j--){var k=_ri(0,j),t=order[j];order[j]=order[k];order[k]=t;} + var i=0,score=0,cur=null; + function show(){ if(i>=6){ document.getElementById('app-q').innerHTML='Готово! '+score+' / 6'; if(score>=5){addXp(15,'app-iv1');bumpProgress('app',35);}else if(score>=3){addXp(8,'app-iv1');bumpProgress('app',18);} return; } + cur=P[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=parseInt(document.getElementById('app-a').value,10); + if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; } + if(v===cur.a){ score++; feedback(fb,true,'✓ Верно: '+cur.a+'.'); } else feedback(fb,false,'✗ Нет. Правильно: '+cur.a+'.'); + 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 buildFinal(){ + var box=document.getElementById('final-body'); var h=''; + h+=makeCard('theory','Финал главы 4','★','

Шесть боссов проверят модуль, сравнение и все действия с рациональными числами. Победи всех!

'); + h+='
Боссы
Сразись с главой 4
' + +'
' + +'
Босс 1 / 6Побеждено: 0 / 6
' + +'
' + +'
' + +'
' + +'
'; + h+=secNav('app',null)+readBtn('final','Завершить главу 4 (+10 XP)'); + box.innerHTML=h; renderMath(box); + + (function(){ + var bosses=[ + function(){ var v=_nz(-15,15); return {name:'Модуль', q:'Вычисли $|'+v+'|$.', ans:Math.abs(v)}; }, + function(){ var a=_nz(-12,12),b=_nz(-12,12); return {name:'Сумматор', q:'Вычисли $'+a+' + '+_par(b)+'$.', ans:a+b}; }, + function(){ var a=_ri(-10,10),b=_nz(-10,10); return {name:'Вычитатель', q:'Вычисли $'+a+' - '+_par(b)+'$.', ans:a-b}; }, + function(){ var a=_nz(-9,9),b=_nz(-9,9); return {name:'Множитель', q:'Вычисли $'+_par(a)+' \\cdot '+_par(b)+'$.', ans:a*b}; }, + function(){ var q=_nz(-9,9),b=_nz(-6,6); return {name:'Делитель', q:'Вычисли $'+_par(q*b)+' \\div '+_par(b)+'$.', ans:q}; }, + function(){ var e=_pick([['-3 + 4\\cdot(-2)',-11],['(-5+2)\\cdot 3',-9],['-2\\cdot(-3)+1',7],['(-12)\\div(-4)-5',-2]]); return {name:'Порядок Действий', q:'Вычисли $'+e[0]+'$.', ans:e[1]}; } + ]; + var i=0,score=0,cur=null,done=false,N=6; + function show(){ if(i>=N){ done=true; document.getElementById('fin-name').textContent=''; document.getElementById('fin-q').innerHTML=(score>=5?'Победа! Глава 4 пройдена. ':'Бой окончен. ')+'Побеждено боссов: '+score+' / '+N+'.'; document.getElementById('fin-hp').style.width=(score>=5?0:40)+'%'; + if(score>=5){ 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*100/N)+'%'; + 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>=N)return; var fb=document.getElementById('fin-fb'), v=parseInt(document.getElementById('fin-a').value,10); + if(isNaN(v)){ feedback(fb,false,'Введи число.'); return; } + if(v===cur.ans){ score++; feedback(fb,true,'✓ Босс повержен! Ответ '+cur.ans+'.'); } else feedback(fb,false,'✗ Босс устоял. Верно: '+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:[ ['Положительные','справа от 0'], ['Отрицательные','слева от 0'], ['Ноль','ни +, ни −'], ['Координата','число точки на прямой'] ]}, + p2:{ title:'Шпаргалка § 2', rows:[ ['Модуль $|a|$','расстояние до 0, $\\ge0$'], ['$|{-7}|$','$=7$'], ['Противоположные','$a$ и $-a$, сумма $0$'], ['$\\mathbb{N}\\subset\\mathbb{Z}\\subset\\mathbb{Q}$','натур. ⊂ целые ⊂ рацион.'] ]}, + p3:{ title:'Шпаргалка § 3', rows:[ ['Больше','то, что правее'], ['$+ > -$','любое полож. > любого отриц.'], ['Два отрицат.','больше с меньшим модулем'], ['$-2 > -5$','ближе к нулю'] ]}, + p4:{ title:'Шпаргалка § 4', rows:[ ['Одинаковые знаки','складываем модули, знак тот же'], ['Разные знаки','модули вычитаем, знак большего'], ['$a+(-a)$','$=0$'] ]}, + p5:{ title:'Шпаргалка § 5', rows:[ ['Вычитание','$a-b=a+(-b)$'], ['$5-8$','$=5+(-8)=-3$'], ['$2-(-6)$','$=2+6=8$'] ]}, + p6:{ title:'Шпаргалка § 6', rows:[ ['Переместительный','$a+b=b+a$'], ['Сочетательный','$(a+b)+c=a+(b+c)$'], ['Удобно','группируем противоположные'] ]}, + p7:{ title:'Шпаргалка § 7', rows:[ ['$(-)\\cdot(-)$','$=+$'], ['$(+)\\cdot(-)$','$=-$'], ['Модули','перемножаем'], ['$\\cdot 0$','$=0$'] ]}, + p8:{ title:'Шпаргалка § 8', rows:[ ['Знаки','как при умножении'], ['$(-)\\div(-)$','$=+$'], ['$(+)\\div(-)$','$=-$'], ['На 0','делить нельзя'] ]}, + p9:{ title:'Шпаргалка § 9', rows:[ ['Порядок','скобки → ×÷ → +−'], ['Знаки','следим внимательно'], ['$-3+4\\cdot(-2)$','$=-11$'] ]}, + app:{ title:'Шпаргалка § 11', rows:[ ['Потеплело','прибавляем'], ['Похолодало','вычитаем'], ['Долг','отрицательное число'], ['Глубина','со знаком −'] ]}, + final:{ title:'Финал главы 4', rows:[ ['6 боссов','модуль, сравнение, все действия'], ['Победа','5 из 6 и больше'], ['Награда','+40 XP и достижение «Глава 4 пройдена»'] ]} +}; +var TIPS = [ + { sec:'p1', html:'Отрицательные числа левее нуля. Чем левее число, тем оно меньше: $-6$ меньше, чем $-1$.' }, + { sec:'p2', html:'Модуль «снимает» знак: $|{-7}|=7$. Противоположное — меняет знак: для $-7$ это $7$.' }, + { sec:'p3', html:'На прямой больше то, что правее. Из двух отрицательных больше то, что ближе к нулю (меньше по модулю).' }, + { sec:'p4', html:'Сначала реши: знаки одинаковые (складываем модули) или разные (вычитаем меньший модуль из большего, знак — от большего).' }, + { sec:'p5', html:'Любое вычитание превращай в сложение: $a-b=a+(-b)$. Дальше работают правила сложения.' }, + { sec:'p6', html:'Ищи пары противоположных чисел ($-7$ и $7$) — их сумма ноль; складывай их первыми, остальное проще.' }, + { sec:'p7', html:'Сначала перемножь модули, потом поставь знак: одинаковые знаки — плюс, разные — минус. «Минус на минус — плюс».' }, + { sec:'p8', html:'Деление по тем же правилам знаков, что умножение. Сначала найди знак, потом раздели модули.' }, + { sec:'p9', html:'Порядок: скобки, потом умножение/деление, потом сложение/вычитание. Каждый шаг следи за знаком.' } +]; +var GLOSSARY = [ + { term:'отрицательное число', def:'Число меньше нуля, со знаком минус ($-3$).', sec:'p1', aliases:['отрицательное число','отрицательные числа','отрицательных чисел','отрицательным'] }, + { term:'координатная прямая', def:'Прямая с началом, направлением и единичным отрезком.', sec:'p1', aliases:['координатная прямая','координатной прямой','координатную прямую'] }, + { term:'модуль', def:'Расстояние от числа до нуля, $|a|\\ge0$.', sec:'p2', aliases:['модуль','модуля','модуле','модулем','модулю'] }, + { term:'противоположные числа', def:'Числа, отличающиеся только знаком ($a$ и $-a$); их сумма ноль.', sec:'p2', aliases:['противоположные числа','противоположное число','противоположных чисел','противоположное'] }, + { term:'целые числа', def:'Натуральные, противоположные им и ноль: $\\mathbb{Z}$.', sec:'p2', aliases:['целые числа','целых чисел','целое число'] }, + { term:'рациональные числа', def:'Числа, представимые дробью $\\frac{m}{n}$ (включая отрицательные): $\\mathbb{Q}$.', sec:'p2', aliases:['рациональные числа','рациональных чисел','рациональное число'] } +]; +var BUILDERS = { p1:buildP1, p2:buildP2, p3:buildP3, p4:buildP4, p5:buildP5, p6:buildP6, p7:buildP7, p8:buildP8, p9:buildP9, app:buildApp, final:buildFinal }; +Object.assign(window.M6, { sidebars:SIDEBARS, tips:TIPS, glossary:GLOSSARY, builders:BUILDERS });