6e64339e8a
§13 Признаки делимости (на 2/3/4/5/9/10; живой чекер: вводишь число → флажки с объяснениями + квиз «делится ли нацело»). §14 Простые/составные (определения, разложение на множители; интерактивное решето Эратосфена «найди простые 2..30» + квиз «простое или составное»). Шпаргалки/типсы §13–14. Тесты math5: 8/8. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1289 lines
123 KiB
HTML
1289 lines
123 KiB
HTML
<!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>Математика 5 · Глава 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_anim.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="123">
|
||
<div class="hdr-row">
|
||
<div>
|
||
<h1>Математика 5 · Глава 1</h1>
|
||
<div class="hdr-sub">Натуральные числа: запись и разряды · сравнение и округление · действия · делимость · простые числа</div>
|
||
</div>
|
||
<div class="hdr-side">
|
||
<a href="/textbook/math-5" class="hdr-btn" title="Ко всем главам"><svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg> К математике 5</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="123">
|
||
<h2>Натуральные числа</h2>
|
||
<p>Натуральные числа — те, которыми мы считаем предметы: $1, 2, 3, \dots$ В этой главе мы научимся <b>читать и записывать</b> большие числа по разрядам, <b>сравнивать и округлять</b> их, выполнять <b>все четыре действия</b>, возводить в <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">Интерактивный учебник «Математика 5» · Глава 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>↑↓</kbd> навигация</span><span><kbd>Enter</kbd> открыть</span><span><kbd>Esc</kbd> закрыть</span></div>
|
||
</div>
|
||
</div>
|
||
|
||
<script>
|
||
'use strict';
|
||
window.M6 = {
|
||
slug: 'math-5-ch1', lsPrefix: 'math5_ch1', xpKey: 'math5_xp', wm: '123',
|
||
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:'Измерение отрезков. Длина отрезка', 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:'p11', num:'§ 11', name:'Деление с остатком', sub:'a = b·q + r' },
|
||
{ id:'p12', num:'§ 12', name:'Делители и кратные. НОД и НОК', sub:'Общие делители и кратные' },
|
||
{ id:'p13', num:'§ 13', name:'Признаки делимости', sub:'На 2, 3, 4, 5, 9, 10' },
|
||
{ id:'p14', num:'§ 14', name:'Простые и составные числа', sub:'Разложение на множители' },
|
||
{ id:'p15', num:'§ 15', name:'Математика вокруг нас', sub:'Числа в жизни', applied:true },
|
||
{ id:'p16', num:'§ 16', name:'Движение, взвешивание, переливание', sub:'Задачи-головоломки', applied:true },
|
||
{ id:'p17', num:'§ 17', 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:'Степень числа!', p11_done:'Деление с остатком!',
|
||
p12_done:'НОД и НОК!', p13_done:'Признаки делимости!', p14_done:'Простые числа!',
|
||
p15_done:'Математика вокруг нас!', p16_done:'Задачи-головоломки!', p17_done:'Истории о числах!',
|
||
ch1_done:'Глава 1 «Натуральные числа» пройдена!'
|
||
},
|
||
startAch: ['start','Начало главы 1!'],
|
||
finalAch: ['ch1_done', 'Глава 1 «Натуральные числа» пройдена!'],
|
||
sidebars: {}, tips: [], glossary: [], searchRows: [], builders: {},
|
||
footer: 'Интерактивный учебник «Математика 5» · Глава 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('.','{,}'); }
|
||
function _grp(s){ s=String(s); var o='',c=0; for(var i=s.length-1;i>=0;i--){ o=s[i]+o; if(++c%3===0&&i>0)o='\\,'+o; } return o; }
|
||
|
||
/* ===================== § 1. КАК РЕШАТЬ ЗАДАЧУ ===================== */
|
||
function buildP1(){
|
||
var box=document.getElementById('p1-body'); var h='';
|
||
h+=makeCard('oral','Где это в жизни','1.0',
|
||
'<p>Решать задачи приходится не только на уроке. Распланировать карманные деньги, прикинуть, хватит ли времени дойти до школы, разделить пиццу поровну — всё это задачи. Хороший «решатель» сначала <b>понимает</b>, чего от него хотят, и только потом считает.</p>');
|
||
h+=makeCard('rule','Четыре шага решения','1.1',
|
||
'<p>Любую задачу удобно решать по плану из четырёх шагов:</p>'
|
||
+'<ol style="padding-left:22px;line-height:2">'
|
||
+'<li><b>Понять условие.</b> Что дано? Что нужно найти? Сделать рисунок или краткую запись.</li>'
|
||
+'<li><b>Составить план.</b> Какие действия и в каком порядке приведут к ответу?</li>'
|
||
+'<li><b>Выполнить план.</b> Аккуратно сделать вычисления.</li>'
|
||
+'<li><b>Проверить.</b> Подходит ли ответ по смыслу? Сошлось ли?</li>'
|
||
+'</ol>');
|
||
h+=makeCard('example','Разбор по шагам','1.2',
|
||
'<p>Задача: в двух коробках $40$ карандашей. В первой на $6$ больше, чем во второй. Сколько карандашей в каждой коробке?</p>'
|
||
+'<ol style="padding-left:22px;line-height:2">'
|
||
+'<li><b>Понять.</b> Дано: всего $40$, разница $6$. Найти: сколько в каждой коробке.</li>'
|
||
+'<li><b>План.</b> Уберём «лишние» $6$ из суммы, разделим остаток поровну, потом вернём $6$ в первую.</li>'
|
||
+'<li><b>Решение.</b> $(40-6):2=17$ — во второй; $17+6=23$ — в первой.</li>'
|
||
+'<li><b>Проверка.</b> $17+23=40$ и $23-17=6$. Верно!</li>'
|
||
+'</ol>');
|
||
h+=makeCard('theory','А знаешь ли ты?','1.3',
|
||
'<p>Математик <b>Дьёрдь Пойа</b> в 1945 году написал знаменитую книгу «Как решать задачу». Именно он описал эти четыре шага. Его главный совет: «Если не получается решить задачу — реши сначала более простую похожую задачу».</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="score-display"><span>Вопрос <b id="p1-i">1</b> / 5</span><span>Очки: <b id="p1-s">0</b> / 5</span></div>'
|
||
+'<div id="p1-q" class="qbox" style="font-size:1.05rem"></div>'
|
||
+'<div style="display:flex;gap:8px;justify-content:center;flex-wrap:wrap"><button class="btn primary" data-step="1">Понять условие</button><button class="btn primary" data-step="2">Составить план</button><button class="btn primary" data-step="3">Выполнить</button><button class="btn primary" data-step="4">Проверить</button></div>'
|
||
+'<div class="feedback" id="p1-fb"></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">Реши задачу по плану и введи ответ числом (без единиц).</div>'
|
||
+'<div class="score-display"><span>Задача <b id="p1-pi">1</b> / 6</span><span>Очки: <b id="p1-ps">0</b> / 6</span></div>'
|
||
+'<div id="p1-pq" 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="p1-pa" class="tinp" style="width:120px;text-align:center" placeholder="ответ"><button class="btn primary" id="p1-pgo">Проверить</button></div>'
|
||
+'<div class="feedback" id="p1-pfb"></div></div>';
|
||
h+=secNav(null,'p2')+readBtn('p1');
|
||
box.innerHTML=h; renderMath(box);
|
||
|
||
(function(){
|
||
var Q=[
|
||
{t:'«Сделаю краткую запись: дано $40$, разница $6$.»', s:1},
|
||
{t:'«Сначала вычту $6$, потом разделю остаток на $2$.»', s:2},
|
||
{t:'«$40-6=34$, затем $34:2=17$.»', s:3},
|
||
{t:'«Проверю: $17+23=40$ — сходится.»', s:4},
|
||
{t:'«Что именно нужно найти в задаче?»', s:1},
|
||
{t:'«Запишу ответ и подумаю, разумен ли он.»', s:4},
|
||
{t:'«Каким действием это решается?»', s:2},
|
||
{t:'«Аккуратно посчитаю столбиком.»', s:3}
|
||
];
|
||
var order=[],i=0,score=0,cur=null;
|
||
function reorder(){ 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; } }
|
||
reorder();
|
||
function show(){ if(i>=5){ document.getElementById('p1-q').innerHTML='<b>Готово!</b> Результат: '+score+' / 5'; if(score>=4){addXp(15,'p1-iv1');bumpProgress('p1',30);}else if(score>=2){addXp(8,'p1-iv1');bumpProgress('p1',16);} return; }
|
||
cur=Q[order[i]]; document.getElementById('p1-i').textContent=i+1;
|
||
document.getElementById('p1-q').innerHTML=cur.t; renderMath(document.getElementById('p1-q'));
|
||
document.getElementById('p1-fb').style.display='none'; }
|
||
function ans(s){ if(i>=5)return; var names=['','Понять условие','Составить план','Выполнить','Проверить']; var fb=document.getElementById('p1-fb');
|
||
if(s===cur.s){ score++; feedback(fb,true,'✓ Верно — это шаг «'+names[cur.s]+'».'); } else feedback(fb,false,'✗ Нет. Это шаг «'+names[cur.s]+'».');
|
||
document.getElementById('p1-s').textContent=score; i++; setTimeout(show,1100); }
|
||
document.querySelectorAll('#p1-iv1 [data-step]').forEach(function(b){ b.addEventListener('click',function(){ ans(+b.getAttribute('data-step')); }); });
|
||
show();
|
||
})();
|
||
|
||
(function(){
|
||
var PROB=[
|
||
{q:'В двух корзинах $30$ яблок. В первой на $4$ больше, чем во второй. Сколько яблок во второй?',a:13},
|
||
{q:'Книга стоит $7$ р., тетрадь — на $5$ р. дешевле. Сколько стоит тетрадь?',a:2},
|
||
{q:'Купили $3$ ручки по $2$ р. Сколько заплатили?',a:6},
|
||
{q:'У Маши $24$ наклейки, она отдала треть. Сколько наклеек она отдала?',a:8},
|
||
{q:'В классе $28$ учеников, девочек $15$. Сколько мальчиков?',a:13},
|
||
{q:'За $5$ дней прочитали $45$ страниц поровну. Сколько страниц в день?',a:9},
|
||
{q:'Ленту $200$ см разрезали на части по $25$ см. Сколько получилось частей?',a:8},
|
||
{q:'Было $50$ р., потратили $18$ р. и $12$ р. Сколько осталось?',a:20}
|
||
];
|
||
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),t=order[j];order[j]=order[k];order[k]=t; } }
|
||
reorder();
|
||
function show(){ if(i>=6){ document.getElementById('p1-pq').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',16);} return; }
|
||
cur=PROB[order[i]]; document.getElementById('p1-pi').textContent=i+1;
|
||
document.getElementById('p1-pq').innerHTML=cur.q; renderMath(document.getElementById('p1-pq'));
|
||
document.getElementById('p1-pa').value=''; document.getElementById('p1-pfb').style.display='none'; }
|
||
function go(){ if(i>=6)return; var fb=document.getElementById('p1-pfb'), v=parseFloat(document.getElementById('p1-pa').value.replace(',','.').trim());
|
||
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('p1-ps').textContent=score; i++; setTimeout(show,1200); }
|
||
document.getElementById('p1-pgo').addEventListener('click',go);
|
||
document.getElementById('p1-pa').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
|
||
show();
|
||
})();
|
||
}
|
||
|
||
/* ===================== § 2. ЧТЕНИЕ И ЗАПИСЬ. РАЗРЯДЫ ===================== */
|
||
function buildP2(){
|
||
var box=document.getElementById('p2-body'); var h='';
|
||
h+=makeCard('oral','Где это в жизни','2.0',
|
||
'<p>Большие числа окружают нас: на Земле живёт около $8\\,000\\,000\\,000$ человек, до Луны примерно $384\\,000$ км, а у современного смартфона памяти $128\\,000\\,000\\,000$ байт. Чтобы не запутаться в нулях, числа разбивают на <b>классы</b> по три цифры.</p>');
|
||
h+=makeCard('theory','Натуральные числа и нуль','2.1',
|
||
'<p><b>Натуральные числа</b> — это числа, которыми считают предметы: $1, 2, 3, 4, \\dots$ Их ряд бесконечен: какое бы число ни взяли, всегда есть следующее.</p>'
|
||
+'<p>Число <b>нуль</b> $(0)$ натуральным не считают, но без него не записать, например, число $108$. Множество натуральных чисел обозначают буквой $\\mathbb{N}$.</p>');
|
||
h+=makeCard('rule','Классы и разряды','2.2',
|
||
'<p>Запись числа читают <b>справа налево</b> по разрядам и группируют по три — в <b>классы</b>:</p>'
|
||
+'<table class="tbl"><tr><th colspan="3">Миллионы</th><th colspan="3">Тысячи</th><th colspan="3">Единицы</th></tr>'
|
||
+'<tr><td>сот</td><td>дес</td><td>ед</td><td>сот</td><td>дес</td><td>ед</td><td>сот</td><td>дес</td><td>ед</td></tr>'
|
||
+'<tr><td>0</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td></tr></table>'
|
||
+'<p>Это число $12\\,345\\,678$ — «двенадцать миллионов триста сорок пять тысяч шестьсот семьдесят восемь».</p>');
|
||
h+=makeCard('example','Читаем число','2.3',
|
||
'<p>$5\\,204$ — пять тысяч двести четыре. $70\\,030$ — семьдесят тысяч тридцать. $300\\,000$ — триста тысяч.</p>'
|
||
+'<p>Нуль в разряде означает, что этого разряда «нет»: в числе $70\\,030$ нет ни сотен, ни единиц тысяч, ни единиц.</p>');
|
||
h+=makeCard('example','Разбор по шагам','2.4',
|
||
'<p>Запишем цифрами число «двести три тысячи сорок».</p>'
|
||
+'<ol style="padding-left:22px;line-height:2">'
|
||
+'<li>Находим классы: «двести три <b>тысячи</b>» — класс тысяч $=203$; «сорок» — класс единиц $=40$.</li>'
|
||
+'<li>Каждый класс — ровно $3$ цифры: тысячи $\\to 203$, единицы $\\to 040$.</li>'
|
||
+'<li>Соединяем: $203\\,040$.</li>'
|
||
+'<li>Проверка: читаем обратно — «двести три тысячи сорок». Верно!</li>'
|
||
+'</ol>');
|
||
h+=makeCard('theory','А знаешь ли ты?','2.5',
|
||
'<p>Число $10^{100}$ (единица со ста нулями) называется <b>гугол</b>. Это слово придумал девятилетний племянник математика Эдварда Каснера. От него же произошло название поисковика Google. А гуголов в одном гуголплексе — гугол!</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">Введи натуральное число (до 9 цифр) — оно разложится по классам и разрядам.</div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap;margin-bottom:8px"><input type="text" id="p2-pv-in" class="tinp" style="width:170px;text-align:center" value="12345678" placeholder="например 305040"><button class="btn primary" id="p2-pv-go">Разложить</button></div>'
|
||
+'<div id="p2-pv-out" style="overflow-x:auto"></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">Назови цифру в указанном разряде данного числа. Введи одну цифру (0–9).</div>'
|
||
+'<div class="score-display"><span>Вопрос <b id="p2-qi">1</b> / 6</span><span>Очки: <b id="p2-qs">0</b> / 6</span></div>'
|
||
+'<div id="p2-qq" class="qbox"></div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p2-qa" class="tinp" style="width:90px;text-align:center" min="0" max="9"><button class="btn primary" id="p2-qgo">Проверить</button></div>'
|
||
+'<div class="feedback" id="p2-qfb"></div></div>';
|
||
h+=secNav('p1','p3')+readBtn('p2');
|
||
box.innerHTML=h; renderMath(box);
|
||
|
||
(function(){
|
||
var CLS=[['Миллионы','#4f46e5'],['Тысячи','#0d9488'],['Единицы','#e11d48']];
|
||
var LAB=['сот','дес','ед','сот','дес','ед','сот','дес','ед'];
|
||
function render(){
|
||
var raw=(document.getElementById('p2-pv-in').value||'').replace(/\D/g,'');
|
||
if(!raw)raw='0'; if(raw.length>9)raw=raw.slice(-9);
|
||
var num=parseInt(raw,10); var s=raw.padStart(9,'0');
|
||
var firstSig=s.search(/[1-9]/); if(firstSig<0)firstSig=8;
|
||
var th='<table class="tbl" style="margin:0 auto"><tr>';
|
||
for(var c=0;c<3;c++) th+='<th colspan="3" style="color:'+CLS[c][1]+'">'+CLS[c][0]+'</th>';
|
||
th+='</tr><tr>';
|
||
for(var k=0;k<9;k++) th+='<td style="font-size:.62rem;color:var(--muted)">'+LAB[k]+'</td>';
|
||
th+='</tr><tr>';
|
||
for(var d=0;d<9;d++){ var grp=Math.floor(d/3),dim=d<firstSig; th+='<td style="font-size:1.4rem;font-weight:800;color:'+CLS[grp][1]+';opacity:'+(dim?0.18:1)+'">'+s[d]+'</td>'; }
|
||
th+='</tr></table>';
|
||
th+='<div style="text-align:center;margin-top:10px;font-size:1.1rem;font-weight:700">$'+_grp(num)+'$</div>';
|
||
var out=document.getElementById('p2-pv-out'); out.innerHTML=th; renderMath(out);
|
||
}
|
||
document.getElementById('p2-pv-go').addEventListener('click',render);
|
||
document.getElementById('p2-pv-in').addEventListener('keydown',function(e){ if(e.key==='Enter')render(); });
|
||
render();
|
||
})();
|
||
|
||
(function(){
|
||
var PL=[['единиц',0],['десятков',1],['сотен',2],['единиц тысяч',3],['десятков тысяч',4],['сотен тысяч',5]];
|
||
var i=0,score=0,cur=null;
|
||
function gen(){ var n=_ri(100000,999999), s=String(n), pl=_pick(PL); cur={n:n, s:s, place:pl[0], digit:+s[s.length-1-pl[1]]}; }
|
||
function show(){ if(i>=6){ document.getElementById('p2-qq').innerHTML='<b>Готово!</b> Результат: '+score+' / 6'; if(score>=5){addXp(15,'p2-iv2');bumpProgress('p2',30);}else if(score>=3){addXp(8,'p2-iv2');bumpProgress('p2',18);} return; }
|
||
gen(); document.getElementById('p2-qi').textContent=i+1;
|
||
document.getElementById('p2-qq').innerHTML='Число $'+_grp(cur.n)+'$. Какая цифра в разряде <b>'+cur.place+'</b>?'; renderMath(document.getElementById('p2-qq'));
|
||
document.getElementById('p2-qa').value=''; document.getElementById('p2-qfb').style.display='none'; }
|
||
function go(){ if(i>=6)return; var fb=document.getElementById('p2-qfb'), a=parseInt(document.getElementById('p2-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('p2-qs').textContent=score; i++; setTimeout(show,1100); }
|
||
document.getElementById('p2-qgo').addEventListener('click',go);
|
||
document.getElementById('p2-qa').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:160px;text-align:center" placeholder="ответ"><button class="btn primary" id="fin-go">Удар!</button></div>'
|
||
+'<div class="feedback" id="fin-fb"></div></div>';
|
||
h+=secNav('p17',null)+readBtn('final','Завершить главу 1 (+10 XP)');
|
||
box.innerHTML=h; renderMath(box);
|
||
|
||
(function(){
|
||
var bosses=[
|
||
function(){ var n=_ri(100000,999999), s=String(n); return {name:'Страж Разрядов', q:'В числе $'+_grp(n)+'$ назови цифру в разряде <b>тысяч</b>.', ans:+s[s.length-4]}; },
|
||
function(){ var n=_ri(1200,9800); return {name:'Округлитель', q:'Округли $'+_grp(n)+'$ до <b>сотен</b>.', ans:Math.round(n/100)*100}; },
|
||
function(){ var a=_ri(2400,8600), b=_ri(1100,2300); return {name:'Сумматор', q:'Вычисли $'+_grp(a)+' + '+_grp(b)+'$.', ans:a+b}; },
|
||
function(){ var a=_ri(13,40), b=_ri(11,30); return {name:'Множитель', q:'Вычисли $'+a+' \\cdot '+b+'$.', ans:a*b}; },
|
||
function(){ var p=_pick([[2,5,32],[3,4,81],[5,3,125],[2,8,256],[4,3,64],[6,2,36]]); return {name:'Повелитель Степеней', q:'Вычисли $'+p[0]+'^{'+p[1]+'}$.', ans:p[2]}; }
|
||
];
|
||
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,'✓ Босс повержен! Ответ '+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();
|
||
})();
|
||
}
|
||
|
||
/* ===================== § 3. СРАВНЕНИЕ НАТУРАЛЬНЫХ ЧИСЕЛ ===================== */
|
||
function buildP3(){
|
||
var box=document.getElementById('p3-body'); var h='';
|
||
h+=makeCard('oral','Где это в жизни','3.0',
|
||
'<p>Сравнивать числа приходится постоянно: где цена ниже, у какого телефона больше памяти, в каком городе больше жителей, чей результат в игре выше. Натуральные числа сравнивать легко — нужно лишь знать два простых правила.</p>');
|
||
h+=makeCard('rule','Как сравнивать натуральные числа','3.1',
|
||
'<p>1) Из двух чисел больше то, в записи которого <b>больше цифр</b> (без лишних нулей слева): $1000>999$.</p>'
|
||
+'<p>2) Если цифр <b>поровну</b> — сравнивают <b>поразрядно слева направо</b>: на первом же различии больше то число, у которого цифра больше.</p>'
|
||
+'<p>Знаки: $<$ «меньше», $>$ «больше», $=$ «равно». Острый угол знака всегда «смотрит» на меньшее число.</p>');
|
||
h+=makeCard('example','Примеры','3.2',
|
||
'<p>$58>9$ (две цифры против одной). $347<352$ (сотни равны, десятки $4<5$). $1\\,200>1\\,199$.</p>');
|
||
h+=makeCard('example','Разбор по шагам','3.3',
|
||
'<p>Сравним $4\\,019$ и $4\\,190$.</p>'
|
||
+'<ol style="padding-left:22px;line-height:2">'
|
||
+'<li>Цифр поровну — по $4$. Сравниваем поразрядно.</li>'
|
||
+'<li>Тысячи: $4=4$. Сотни: $0<1$ — на этом различии всё решается.</li>'
|
||
+'<li>Значит $4\\,019<4\\,190$.</li>'
|
||
+'</ol>');
|
||
h+=makeCard('theory','А знаешь ли ты?','3.4',
|
||
'<p>Знаки $>$ и $<$ придумал английский математик <b>Томас Хэрриот</b> (изданы в $1631$ году). А знак равенства $=$ ещё раньше, в $1557$ году, предложил Роберт Рекорд: «нет двух вещей более равных, чем две параллельные чёрточки».</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-i">1</b> / 6</span><span>Очки: <b id="p3-s">0</b> / 6</span></div>'
|
||
+'<div id="p3-q" class="qbox"></div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;flex-wrap:wrap"><button class="btn primary" data-cmp=">">></button><button class="btn primary" data-cmp="=">=</button><button class="btn primary" data-cmp="<"><</button></div>'
|
||
+'<div class="feedback" id="p3-fb"></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">Из четырёх чисел нажми самое большое.</div>'
|
||
+'<div class="score-display"><span>Вопрос <b id="p3-mi">1</b> / 5</span><span>Очки: <b id="p3-ms">0</b> / 5</span></div>'
|
||
+'<div id="p3-mq" style="display:flex;gap:10px;justify-content:center;flex-wrap:wrap;margin:10px 0"></div>'
|
||
+'<div class="feedback" id="p3-mfb"></div></div>';
|
||
h+=secNav('p2','p4')+readBtn('p3');
|
||
box.innerHTML=h; renderMath(box);
|
||
|
||
(function(){
|
||
var i=0,score=0,cur=null;
|
||
function gen(){ var a,b; if(_ri(0,3)===0){ a=_ri(10,9999); b=a; } else { a=_ri(10,9999); b=_ri(10,9999); } cur={a:a,b:b}; }
|
||
function show(){ if(i>=6){ document.getElementById('p3-q').innerHTML='<b>Готово!</b> Результат: '+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-q').innerHTML='$'+_grp(cur.a)+' \\;\\square\\; '+_grp(cur.b)+'$'; renderMath(document.getElementById('p3-q'));
|
||
document.getElementById('p3-fb').style.display='none'; }
|
||
function ans(sym){ if(i>=6)return; var fb=document.getElementById('p3-fb'), correct=cur.a>cur.b?'>':(cur.a<cur.b?'<':'=');
|
||
if(sym===correct){ score++; feedback(fb,true,'✓ Верно: $'+_grp(cur.a)+' '+correct+' '+_grp(cur.b)+'$.'); } else feedback(fb,false,'✗ Нет. Верно: $'+_grp(cur.a)+' '+correct+' '+_grp(cur.b)+'$.');
|
||
document.getElementById('p3-s').textContent=score; i++; setTimeout(show,1100); }
|
||
document.querySelectorAll('#p3-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 arr=[],mx=_ri(1000,99999); arr.push(mx); while(arr.length<4){ var x=_ri(100,99999); if(x!==mx&&arr.indexOf(x)<0)arr.push(x); } for(var j=arr.length-1;j>0;j--){ var k=_ri(0,j),t=arr[j];arr[j]=arr[k];arr[k]=t; } cur={arr:arr,max:mx}; }
|
||
function show(){ if(i>=5){ document.getElementById('p3-mq').innerHTML='<b>Готово! '+score+' / 5</b>'; 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;
|
||
var html=''; cur.arr.forEach(function(x){ html+='<button class="btn primary" data-x="'+x+'">'+x.toLocaleString('ru-RU')+'</button>'; });
|
||
document.getElementById('p3-mq').innerHTML=html;
|
||
document.querySelectorAll('#p3-mq [data-x]').forEach(function(b){ b.addEventListener('click',function(){ ans(+b.getAttribute('data-x')); }); });
|
||
document.getElementById('p3-mfb').style.display='none'; }
|
||
function ans(x){ if(i>=5)return; var fb=document.getElementById('p3-mfb');
|
||
if(x===cur.max){ score++; feedback(fb,true,'✓ Верно! Наибольшее — '+cur.max.toLocaleString('ru-RU')+'.'); } else feedback(fb,false,'✗ Нет. Наибольшее — '+cur.max.toLocaleString('ru-RU')+'.');
|
||
document.getElementById('p3-ms').textContent=score; i++; setTimeout(show,1100); }
|
||
show();
|
||
})();
|
||
}
|
||
|
||
/* ===================== § 4. ТОЧКА, ПРЯМАЯ, ЛУЧ, ОТРЕЗОК, ПЛОСКОСТЬ ===================== */
|
||
function buildP4(){
|
||
var box=document.getElementById('p4-body'); var h='';
|
||
h+=makeCard('oral','Где это в жизни','4.0',
|
||
'<p>Геометрия начинается с простых образов. Натянутая нить — это <b>отрезок</b>, луч прожектора уходит в небо как <b>луч</b>, ровная гладь озера — кусочек <b>плоскости</b>, а кончик карандаша оставляет <b>точку</b>. Из этих «кирпичиков» строят все чертежи.</p>');
|
||
h+=makeCard('theory','Главные геометрические фигуры','4.1',
|
||
'<p><b>Точка</b> — самая простая фигура, у неё нет размеров. Обозначают большой буквой: $A$, $B$.</p>'
|
||
+'<p><b>Прямая</b> бесконечна в обе стороны. Обозначают малой буквой $a$ или двумя точками: прямая $AB$.</p>'
|
||
+'<p><b>Луч</b> имеет начало и уходит в бесконечность в одну сторону. Обозначают $OA$ (первой ставят <b>начало</b> $O$).</p>'
|
||
+'<p><b>Отрезок</b> — часть прямой между двумя точками-концами: отрезок $AB$.</p>'
|
||
+'<p><b>Плоскость</b> — бесконечная ровная поверхность (например, поверхность стола, продолженная во все стороны).</p>');
|
||
h+=makeCard('rule','Сколько фигур можно провести','4.2',
|
||
'<p>Через одну точку можно провести <b>сколько угодно</b> прямых. А через <b>две</b> точки — <b>только одну</b> прямую. Это важное свойство прямой.</p>');
|
||
h+=makeCard('example','Разбор по шагам','4.3',
|
||
'<p>На прямой отметили $4$ точки: $A, B, C, D$. Сколько получилось отрезков?</p>'
|
||
+'<ol style="padding-left:22px;line-height:2">'
|
||
+'<li>Отрезок задаётся <b>двумя</b> точками-концами.</li>'
|
||
+'<li>Считаем пары: $AB, AC, AD, BC, BD, CD$.</li>'
|
||
+'<li>Получилось $6$ отрезков.</li>'
|
||
+'</ol>');
|
||
h+=makeCard('theory','А знаешь ли ты?','4.4',
|
||
'<p>Около $2300$ лет назад древнегреческий учёный <b>Евклид</b> написал книгу «Начала», с которой и начинается геометрия. Он первым строго описал точку, прямую и плоскость. По «Началам» учились более двух тысяч лет — это один из самых издаваемых учебников в истории!</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> / 5</span><span>Очки: <b id="p4-s">0</b> / 5</span></div>'
|
||
+'<div id="p4-fig" style="text-align:center;margin:8px 0"></div>'
|
||
+'<div style="display:flex;gap:8px;justify-content:center;flex-wrap:wrap"><button class="btn primary" data-f="точка">точка</button><button class="btn primary" data-f="прямая">прямая</button><button class="btn primary" data-f="луч">луч</button><button class="btn primary" data-f="отрезок">отрезок</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">На прямой отмечено несколько точек. Сколько всего отрезков они задают?</div>'
|
||
+'<div class="score-display"><span>Вопрос <b id="p4-ci">1</b> / 5</span><span>Очки: <b id="p4-cs">0</b> / 5</span></div>'
|
||
+'<div id="p4-cfig" style="text-align:center;margin:8px 0"></div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p4-ca" class="tinp" style="width:90px;text-align:center" min="0"><button class="btn primary" id="p4-cgo">Проверить</button></div>'
|
||
+'<div class="feedback" id="p4-cfb"></div></div>';
|
||
h+=secNav('p3','p5')+readBtn('p4');
|
||
box.innerHTML=h; renderMath(box);
|
||
|
||
function figSVG(type){
|
||
var W=300,H=70,y=40;
|
||
var s='<svg viewBox="0 0 '+W+' '+H+'" width="300" style="max-width:100%"><defs></defs>';
|
||
if(type==='точка'){ s+='<circle cx="150" cy="'+y+'" r="5" fill="#4f46e5"/><text x="160" y="'+(y-6)+'" font-size="13" font-weight="700" fill="#4f46e5">A</text>'; }
|
||
else if(type==='прямая'){ s+='<line x1="14" y1="'+y+'" x2="286" y2="'+y+'" stroke="#4f46e5" stroke-width="2.4"/><polygon points="14,'+y+' 22,'+(y-4)+' 22,'+(y+4)+'" fill="#4f46e5"/><polygon points="286,'+y+' 278,'+(y-4)+' 278,'+(y+4)+'" fill="#4f46e5"/>'; }
|
||
else if(type==='луч'){ s+='<line x1="60" y1="'+y+'" x2="286" y2="'+y+'" stroke="#0d9488" stroke-width="2.4"/><circle cx="60" cy="'+y+'" r="4.5" fill="#0d9488"/><polygon points="286,'+y+' 278,'+(y-4)+' 278,'+(y+4)+'" fill="#0d9488"/><text x="50" y="'+(y-8)+'" font-size="13" font-weight="700" fill="#0d9488">O</text>'; }
|
||
else { s+='<line x1="70" y1="'+y+'" x2="230" y2="'+y+'" stroke="#e11d48" stroke-width="2.6"/><circle cx="70" cy="'+y+'" r="4.5" fill="#e11d48"/><circle cx="230" cy="'+y+'" r="4.5" fill="#e11d48"/><text x="62" y="'+(y-8)+'" font-size="13" font-weight="700" fill="#e11d48">A</text><text x="224" y="'+(y-8)+'" font-size="13" font-weight="700" fill="#e11d48">B</text>'; }
|
||
return s+'</svg>';
|
||
}
|
||
(function(){
|
||
var T=['точка','прямая','луч','отрезок'];
|
||
var i=0,score=0,cur=null;
|
||
function gen(){ cur=_pick(T); }
|
||
function show(){ if(i>=5){ document.getElementById('p4-fig').innerHTML='<b>Готово! '+score+' / 5</b>'; if(score>=4){addXp(15,'p4-iv1');bumpProgress('p4',30);}else if(score>=2){addXp(8,'p4-iv1');bumpProgress('p4',16);} return; }
|
||
gen(); document.getElementById('p4-i').textContent=i+1;
|
||
document.getElementById('p4-fig').innerHTML=figSVG(cur);
|
||
document.getElementById('p4-fb').style.display='none'; }
|
||
function ans(f){ if(i>=5)return; var fb=document.getElementById('p4-fb');
|
||
if(f===cur){ score++; feedback(fb,true,'✓ Верно — это '+cur+'.'); } else feedback(fb,false,'✗ Нет. Это '+cur+'.');
|
||
document.getElementById('p4-s').textContent=score; i++; setTimeout(show,1100); }
|
||
document.querySelectorAll('#p4-iv1 [data-f]').forEach(function(b){ b.addEventListener('click',function(){ ans(b.getAttribute('data-f')); }); });
|
||
show();
|
||
})();
|
||
|
||
(function(){
|
||
var i=0,score=0,cur=null;
|
||
function gen(){ var n=_ri(3,6); cur={n:n, ans:n*(n-1)/2}; }
|
||
function show(){ if(i>=5){ document.getElementById('p4-cfig').innerHTML='<b>Готово! '+score+' / 5</b>'; document.getElementById('p4-cq')&&0; 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-ci').textContent=i+1;
|
||
var W=300,y=30,names=['A','B','C','D','E','F'],s='<svg viewBox="0 0 '+W+' 50" width="300" style="max-width:100%"><line x1="20" y1="'+y+'" x2="280" y2="'+y+'" stroke="#94a3b8" stroke-width="2"/>';
|
||
for(var k=0;k<cur.n;k++){ var x=20+260*k/(cur.n-1); s+='<circle cx="'+x+'" cy="'+y+'" r="4.5" fill="#4f46e5"/><text x="'+x+'" y="'+(y-9)+'" font-size="12" font-weight="700" fill="#4f46e5" text-anchor="middle">'+names[k]+'</text>'; }
|
||
s+='</svg>';
|
||
document.getElementById('p4-cfig').innerHTML=s;
|
||
document.getElementById('p4-ca').value=''; document.getElementById('p4-cfb').style.display='none'; }
|
||
function go(){ if(i>=5)return; var fb=document.getElementById('p4-cfb'), a=parseInt(document.getElementById('p4-ca').value,10);
|
||
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
|
||
if(a===cur.ans){ score++; feedback(fb,true,'✓ Верно! '+cur.n+' точки задают '+cur.ans+' отрезков.'); } else feedback(fb,false,'✗ Нет. Правильно: '+cur.ans+' (пары из '+cur.n+' точек).');
|
||
document.getElementById('p4-cs').textContent=score; i++; setTimeout(show,1300); }
|
||
document.getElementById('p4-cgo').addEventListener('click',go);
|
||
document.getElementById('p4-ca').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
|
||
show();
|
||
})();
|
||
}
|
||
|
||
/* ===================== § 5. ИЗМЕРЕНИЕ ОТРЕЗКОВ. ДЛИНА ===================== */
|
||
function buildP5(){
|
||
var box=document.getElementById('p5-body'); var h='';
|
||
h+=makeCard('oral','Где это в жизни','5.0',
|
||
'<p>Длину измеряют каждый день: рост на медосмотре, размер стола, расстояние до школы, длину доски при ремонте. Чтобы понять друг друга, люди договорились о единых <b>единицах длины</b>.</p>');
|
||
h+=makeCard('rule','Единицы длины','5.1',
|
||
'<p>$1$ см $=10$ мм, $1$ дм $=10$ см, $1$ м $=10$ дм $=100$ см $=1000$ мм, $1$ км $=1000$ м.</p>'
|
||
+'<p><b>Длина отрезка</b> — это число, которое показывает, сколько раз в нём укладывается единичный отрезок (например, $1$ см). Равные отрезки имеют равные длины.</p>');
|
||
h+=makeCard('example','Примеры перевода','5.2',
|
||
'<p>$3$ см $=30$ мм. $250$ см $=2$ м $50$ см. $1$ м $7$ см $=107$ см.</p>');
|
||
h+=makeCard('example','Разбор по шагам','5.3',
|
||
'<p>Вырази $3$ м $5$ см в сантиметрах.</p>'
|
||
+'<ol style="padding-left:22px;line-height:2">'
|
||
+'<li>$1$ м $=100$ см, значит $3$ м $=300$ см.</li>'
|
||
+'<li>Добавляем оставшиеся $5$ см: $300+5$.</li>'
|
||
+'<li>Ответ: $3$ м $5$ см $=305$ см.</li>'
|
||
+'</ol>');
|
||
h+=makeCard('theory','А знаешь ли ты?','5.4',
|
||
'<p>Раньше длину мерили частями тела: локоть, ладонь, фут («ступня»). Но у всех они разные! Поэтому в $1799$ году ввели <b>метр</b>. Сегодня метр определяют через скорость света — это самый точный эталон длины в мире.</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="score-display"><span>Вопрос <b id="p5-i">1</b> / 5</span><span>Очки: <b id="p5-s">0</b> / 5</span></div>'
|
||
+'<div id="p5-fig" style="text-align:center;margin:8px 0;overflow-x:auto"></div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p5-a" class="tinp" style="width:90px;text-align:center" min="0"><span>см</span><button class="btn primary" id="p5-go">Проверить</button></div>'
|
||
+'<div class="feedback" id="p5-fb"></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-ui">1</b> / 6</span><span>Очки: <b id="p5-us">0</b> / 6</span></div>'
|
||
+'<div id="p5-uq" class="qbox"></div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p5-ua" class="tinp" style="width:110px;text-align:center"><button class="btn primary" id="p5-ugo">Проверить</button></div>'
|
||
+'<div class="feedback" id="p5-ufb"></div></div>';
|
||
h+=secNav('p4','p6')+readBtn('p5');
|
||
box.innerHTML=h; renderMath(box);
|
||
|
||
(function(){
|
||
var i=0,score=0,cur=null;
|
||
function gen(){ cur=_ri(2,14); }
|
||
function show(){ if(i>=5){ document.getElementById('p5-fig').innerHTML='<b>Готово! '+score+' / 5</b>'; if(score>=4){addXp(15,'p5-iv1');bumpProgress('p5',30);}else if(score>=2){addXp(8,'p5-iv1');bumpProgress('p5',16);} return; }
|
||
gen(); document.getElementById('p5-i').textContent=i+1;
|
||
var x0=20,unit=18,W=x0+15*unit+24,H=64,yr=44;
|
||
var s='<svg viewBox="0 0 '+W+' '+H+'" width="'+W+'" style="max-width:100%"><rect x="'+x0+'" y="'+yr+'" width="'+(15*unit)+'" height="16" fill="#fef3c7" stroke="#d97706"/>';
|
||
for(var k=0;k<=15;k++){ var x=x0+k*unit; s+='<line x1="'+x+'" y1="'+yr+'" x2="'+x+'" y2="'+(yr+(k%5===0?16:9))+'" stroke="#92400e" stroke-width="1"/>'; if(k%5===0)s+='<text x="'+x+'" y="'+(yr-3)+'" font-size="9" fill="#92400e" text-anchor="middle">'+k+'</text>'; }
|
||
s+='<line x1="'+x0+'" y1="32" x2="'+(x0+cur*unit)+'" y2="32" stroke="#4f46e5" stroke-width="5" stroke-linecap="round"/>';
|
||
s+='</svg>';
|
||
document.getElementById('p5-fig').innerHTML=s;
|
||
document.getElementById('p5-a').value=''; document.getElementById('p5-fb').style.display='none'; }
|
||
function go(){ if(i>=5)return; var fb=document.getElementById('p5-fb'), a=parseInt(document.getElementById('p5-a').value,10);
|
||
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
|
||
if(a===cur){ score++; feedback(fb,true,'✓ Верно! Длина '+cur+' см.'); } else feedback(fb,false,'✗ Нет. Отрезок доходит до '+cur+' см.');
|
||
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();
|
||
})();
|
||
|
||
(function(){
|
||
var i=0,score=0,cur=null;
|
||
function gen(){ var t=_ri(0,3),a;
|
||
if(t===0){ a=_ri(2,9); cur={q:a+'\\text{ см} = \\square \\text{ мм}',ans:a*10}; }
|
||
else if(t===1){ a=_ri(2,9); cur={q:a+'\\text{ м} = \\square \\text{ см}',ans:a*100}; }
|
||
else if(t===2){ var m=_ri(1,5),c=_ri(5,95); cur={q:m+'\\text{ м } '+c+'\\text{ см} = \\square \\text{ см}',ans:m*100+c}; }
|
||
else { a=_ri(2,9); cur={q:a+'\\text{ км} = \\square \\text{ м}',ans:a*1000}; } }
|
||
function show(){ if(i>=6){ document.getElementById('p5-uq').innerHTML='<b>Готово! '+score+' / 6</b>'; 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-ui').textContent=i+1;
|
||
document.getElementById('p5-uq').innerHTML='$'+cur.q+'$'; renderMath(document.getElementById('p5-uq'));
|
||
document.getElementById('p5-ua').value=''; document.getElementById('p5-ufb').style.display='none'; }
|
||
function go(){ if(i>=6)return; var fb=document.getElementById('p5-ufb'), a=parseInt(document.getElementById('p5-ua').value,10);
|
||
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
|
||
if(a===cur.ans){ score++; feedback(fb,true,'✓ Верно! Ответ '+cur.ans+'.'); } else feedback(fb,false,'✗ Нет. Правильно: '+cur.ans+'.');
|
||
document.getElementById('p5-us').textContent=score; i++; setTimeout(show,1200); }
|
||
document.getElementById('p5-ugo').addEventListener('click',go);
|
||
document.getElementById('p5-ua').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
|
||
show();
|
||
})();
|
||
}
|
||
|
||
/* ===================== § 6. КООРДИНАТНЫЙ ЛУЧ ===================== */
|
||
function buildP6(){
|
||
var box=document.getElementById('p6-body'); var h='';
|
||
h+=makeCard('oral','Где это в жизни','6.0',
|
||
'<p>Линейка, шкала термометра, разметка на стадионе, числовая ось в играх-«ходилках» — всё это <b>координатные лучи</b>. Каждому числу соответствует своя точка, и наоборот.</p>');
|
||
h+=makeCard('theory','Что такое координатный луч','6.1',
|
||
'<p><b>Координатный луч</b> — это луч, на котором выбрали: начало $O$ (ему соответствует число $0$), <b>направление</b> (обычно вправо) и <b>единичный отрезок</b>.</p>'
|
||
+'<p>Число, соответствующее точке, называют её <b>координатой</b>. Запись $A(3)$ означает: точка $A$ имеет координату $3$.</p>');
|
||
h+=makeCard('rule','Как отметить число','6.2',
|
||
'<p>Чтобы отметить число $5$, откладывают от начала $O$ пять единичных отрезков вправо. Чем больше число — тем правее точка. Поэтому на луче из двух чисел больше то, что <b>правее</b>.</p>');
|
||
h+=makeCard('example','Разбор по шагам','6.3',
|
||
'<p>Отметим число $7$ на координатном луче с единичным отрезком в одну клетку.</p>'
|
||
+'<ol style="padding-left:22px;line-height:2">'
|
||
+'<li>Ставим начало $O$ и число $0$.</li>'
|
||
+'<li>Откладываем вправо $7$ единичных отрезков.</li>'
|
||
+'<li>В конце ставим точку и подписываем $A(7)$.</li>'
|
||
+'</ol>');
|
||
h+=makeCard('theory','А знаешь ли ты?','6.4',
|
||
'<p>Идею изображать числа точками на прямой развил французский математик <b>Рене Декарт</b> в XVII веке. Позже из координатного луча выросла целая координатная плоскость — её ты изучишь в $6$ классе.</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="score-display"><span>Вопрос <b id="p6-i">1</b> / 6</span><span>Очки: <b id="p6-s">0</b> / 6</span></div>'
|
||
+'<div id="p6-fig"></div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p6-a" class="tinp" style="width:90px;text-align:center" min="0"><button class="btn primary" id="p6-go">Проверить</button></div>'
|
||
+'<div class="feedback" id="p6-fb"></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-di">1</b> / 5</span><span>Очки: <b id="p6-ds">0</b> / 5</span></div>'
|
||
+'<div id="p6-dfig"></div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p6-da" class="tinp" style="width:90px;text-align:center" min="0"><button class="btn primary" id="p6-dgo">Проверить</button></div>'
|
||
+'<div class="feedback" id="p6-dfb"></div></div>';
|
||
h+=secNav('p5','p7')+readBtn('p6');
|
||
box.innerHTML=h; renderMath(box);
|
||
|
||
(function(){
|
||
var i=0,score=0,cur=null;
|
||
function gen(){ cur=_ri(1,10); }
|
||
function show(){ if(i>=6){ document.getElementById('p6-fig').innerHTML=''; document.getElementById('p6-fb').className='feedback'; document.getElementById('p6-fb').style.display='block'; document.getElementById('p6-fb').innerHTML='<b>Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p6-iv1');bumpProgress('p6',30);}else if(score>=3){addXp(8,'p6-iv1');bumpProgress('p6',16);} return; }
|
||
gen(); document.getElementById('p6-i').textContent=i+1;
|
||
document.getElementById('p6-fig').innerHTML=Math6.numberLine({min:0,max:11,minor:1,major:1,width:560,ray:true,marks:[{v:cur,label:'A',color:'#4f46e5'}]});
|
||
document.getElementById('p6-a').value=''; document.getElementById('p6-fb').style.display='none'; }
|
||
function go(){ if(i>=6)return; var fb=document.getElementById('p6-fb'), a=parseInt(document.getElementById('p6-a').value,10);
|
||
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
|
||
if(a===cur){ score++; feedback(fb,true,'✓ Верно! Координата точки A равна '+cur+'.'); } else feedback(fb,false,'✗ Нет. Координата A равна '+cur+'.');
|
||
document.getElementById('p6-s').textContent=score; i++; setTimeout(show,1100); }
|
||
document.getElementById('p6-go').addEventListener('click',go);
|
||
document.getElementById('p6-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
|
||
show();
|
||
})();
|
||
|
||
(function(){
|
||
var i=0,score=0,cur=null;
|
||
function gen(){ var a=_ri(1,5), b=_ri(6,11); cur={a:a,b:b,d:b-a}; }
|
||
function show(){ if(i>=5){ document.getElementById('p6-dfig').innerHTML=''; var fb0=document.getElementById('p6-dfb'); fb0.className='feedback'; fb0.style.display='block'; fb0.innerHTML='<b>Готово! '+score+' / 5</b>'; if(score>=4){addXp(15,'p6-iv2');bumpProgress('p6',30);}else if(score>=2){addXp(8,'p6-iv2');bumpProgress('p6',16);} return; }
|
||
gen(); document.getElementById('p6-di').textContent=i+1;
|
||
document.getElementById('p6-dfig').innerHTML=Math6.numberLine({min:0,max:11,minor:1,major:1,width:560,ray:true,marks:[{v:cur.a,label:'A',color:'#4f46e5'},{v:cur.b,label:'B',color:'#e11d48',above:false}]});
|
||
document.getElementById('p6-da').value=''; document.getElementById('p6-dfb').style.display='none'; }
|
||
function go(){ if(i>=5)return; var fb=document.getElementById('p6-dfb'), a=parseInt(document.getElementById('p6-da').value,10);
|
||
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
|
||
if(a===cur.d){ score++; feedback(fb,true,'✓ Верно! Расстояние '+cur.d+' (от '+cur.a+' до '+cur.b+').'); } else feedback(fb,false,'✗ Нет. Расстояние '+cur.d+' = '+cur.b+' − '+cur.a+'.');
|
||
document.getElementById('p6-ds').textContent=score; i++; setTimeout(show,1200); }
|
||
document.getElementById('p6-dgo').addEventListener('click',go);
|
||
document.getElementById('p6-da').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
|
||
show();
|
||
})();
|
||
}
|
||
|
||
/* ===================== § 7. ОКРУГЛЕНИЕ НАТУРАЛЬНЫХ ЧИСЕЛ ===================== */
|
||
function buildP7(){
|
||
var box=document.getElementById('p7-body'); var h='';
|
||
h+=makeCard('oral','Где это в жизни','7.0',
|
||
'<p>Точные числа в новостях встречаются редко: говорят «около $8$ миллиардов человек», «примерно $300$ км до моря», «в зале почти $1000$ зрителей». Это <b>округлённые</b> числа — так их проще воспринимать и запоминать.</p>');
|
||
h+=makeCard('rule','Правило округления','7.1',
|
||
'<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>Все цифры младших разрядов заменяют <b>нулями</b>. Знак приближённого равенства — $\\approx$.</p>');
|
||
h+=makeCard('example','Примеры','7.2',
|
||
'<p>$47\\approx 50$ (до десятков). $432\\approx 400$ (до сотен). $6\\,500\\approx 7\\,000$ (до тысяч).</p>');
|
||
h+=makeCard('example','Разбор по шагам','7.3',
|
||
'<p>Округлим $3\\,472$ до сотен.</p>'
|
||
+'<ol style="padding-left:22px;line-height:2">'
|
||
+'<li>Разряд сотен — цифра $4$ (в $3\\,\\underline{4}72$).</li>'
|
||
+'<li>Следующая цифра — десятки $7$. Так как $7\\ge 5$, сотни увеличиваем: $4\\to 5$.</li>'
|
||
+'<li>Младшие разряды — нули: $3\\,500$.</li>'
|
||
+'<li>Ответ: $3\\,472\\approx 3\\,500$.</li>'
|
||
+'</ol>');
|
||
h+=makeCard('theory','А знаешь ли ты?','7.4',
|
||
'<p>Округление помогает быстро <b>прикинуть</b> ответ и проверить себя. Если в магазине $19$ товаров примерно по $50$ копеек, то в уме: $20\\cdot 50=1000$ к. $=10$ руб. — значит, итог должен быть около $10$ рублей.</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-fig"></div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p7-a" class="tinp" style="width:90px;text-align:center" min="0"><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> / 6</span><span>Очки: <b id="p7-rs">0</b> / 6</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="number" id="p7-ra" class="tinp" style="width:120px;text-align:center"><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(){ cur=_ri(11,89); }
|
||
function show(){ if(i>=6){ document.getElementById('p7-fig').innerHTML=''; var fb0=document.getElementById('p7-fb'); fb0.className='feedback'; fb0.style.display='block'; fb0.innerHTML='<b>Готово! '+score+' / 6</b>'; 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-fig').innerHTML=Math6.numberLine({min:0,max:100,minor:10,major:10,width:560,marks:[{v:cur,label:''+cur,color:'#4f46e5'}]});
|
||
document.getElementById('p7-a').value=''; document.getElementById('p7-fb').style.display='none'; }
|
||
function go(){ if(i>=6)return; var fb=document.getElementById('p7-fb'), a=parseInt(document.getElementById('p7-a').value,10), correct=Math.round(cur/10)*10;
|
||
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
|
||
if(a===correct){ score++; feedback(fb,true,'✓ Верно! $'+cur+'\\approx '+correct+'$.'); renderMath(fb); } else { feedback(fb,false,'✗ Нет. $'+cur+'\\approx '+correct+'$.'); renderMath(fb); }
|
||
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 t=_ri(0,1); if(t===0){ var n=_ri(1050,8950); cur={n:n,pl:'сотен',ans:Math.round(n/100)*100}; } else { var m=_ri(11500,98500); cur={n:m,pl:'тысяч',ans:Math.round(m/1000)*1000}; } }
|
||
function show(){ if(i>=6){ document.getElementById('p7-rq').innerHTML='<b>Готово! '+score+' / 6</b>'; 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-ri').textContent=i+1;
|
||
document.getElementById('p7-rq').innerHTML='Округли $'+_grp(cur.n)+'$ до <b>'+cur.pl+'</b>.'; renderMath(document.getElementById('p7-rq'));
|
||
document.getElementById('p7-ra').value=''; document.getElementById('p7-rfb').style.display='none'; }
|
||
function go(){ if(i>=6)return; var fb=document.getElementById('p7-rfb'), a=parseInt(document.getElementById('p7-ra').value,10);
|
||
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
|
||
if(a===cur.ans){ score++; feedback(fb,true,'✓ Верно! Ответ '+cur.ans+'.'); } else feedback(fb,false,'✗ Нет. Правильно: '+cur.ans+'.');
|
||
document.getElementById('p7-rs').textContent=score; i++; setTimeout(show,1200); }
|
||
document.getElementById('p7-rgo').addEventListener('click',go);
|
||
document.getElementById('p7-ra').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
|
||
show();
|
||
})();
|
||
}
|
||
|
||
/* ===================== § 8. СЛОЖЕНИЕ И ВЫЧИТАНИЕ ===================== */
|
||
function buildP8(){
|
||
var box=document.getElementById('p8-body'); var h='';
|
||
h+=makeCard('oral','Где это в жизни','8.0',
|
||
'<p>Сложение и вычитание — самые частые действия: сложить стоимость покупок, посчитать сдачу, узнать, на сколько один город больше другого, сколько осталось денег после трат.</p>');
|
||
h+=makeCard('rule','Сложение и вычитание «в столбик»','8.1',
|
||
'<p>Числа записывают <b>разряд под разрядом</b> (единицы под единицами). Складывают справа налево; если в разряде получилось $10$ или больше — <b>переносят</b> единицу в следующий разряд.</p>'
|
||
+'<p>При вычитании, если цифр не хватает, <b>занимают</b> единицу у старшего разряда.</p>');
|
||
h+=makeCard('rule','Полезные свойства','8.2',
|
||
'<p><b>Переместительное:</b> $a+b=b+a$. <b>Сочетательное:</b> $(a+b)+c=a+(b+c)$.</p>'
|
||
+'<p>Ими удобно пользоваться для быстрого счёта: $37+99=37+100-1=136$.</p>');
|
||
h+=makeCard('example','Разбор по шагам','8.3',
|
||
'<p>Вычислим $3\\,472+1\\,859$.</p>'
|
||
+'<ol style="padding-left:22px;line-height:2">'
|
||
+'<li>Единицы: $2+9=11$ — пишем $1$, переносим $1$.</li>'
|
||
+'<li>Десятки: $7+5+1=13$ — пишем $3$, переносим $1$.</li>'
|
||
+'<li>Сотни: $4+8+1=13$ — пишем $3$, переносим $1$.</li>'
|
||
+'<li>Тысячи: $3+1+1=5$. Ответ: $5\\,331$.</li>'
|
||
+'</ol>');
|
||
h+=makeCard('theory','А знаешь ли ты?','8.4',
|
||
'<p>Знаки $+$ и $-$ впервые напечатал немецкий математик Иоганн Видман в $1489$ году в книге по торговым расчётам. До этого сложение писали словом «et» (по-латыни «и»).</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 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="number" id="p8-a" class="tinp" style="width:130px;text-align:center"><button class="btn primary" id="p8-go">Проверить</button></div>'
|
||
+'<div class="feedback" id="p8-fb"></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-xi">1</b> / 5</span><span>Очки: <b id="p8-xs">0</b> / 5</span></div>'
|
||
+'<div id="p8-xq" class="qbox"></div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p8-xa" class="tinp" style="width:110px;text-align:center"><button class="btn primary" id="p8-xgo">Проверить</button></div>'
|
||
+'<div class="feedback" id="p8-xfb"></div></div>';
|
||
h+=secNav('p7','p9')+readBtn('p8');
|
||
box.innerHTML=h; renderMath(box);
|
||
|
||
(function(){
|
||
var i=0,score=0,cur=null;
|
||
function gen(){ var a=_ri(150,4800), b=_ri(120,3900); if(_ri(0,1)===0)cur={t:'+',a:a,b:b,ans:a+b}; else { if(b>a){var x=a;a=b;b=x;} cur={t:'−',a:a,b:b,ans:a-b}; } }
|
||
function show(){ if(i>=6){ document.getElementById('p8-q').innerHTML='<b>Готово! '+score+' / 6</b>'; 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='$'+_grp(cur.a)+' '+cur.t+' '+_grp(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'), a=parseInt(document.getElementById('p8-a').value,10);
|
||
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
|
||
if(a===cur.ans){ score++; feedback(fb,true,'✓ Верно! Ответ '+cur.ans+'.'); } else feedback(fb,false,'✗ Нет. Правильно: '+cur.ans+'.');
|
||
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=_ri(12,80), x=_ri(13,90); var t=_ri(0,2);
|
||
if(t===0)cur={q:'\\square + '+a+' = '+(a+x),ans:x};
|
||
else if(t===1)cur={q:a+' + \\square = '+(a+x),ans:x};
|
||
else cur={q:'\\square - '+a+' = '+x,ans:a+x}; }
|
||
function show(){ if(i>=5){ document.getElementById('p8-xq').innerHTML='<b>Готово! '+score+' / 5</b>'; 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-xi').textContent=i+1;
|
||
document.getElementById('p8-xq').innerHTML='$'+cur.q+'$'; renderMath(document.getElementById('p8-xq'));
|
||
document.getElementById('p8-xa').value=''; document.getElementById('p8-xfb').style.display='none'; }
|
||
function go(){ if(i>=5)return; var fb=document.getElementById('p8-xfb'), a=parseInt(document.getElementById('p8-xa').value,10);
|
||
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
|
||
if(a===cur.ans){ score++; feedback(fb,true,'✓ Верно! Под квадратом '+cur.ans+'.'); } else feedback(fb,false,'✗ Нет. Правильно: '+cur.ans+'.');
|
||
document.getElementById('p8-xs').textContent=score; i++; setTimeout(show,1200); }
|
||
document.getElementById('p8-xgo').addEventListener('click',go);
|
||
document.getElementById('p8-xa').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
|
||
show();
|
||
})();
|
||
}
|
||
|
||
/* ===================== § 9. УМНОЖЕНИЕ И ДЕЛЕНИЕ ===================== */
|
||
function buildP9(){
|
||
var box=document.getElementById('p9-body'); var h='';
|
||
h+=makeCard('oral','Где это в жизни','9.0',
|
||
'<p>Умножение — это быстрое сложение одинаковых слагаемых: $6$ пачек по $8$ карандашей — это $6\\cdot 8=48$. Деление — обратное действие: $48$ карандашей разложить в $6$ пачек поровну — по $8$.</p>');
|
||
h+=makeCard('rule','Умножение и деление','9.1',
|
||
'<p><b>Умножение «в столбик»:</b> умножают на каждую цифру второго множителя, потом складывают со сдвигом.</p>'
|
||
+'<p><b>Деление «уголком»:</b> делят старшие разряды, сносят следующие цифры. Проверка: $\\text{частное}\\cdot\\text{делитель}=\\text{делимое}$.</p>'
|
||
+'<p><b>Свойства:</b> $a\\cdot b=b\\cdot a$; $a\\cdot(b+c)=a\\cdot b+a\\cdot c$ (распределительное).</p>');
|
||
h+=makeCard('example','Разбор по шагам','9.2',
|
||
'<p>Вычислим $156:12$.</p>'
|
||
+'<ol style="padding-left:22px;line-height:2">'
|
||
+'<li>$15$ десятков делим на $12$ — по $1$ десятку ($12$), остаток $3$ десятка.</li>'
|
||
+'<li>Сносим $6$: получаем $36$ единиц.</li>'
|
||
+'<li>$36:12=3$. Записываем рядом.</li>'
|
||
+'<li>Ответ: $156:12=13$. Проверка: $13\\cdot 12=156$.</li>'
|
||
+'</ol>');
|
||
h+=makeCard('theory','А знаешь ли ты?','9.3',
|
||
'<p>Знак умножения «крестиком» $\\times$ ввёл Уильям Отред в $1631$ году, а точку $\\cdot$ предложил Готфрид Лейбниц, чтобы крестик не путали с буквой $x$. Поэтому в алгебре чаще пишут точку.</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">Точки выстроены в прямоугольник: $a$ строк по $b$ точек. Сколько всего?</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-fig" style="text-align:center;margin:8px 0;overflow-x:auto"></div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p9-a" class="tinp" style="width:90px;text-align:center"><button class="btn primary" id="p9-go">Проверить</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-mi">1</b> / 6</span><span>Очки: <b id="p9-ms">0</b> / 6</span></div>'
|
||
+'<div id="p9-mq" class="qbox"></div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p9-ma" class="tinp" style="width:120px;text-align:center"><button class="btn primary" id="p9-mgo">Проверить</button></div>'
|
||
+'<div class="feedback" id="p9-mfb"></div></div>';
|
||
h+=secNav('p8','p10')+readBtn('p9');
|
||
box.innerHTML=h; renderMath(box);
|
||
|
||
(function(){
|
||
var i=0,score=0,cur=null;
|
||
function arrSVG(a,b){ var u=16,x0=14,y0=12,W=x0*2+b*u,H=y0*2+a*u; var s='<svg viewBox="0 0 '+W+' '+H+'" width="'+Math.min(W,360)+'" style="max-width:100%">';
|
||
for(var r=0;r<a;r++)for(var c=0;c<b;c++){ s+='<circle cx="'+(x0+c*u)+'" cy="'+(y0+r*u)+'" r="4.5" fill="#4f46e5"/>'; } return s+'</svg>'; }
|
||
function gen(){ cur={a:_ri(2,9), b:_ri(2,9)}; cur.ans=cur.a*cur.b; }
|
||
function show(){ if(i>=6){ document.getElementById('p9-fig').innerHTML='<b>Готово! '+score+' / 6</b>'; 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-fig').innerHTML=arrSVG(cur.a,cur.b)+'<div style="margin-top:4px;color:var(--muted);font-size:.9rem">'+cur.a+' строк × '+cur.b+' точек</div>';
|
||
document.getElementById('p9-a').value=''; document.getElementById('p9-fb').style.display='none'; }
|
||
function go(){ if(i>=6)return; var fb=document.getElementById('p9-fb'), a=parseInt(document.getElementById('p9-a').value,10);
|
||
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
|
||
if(a===cur.ans){ score++; feedback(fb,true,'✓ Верно! '+cur.a+'·'+cur.b+'='+cur.ans+'.'); } else feedback(fb,false,'✗ Нет. '+cur.a+'·'+cur.b+'='+cur.ans+'.');
|
||
document.getElementById('p9-s').textContent=score; i++; setTimeout(show,1200); }
|
||
document.getElementById('p9-go').addEventListener('click',go);
|
||
document.getElementById('p9-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
|
||
show();
|
||
})();
|
||
|
||
(function(){
|
||
var i=0,score=0,cur=null;
|
||
function gen(){ if(_ri(0,1)===0){ var a=_ri(12,99),b=_ri(11,40); cur={q:a+' \\cdot '+b,ans:a*b}; } else { var q=_ri(11,40),d=_ri(2,12),n=q*d; cur={q:n+' : '+d,ans:q}; } }
|
||
function show(){ if(i>=6){ document.getElementById('p9-mq').innerHTML='<b>Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p9-iv2');bumpProgress('p9',30);}else if(score>=3){addXp(8,'p9-iv2');bumpProgress('p9',16);} return; }
|
||
gen(); document.getElementById('p9-mi').textContent=i+1;
|
||
document.getElementById('p9-mq').innerHTML='$'+cur.q+'$'; renderMath(document.getElementById('p9-mq'));
|
||
document.getElementById('p9-ma').value=''; document.getElementById('p9-mfb').style.display='none'; }
|
||
function go(){ if(i>=6)return; var fb=document.getElementById('p9-mfb'), a=parseInt(document.getElementById('p9-ma').value,10);
|
||
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
|
||
if(a===cur.ans){ score++; feedback(fb,true,'✓ Верно! Ответ '+cur.ans+'.'); } else feedback(fb,false,'✗ Нет. Правильно: '+cur.ans+'.');
|
||
document.getElementById('p9-ms').textContent=score; i++; setTimeout(show,1200); }
|
||
document.getElementById('p9-mgo').addEventListener('click',go);
|
||
document.getElementById('p9-ma').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
|
||
show();
|
||
})();
|
||
}
|
||
|
||
/* ===================== § 10. СТЕПЕНЬ ЧИСЛА ===================== */
|
||
function buildP10(){
|
||
var box=document.getElementById('p10-body'); var h='';
|
||
h+=makeCard('oral','Где это в жизни','10.0',
|
||
'<p>Степень прячется там, где что-то многократно повторяется. Площадь квадратного ковра со стороной $3$ м — это $3^2=9$ м². Объём кубика со стороной $2$ см — $2^3=8$ см³. А если каждый день репост видят вдвое больше людей — рост идёт степенями двойки.</p>');
|
||
h+=makeCard('theory','Что такое степень','10.1',
|
||
'<p><b>Степенью</b> числа $a$ с натуральным показателем $n$ называют произведение $n$ одинаковых множителей $a$:</p>'
|
||
+'<p>$a^n=\\underbrace{a\\cdot a\\cdot \\ldots \\cdot a}_{n}$. Здесь $a$ — <b>основание</b>, $n$ — <b>показатель</b>.</p>'
|
||
+'<p>$a^2$ читают «$a$ в квадрате», $a^3$ — «$a$ в кубе». Принято $a^1=a$.</p>');
|
||
h+=makeCard('example','Примеры','10.2',
|
||
'<p>$2^3=2\\cdot2\\cdot2=8$. $5^2=25$. $10^4=10\\,000$. $1^{100}=1$.</p>');
|
||
h+=makeCard('example','Разбор по шагам','10.3',
|
||
'<p>Вычислим $2^4$.</p>'
|
||
+'<ol style="padding-left:22px;line-height:2">'
|
||
+'<li>Показатель $4$ — берём $4$ множителя: $2\\cdot2\\cdot2\\cdot2$.</li>'
|
||
+'<li>$2\\cdot2=4$, затем $4\\cdot2=8$, затем $8\\cdot2=16$.</li>'
|
||
+'<li>Ответ: $2^4=16$.</li>'
|
||
+'</ol>');
|
||
h+=makeCard('theory','А знаешь ли ты?','10.4',
|
||
'<p>По легенде, изобретатель шахмат попросил у правителя «всего лишь» зёрнышко за первую клетку, $2$ за вторую, $4$ за третью и так далее — удваивая. На $64$-й клетке вышло $2^{63}$ зёрен — больше, чем во всех амбарах мира! Вот как быстро растут степени двойки.</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">Клетки образуют квадрат со стороной $a$. Сколько всего клеток ($a^2$)?</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-fig" style="text-align:center;margin:8px 0"></div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p10-a" class="tinp" style="width:90px;text-align:center"><button class="btn primary" id="p10-go">Проверить</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-pi">1</b> / 6</span><span>Очки: <b id="p10-ps">0</b> / 6</span></div>'
|
||
+'<div id="p10-pq" class="qbox"></div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p10-pa" class="tinp" style="width:120px;text-align:center"><button class="btn primary" id="p10-pgo">Проверить</button></div>'
|
||
+'<div class="feedback" id="p10-pfb"></div></div>';
|
||
h+=secNav('p9','p11')+readBtn('p10');
|
||
box.innerHTML=h; renderMath(box);
|
||
|
||
(function(){
|
||
var i=0,score=0,cur=null;
|
||
function sqSVG(a){ var u=Math.min(26,Math.floor(150/a)),x0=4,W=x0*2+a*u; var s='<svg viewBox="0 0 '+W+' '+W+'" width="'+Math.min(W,220)+'" style="max-width:100%">';
|
||
for(var r=0;r<a;r++)for(var c=0;c<a;c++) s+='<rect x="'+(x0+c*u)+'" y="'+(x0+r*u)+'" width="'+(u-2)+'" height="'+(u-2)+'" rx="2" fill="#a5b4fc" stroke="#4f46e5"/>';
|
||
return s+'</svg>'; }
|
||
function gen(){ cur=_ri(2,9); }
|
||
function show(){ if(i>=5){ document.getElementById('p10-fig').innerHTML='<b>Готово! '+score+' / 5</b>'; if(score>=4){addXp(15,'p10-iv1');bumpProgress('p10',30);}else if(score>=2){addXp(8,'p10-iv1');bumpProgress('p10',16);} return; }
|
||
gen(); document.getElementById('p10-i').textContent=i+1;
|
||
document.getElementById('p10-fig').innerHTML=sqSVG(cur)+'<div style="margin-top:4px;color:var(--muted);font-size:.9rem">сторона '+cur+', значит '+cur+'<sup>2</sup></div>';
|
||
document.getElementById('p10-a').value=''; document.getElementById('p10-fb').style.display='none'; }
|
||
function go(){ if(i>=5)return; var fb=document.getElementById('p10-fb'), a=parseInt(document.getElementById('p10-a').value,10);
|
||
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
|
||
if(a===cur*cur){ score++; feedback(fb,true,'✓ Верно! $'+cur+'^2='+(cur*cur)+'$.'); renderMath(fb); } else { feedback(fb,false,'✗ Нет. $'+cur+'^2='+(cur*cur)+'$.'); renderMath(fb); }
|
||
document.getElementById('p10-s').textContent=score; i++; setTimeout(show,1200); }
|
||
document.getElementById('p10-go').addEventListener('click',go);
|
||
document.getElementById('p10-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
|
||
show();
|
||
})();
|
||
|
||
(function(){
|
||
var i=0,score=0,cur=null;
|
||
function gen(){ var a=_ri(2,7), n=_pick([2,2,3,3,4]); if(a>=6)n=_pick([2,3]); cur={a:a,n:n,ans:Math.pow(a,n)}; }
|
||
function show(){ if(i>=6){ document.getElementById('p10-pq').innerHTML='<b>Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p10-iv2');bumpProgress('p10',30);}else if(score>=3){addXp(8,'p10-iv2');bumpProgress('p10',16);} return; }
|
||
gen(); document.getElementById('p10-pi').textContent=i+1;
|
||
document.getElementById('p10-pq').innerHTML='Вычисли $'+cur.a+'^{'+cur.n+'}$'; renderMath(document.getElementById('p10-pq'));
|
||
document.getElementById('p10-pa').value=''; document.getElementById('p10-pfb').style.display='none'; }
|
||
function go(){ if(i>=6)return; var fb=document.getElementById('p10-pfb'), a=parseInt(document.getElementById('p10-pa').value,10);
|
||
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
|
||
if(a===cur.ans){ score++; feedback(fb,true,'✓ Верно! Ответ '+cur.ans+'.'); } else feedback(fb,false,'✗ Нет. Правильно: '+cur.ans+'.');
|
||
document.getElementById('p10-ps').textContent=score; i++; setTimeout(show,1200); }
|
||
document.getElementById('p10-pgo').addEventListener('click',go);
|
||
document.getElementById('p10-pa').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
|
||
show();
|
||
})();
|
||
}
|
||
|
||
/* ===================== § 11. ДЕЛЕНИЕ С ОСТАТКОМ ===================== */
|
||
function buildP11(){
|
||
var box=document.getElementById('p11-body'); var h='';
|
||
h+=makeCard('oral','Где это в жизни','11.0',
|
||
'<p>Разделить $25$ конфет на $4$ детей поровну не получится — по $6$ и ещё одна лишняя. Эта «лишняя» — <b>остаток</b>. Деление с остатком повсюду: дни недели, страницы по тетрадям, ученики по командам.</p>');
|
||
h+=makeCard('rule','Деление с остатком','11.1',
|
||
'<p>Разделить $a$ на $b$ с остатком — значит найти такие числа $q$ и $r$, что</p>'
|
||
+'<p style="text-align:center;font-size:1.1rem">$a = b\\cdot q + r$, где $0\\le r < b$.</p>'
|
||
+'<p>$q$ — <b>неполное частное</b>, $r$ — <b>остаток</b>. Остаток всегда <b>меньше делителя</b>.</p>');
|
||
h+=makeCard('example','Примеры','11.2',
|
||
'<p>$47:5=9$ (ост. $2$), ведь $5\\cdot9+2=47$. $30:6=5$ (ост. $0$) — делится нацело.</p>');
|
||
h+=makeCard('example','Разбор по шагам','11.3',
|
||
'<p>Разделим $47$ на $5$ с остатком.</p>'
|
||
+'<ol style="padding-left:22px;line-height:2">'
|
||
+'<li>Ищем наибольшее число «пятёрок» в $47$: $5\\cdot9=45$, а $5\\cdot10=50$ — уже много.</li>'
|
||
+'<li>Значит неполное частное $q=9$.</li>'
|
||
+'<li>Остаток: $47-45=2$. Проверяем: $2<5$. Верно.</li>'
|
||
+'<li>Ответ: $47=5\\cdot9+2$.</li>'
|
||
+'</ol>');
|
||
h+=makeCard('theory','А знаешь ли ты?','11.4',
|
||
'<p>Часы — это деление с остатком! Если сейчас $10$ часов, то через $5$ часов будет не $15$, а $3$ часа: $15:12=1$ (ост. $3$). Математики называют такой счёт «арифметикой остатков», и на ней держится вся компьютерная защита данных.</p>');
|
||
h+='<div class="wg" id="p11-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Найди остаток</div></div>'
|
||
+'<div class="wg-help">Точки раскладывают по $b$ в ряд. Сколько точек останется в неполном ряду?</div>'
|
||
+'<div class="score-display"><span>Вопрос <b id="p11-i">1</b> / 6</span><span>Очки: <b id="p11-s">0</b> / 6</span></div>'
|
||
+'<div id="p11-fig" style="text-align:center;margin:8px 0;overflow-x:auto"></div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p11-a" class="tinp" style="width:90px;text-align:center" min="0"><button class="btn primary" id="p11-go">Проверить</button></div>'
|
||
+'<div class="feedback" id="p11-fb"></div></div>';
|
||
h+='<div class="wg" id="p11-iv2"><div class="wg-header"><span class="wg-badge">Интерактив 2</span><div class="wg-title">Неполное частное</div></div>'
|
||
+'<div class="wg-help">Найди неполное частное $q$ (сколько целых раз делитель помещается в делимом).</div>'
|
||
+'<div class="score-display"><span>Вопрос <b id="p11-qi">1</b> / 5</span><span>Очки: <b id="p11-qs">0</b> / 5</span></div>'
|
||
+'<div id="p11-qq" class="qbox"></div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p11-qa" class="tinp" style="width:90px;text-align:center" min="0"><button class="btn primary" id="p11-qgo">Проверить</button></div>'
|
||
+'<div class="feedback" id="p11-qfb"></div></div>';
|
||
h+=secNav('p10','p12')+readBtn('p11');
|
||
box.innerHTML=h; renderMath(box);
|
||
|
||
(function(){
|
||
var i=0,score=0,cur=null;
|
||
function dotsSVG(a,b){ var u=15,x0=6,cols=b,rows=Math.ceil(a/b),W=x0*2+cols*u,H=x0*2+rows*u; var s='<svg viewBox="0 0 '+W+' '+H+'" width="'+Math.min(W,360)+'" style="max-width:100%">',k=0;
|
||
for(var r=0;r<rows;r++)for(var c=0;c<cols;c++){ if(k>=a)break; var rem=k>=a-(a%b||b)&&(a%b)!==0&&r===rows-1; s+='<circle cx="'+(x0+c*u+u/2)+'" cy="'+(x0+r*u+u/2)+'" r="5" fill="'+(rem?'#e11d48':'#4f46e5')+'"/>'; k++; } return s+'</svg>'; }
|
||
function gen(){ var b=_ri(3,7), q=_ri(3,8), r=_ri(1,b-1); cur={a:b*q+r,b:b,r:r}; }
|
||
function show(){ if(i>=6){ document.getElementById('p11-fig').innerHTML='<b>Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p11-iv1');bumpProgress('p11',30);}else if(score>=3){addXp(8,'p11-iv1');bumpProgress('p11',16);} return; }
|
||
gen(); document.getElementById('p11-i').textContent=i+1;
|
||
document.getElementById('p11-fig').innerHTML=dotsSVG(cur.a,cur.b)+'<div style="margin-top:4px;color:var(--muted);font-size:.9rem">'+cur.a+' точек по '+cur.b+' в ряд</div>';
|
||
document.getElementById('p11-a').value=''; document.getElementById('p11-fb').style.display='none'; }
|
||
function go(){ if(i>=6)return; var fb=document.getElementById('p11-fb'), a=parseInt(document.getElementById('p11-a').value,10);
|
||
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
|
||
if(a===cur.r){ score++; feedback(fb,true,'✓ Верно! Остаток '+cur.r+' (красные точки).'); } else feedback(fb,false,'✗ Нет. Остаток '+cur.r+'.');
|
||
document.getElementById('p11-s').textContent=score; i++; setTimeout(show,1300); }
|
||
document.getElementById('p11-go').addEventListener('click',go);
|
||
document.getElementById('p11-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
|
||
show();
|
||
})();
|
||
|
||
(function(){
|
||
var i=0,score=0,cur=null;
|
||
function gen(){ var b=_ri(3,12), q=_ri(4,15), r=_ri(0,b-1); cur={a:b*q+r,b:b,q:q}; }
|
||
function show(){ if(i>=5){ document.getElementById('p11-qq').innerHTML='<b>Готово! '+score+' / 5</b>'; if(score>=4){addXp(15,'p11-iv2');bumpProgress('p11',30);}else if(score>=2){addXp(8,'p11-iv2');bumpProgress('p11',16);} return; }
|
||
gen(); document.getElementById('p11-qi').textContent=i+1;
|
||
document.getElementById('p11-qq').innerHTML='Раздели $'+cur.a+'$ на $'+cur.b+'$ с остатком. Чему равно <b>неполное частное</b>?'; renderMath(document.getElementById('p11-qq'));
|
||
document.getElementById('p11-qa').value=''; document.getElementById('p11-qfb').style.display='none'; }
|
||
function go(){ if(i>=5)return; var fb=document.getElementById('p11-qfb'), a=parseInt(document.getElementById('p11-qa').value,10);
|
||
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
|
||
if(a===cur.q){ score++; feedback(fb,true,'✓ Верно! '+cur.a+'='+cur.b+'·'+cur.q+'+'+(cur.a-cur.b*cur.q)+'.'); } else feedback(fb,false,'✗ Нет. Неполное частное '+cur.q+'.');
|
||
document.getElementById('p11-qs').textContent=score; i++; setTimeout(show,1300); }
|
||
document.getElementById('p11-qgo').addEventListener('click',go);
|
||
document.getElementById('p11-qa').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
|
||
show();
|
||
})();
|
||
}
|
||
|
||
/* ===================== § 12. ДЕЛИТЕЛИ И КРАТНЫЕ. НОД И НОК ===================== */
|
||
function buildP12(){
|
||
var box=document.getElementById('p12-body'); var h='';
|
||
h+=makeCard('oral','Где это в жизни','12.0',
|
||
'<p>Чтобы рассадить $24$ ученика за столы поровну, нужны <b>делители</b> числа $24$. Чтобы два светофора, мигающие через $4$ и $6$ секунд, мигнули одновременно, ищут общее <b>кратное</b>. Эти понятия — основа всей работы с дробями.</p>');
|
||
h+=makeCard('theory','Делители и кратные','12.1',
|
||
'<p><b>Делитель</b> числа $a$ — число, на которое $a$ делится нацело. Делители $12$: $1,2,3,4,6,12$.</p>'
|
||
+'<p><b>Кратное</b> числа $a$ — число, которое делится на $a$ нацело. Кратные $4$: $4,8,12,16,\\dots$</p>');
|
||
h+=makeCard('rule','НОД и НОК','12.2',
|
||
'<p><b>НОД</b> (наибольший общий делитель) — самое большое число, на которое делятся <b>оба</b> числа.</p>'
|
||
+'<p><b>НОК</b> (наименьшее общее кратное) — самое маленькое число, которое делится на <b>каждое</b> из них.</p>'
|
||
+'<p>Полезно: $\\text{НОД}(a,b)\\cdot\\text{НОК}(a,b)=a\\cdot b$.</p>');
|
||
h+=makeCard('example','Разбор по шагам','12.3',
|
||
'<p>Найдём НОД$(12,18)$ и НОК$(12,18)$.</p>'
|
||
+'<ol style="padding-left:22px;line-height:2">'
|
||
+'<li>Делители $12$: $1,2,3,4,6,12$. Делители $18$: $1,2,3,6,9,18$.</li>'
|
||
+'<li>Общие: $1,2,3,6$. Наибольший — $6$. Значит НОД$=6$.</li>'
|
||
+'<li>НОК: кратные $18$: $18,36,54,\\dots$; $36$ делится на $12$. Значит НОК$=36$.</li>'
|
||
+'<li>Проверка: $6\\cdot36=216=12\\cdot18$. Верно!</li>'
|
||
+'</ol>');
|
||
h+=makeCard('theory','А знаешь ли ты?','12.4',
|
||
'<p>Быстрый способ найти НОД придумал ещё Евклид $2300$ лет назад: большее число заменяют остатком от деления на меньшее — и так, пока остаток не станет нулём. Это один из древнейших алгоритмов, и он до сих пор работает в компьютерах!</p>');
|
||
h+='<div class="wg" id="p12-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="p12-i">1</b> / 5</span><span>Очки: <b id="p12-s">0</b> / 5</span></div>'
|
||
+'<div id="p12-fig" style="margin:8px 0"></div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p12-a" class="tinp" style="width:90px;text-align:center"><button class="btn primary" id="p12-go">Проверить</button></div>'
|
||
+'<div class="feedback" id="p12-fb"></div></div>';
|
||
h+='<div class="wg" id="p12-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="p12-ki">1</b> / 5</span><span>Очки: <b id="p12-ks">0</b> / 5</span></div>'
|
||
+'<div id="p12-kq" class="qbox"></div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap"><input type="number" id="p12-ka" class="tinp" style="width:90px;text-align:center"><button class="btn primary" id="p12-kgo">Проверить</button></div>'
|
||
+'<div class="feedback" id="p12-kfb"></div></div>';
|
||
h+=secNav('p11','p13')+readBtn('p12');
|
||
box.innerHTML=h; renderMath(box);
|
||
|
||
function divisors(n){ var d=[]; for(var k=1;k<=n;k++)if(n%k===0)d.push(k); return d; }
|
||
function gcd(a,b){ while(b){ var t=b; b=a%b; a=t; } return a; }
|
||
|
||
(function(){
|
||
var i=0,score=0,cur=null;
|
||
function gen(){ var pairs=[[12,18],[8,12],[16,24],[15,20],[18,24],[14,21],[20,30],[9,12]]; cur=_pick(pairs); cur=cur.slice(); cur.g=gcd(cur[0],cur[1]); }
|
||
function chips(n,common){ var ds=divisors(n),s='<div style="margin:4px 0"><b>Делители '+n+':</b> '; ds.forEach(function(d){ var hot=common.indexOf(d)>=0; s+='<span style="display:inline-block;margin:2px;padding:2px 8px;border-radius:6px;font-weight:700;'+(hot?'background:#fde68a;color:#92400e':'background:var(--pri-soft);color:var(--pri2)')+'">'+d+'</span>'; }); return s+'</div>'; }
|
||
function show(){ if(i>=5){ document.getElementById('p12-fig').innerHTML='<b>Готово! '+score+' / 5</b>'; if(score>=4){addXp(15,'p12-iv1');bumpProgress('p12',30);}else if(score>=2){addXp(8,'p12-iv1');bumpProgress('p12',16);} return; }
|
||
gen(); document.getElementById('p12-i').textContent=i+1;
|
||
var common=divisors(cur[0]).filter(function(d){ return cur[1]%d===0; });
|
||
document.getElementById('p12-fig').innerHTML=chips(cur[0],common)+chips(cur[1],common);
|
||
document.getElementById('p12-a').value=''; document.getElementById('p12-fb').style.display='none'; }
|
||
function go(){ if(i>=5)return; var fb=document.getElementById('p12-fb'), a=parseInt(document.getElementById('p12-a').value,10);
|
||
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
|
||
if(a===cur.g){ score++; feedback(fb,true,'✓ Верно! НОД('+cur[0]+','+cur[1]+')='+cur.g+'.'); } else feedback(fb,false,'✗ Нет. НОД='+cur.g+' (наибольший общий делитель).');
|
||
document.getElementById('p12-s').textContent=score; i++; setTimeout(show,1300); }
|
||
document.getElementById('p12-go').addEventListener('click',go);
|
||
document.getElementById('p12-a').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
|
||
show();
|
||
})();
|
||
|
||
(function(){
|
||
var i=0,score=0,cur=null;
|
||
function gen(){ var pairs=[[4,6],[6,9],[8,12],[3,5],[10,15],[4,10],[6,8],[9,12]]; var p=_pick(pairs); cur={a:p[0],b:p[1],ans:p[0]*p[1]/gcd(p[0],p[1])}; }
|
||
function show(){ if(i>=5){ document.getElementById('p12-kq').innerHTML='<b>Готово! '+score+' / 5</b>'; if(score>=4){addXp(15,'p12-iv2');bumpProgress('p12',30);}else if(score>=2){addXp(8,'p12-iv2');bumpProgress('p12',16);} return; }
|
||
gen(); document.getElementById('p12-ki').textContent=i+1;
|
||
document.getElementById('p12-kq').innerHTML='Найди НОК$('+cur.a+';\\,'+cur.b+')$'; renderMath(document.getElementById('p12-kq'));
|
||
document.getElementById('p12-ka').value=''; document.getElementById('p12-kfb').style.display='none'; }
|
||
function go(){ if(i>=5)return; var fb=document.getElementById('p12-kfb'), a=parseInt(document.getElementById('p12-ka').value,10);
|
||
if(isNaN(a)){ feedback(fb,false,'Введи число.'); return; }
|
||
if(a===cur.ans){ score++; feedback(fb,true,'✓ Верно! НОК='+cur.ans+'.'); } else feedback(fb,false,'✗ Нет. НОК('+cur.a+','+cur.b+')='+cur.ans+'.');
|
||
document.getElementById('p12-ks').textContent=score; i++; setTimeout(show,1300); }
|
||
document.getElementById('p12-kgo').addEventListener('click',go);
|
||
document.getElementById('p12-ka').addEventListener('keydown',function(e){ if(e.key==='Enter')go(); });
|
||
show();
|
||
})();
|
||
}
|
||
|
||
/* ===================== § 13. ПРИЗНАКИ ДЕЛИМОСТИ ===================== */
|
||
function buildP13(){
|
||
var box=document.getElementById('p13-body'); var h='';
|
||
h+=makeCard('oral','Где это в жизни','13.0',
|
||
'<p>Иногда нужно быстро понять: разделится ли число нацело — <b>не выполняя деления</b>. Можно ли $87$ конфет раздать поровну троим? А $90$? Признаки делимости дают ответ за секунду.</p>');
|
||
h+=makeCard('rule','Признаки делимости','13.1',
|
||
'<p><b>На 2</b> — если последняя цифра чётная ($0,2,4,6,8$).</p>'
|
||
+'<p><b>На 5</b> — если последняя цифра $0$ или $5$.</p>'
|
||
+'<p><b>На 10</b> — если последняя цифра $0$.</p>'
|
||
+'<p><b>На 3</b> — если сумма цифр делится на $3$.</p>'
|
||
+'<p><b>На 9</b> — если сумма цифр делится на $9$.</p>'
|
||
+'<p><b>На 4</b> — если число из двух последних цифр делится на $4$.</p>');
|
||
h+=makeCard('example','Примеры','13.2',
|
||
'<p>$540$ делится на $2,5,10$ (оканчивается на $0$) и на $3$ (сумма цифр $5+4+0=9$).</p>'
|
||
+'<p>$123$ делится на $3$ ($1+2+3=6$), но не на $2$ и не на $9$.</p>');
|
||
h+=makeCard('example','Разбор по шагам','13.3',
|
||
'<p>Проверим, делится ли $5\\,814$ на $2$, $3$ и $9$.</p>'
|
||
+'<ol style="padding-left:22px;line-height:2">'
|
||
+'<li>На $2$: последняя цифра $4$ — чётная. <b>Делится.</b></li>'
|
||
+'<li>Сумма цифр: $5+8+1+4=18$.</li>'
|
||
+'<li>На $3$: $18$ делится на $3$. <b>Делится.</b></li>'
|
||
+'<li>На $9$: $18$ делится на $9$. <b>Делится.</b></li>'
|
||
+'</ol>');
|
||
h+=makeCard('theory','А знаешь ли ты?','13.4',
|
||
'<p>Есть признак и для $11$: складывают цифры через одну и вычитают суммы. Если разность делится на $11$ — и число делится. Например, $2\\,728$: $(8+7)-(2+2)=11$ — делится на $11$!</p>');
|
||
h+='<div class="wg" id="p13-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Проверка делимости</div></div>'
|
||
+'<div class="wg-help">Введи число — увидишь, на что оно делится, и почему.</div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap;margin-bottom:8px"><input type="number" id="p13-in" class="tinp" style="width:150px;text-align:center" value="540"><button class="btn primary" id="p13-chk">Проверить</button></div>'
|
||
+'<div id="p13-out"></div></div>';
|
||
h+='<div class="wg" id="p13-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="p13-i">1</b> / 6</span><span>Очки: <b id="p13-s">0</b> / 6</span></div>'
|
||
+'<div id="p13-q" class="qbox"></div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;flex-wrap:wrap"><button class="btn primary" data-yn="1">Да</button><button class="btn primary" data-yn="0">Нет</button></div>'
|
||
+'<div class="feedback" id="p13-fb"></div></div>';
|
||
h+=secNav('p12','p14')+readBtn('p13');
|
||
box.innerHTML=h; renderMath(box);
|
||
|
||
(function(){
|
||
function check(){
|
||
var raw=(document.getElementById('p13-in').value||'').replace(/\D/g,''); if(!raw)raw='0'; var n=parseInt(raw,10);
|
||
var ds=raw.split('').reduce(function(a,c){return a+(+c);},0);
|
||
var rules=[
|
||
['на 2', n%2===0, 'последняя цифра '+raw[raw.length-1]],
|
||
['на 3', n%3===0, 'сумма цифр '+ds],
|
||
['на 4', n%4===0, 'две последние: '+raw.slice(-2)],
|
||
['на 5', n%5===0, 'последняя цифра '+raw[raw.length-1]],
|
||
['на 9', n%9===0, 'сумма цифр '+ds],
|
||
['на 10', n%10===0, 'последняя цифра '+raw[raw.length-1]]
|
||
];
|
||
var s='<div style="display:flex;flex-wrap:wrap;gap:8px;justify-content:center">';
|
||
rules.forEach(function(r){ s+='<div style="padding:8px 12px;border-radius:9px;font-weight:700;min-width:120px;text-align:center;'+(r[1]?'background:#d1fae5;color:#065f46':'background:#fee2e2;color:#7f1d1d')+'">'+(r[1]?'✓ ':'✗ ')+r[0]+'<div style="font-size:.72rem;font-weight:500;opacity:.85;margin-top:2px">'+r[2]+'</div></div>'; });
|
||
document.getElementById('p13-out').innerHTML=s+'</div>';
|
||
}
|
||
document.getElementById('p13-chk').addEventListener('click',check);
|
||
document.getElementById('p13-in').addEventListener('keydown',function(e){ if(e.key==='Enter')check(); });
|
||
check();
|
||
})();
|
||
|
||
(function(){
|
||
var i=0,score=0,cur=null;
|
||
function gen(){ var d=_pick([2,3,5,9,4,10]), n=_ri(100,999); cur={n:n,d:d,yes:n%d===0}; }
|
||
function show(){ if(i>=6){ document.getElementById('p13-q').innerHTML='<b>Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p13-iv2');bumpProgress('p13',30);}else if(score>=3){addXp(8,'p13-iv2');bumpProgress('p13',16);} return; }
|
||
gen(); document.getElementById('p13-i').textContent=i+1;
|
||
document.getElementById('p13-q').innerHTML='Делится ли $'+cur.n+'$ нацело на $'+cur.d+'$?'; renderMath(document.getElementById('p13-q'));
|
||
document.getElementById('p13-fb').style.display='none'; }
|
||
function ans(yn){ if(i>=6)return; var fb=document.getElementById('p13-fb');
|
||
if((yn===1)===cur.yes){ score++; feedback(fb,true,'✓ Верно! '+cur.n+(cur.yes?' делится':' не делится')+' на '+cur.d+'.'); } else feedback(fb,false,'✗ Нет. '+cur.n+(cur.yes?' делится':' не делится')+' на '+cur.d+'.');
|
||
document.getElementById('p13-s').textContent=score; i++; setTimeout(show,1200); }
|
||
document.querySelectorAll('#p13-iv2 [data-yn]').forEach(function(b){ b.addEventListener('click',function(){ ans(+b.getAttribute('data-yn')); }); });
|
||
show();
|
||
})();
|
||
}
|
||
|
||
/* ===================== § 14. ПРОСТЫЕ И СОСТАВНЫЕ ЧИСЛА ===================== */
|
||
function buildP14(){
|
||
var box=document.getElementById('p14-body'); var h='';
|
||
h+=makeCard('oral','Где это в жизни','14.0',
|
||
'<p>Простые числа — «кирпичики», из которых умножением складываются все остальные числа. На свойствах простых чисел держится защита банковских карт и переписки в интернете: огромное число легко перемножить, но почти невозможно разложить обратно.</p>');
|
||
h+=makeCard('theory','Простые и составные','14.1',
|
||
'<p><b>Простое число</b> имеет ровно <b>два</b> делителя: $1$ и само себя ($2,3,5,7,11,13,\\dots$).</p>'
|
||
+'<p><b>Составное число</b> имеет <b>больше двух</b> делителей ($4,6,8,9,\\dots$).</p>'
|
||
+'<p>Число $1$ — <b>ни простое, ни составное</b> (у него один делитель). $2$ — единственное чётное простое.</p>');
|
||
h+=makeCard('rule','Разложение на простые множители','14.2',
|
||
'<p>Любое составное число можно представить как произведение простых множителей — единственным образом. Делят на наименьшие простые: $2,3,5,7,\\dots$</p>');
|
||
h+=makeCard('example','Разбор по шагам','14.3',
|
||
'<p>Разложим $60$ на простые множители.</p>'
|
||
+'<ol style="padding-left:22px;line-height:2">'
|
||
+'<li>$60:2=30$.</li>'
|
||
+'<li>$30:2=15$.</li>'
|
||
+'<li>$15:3=5$.</li>'
|
||
+'<li>$5$ — простое. Итог: $60=2\\cdot2\\cdot3\\cdot5=2^2\\cdot3\\cdot5$.</li>'
|
||
+'</ol>');
|
||
h+=makeCard('theory','А знаешь ли ты?','14.4',
|
||
'<p>Простых чисел бесконечно много — это доказал ещё Евклид. А самое большое известное простое число содержит более $41$ миллиона цифр! Его нашли в $2024$ году с помощью тысяч компьютеров по всему миру.</p>');
|
||
h+='<div class="wg" id="p14-iv1"><div class="wg-header"><span class="wg-badge">Интерактив 1</span><div class="wg-title">Решето Эратосфена</div></div>'
|
||
+'<div class="wg-help">Нажми на все <b>простые</b> числа от 2 до 30, затем проверь себя.</div>'
|
||
+'<div id="p14-grid" style="display:grid;grid-template-columns:repeat(8,1fr);gap:6px;max-width:360px;margin:8px auto"></div>'
|
||
+'<div class="actions" style="justify-content:center"><button class="btn primary" id="p14-chk">Проверить</button><button class="btn" id="p14-rst">Сбросить</button></div>'
|
||
+'<div class="feedback" id="p14-fb"></div></div>';
|
||
h+='<div class="wg" id="p14-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="p14-i">1</b> / 6</span><span>Очки: <b id="p14-s">0</b> / 6</span></div>'
|
||
+'<div id="p14-q" class="qbox"></div>'
|
||
+'<div style="display:flex;gap:10px;justify-content:center;flex-wrap:wrap"><button class="btn primary" data-p="1">простое</button><button class="btn primary" data-p="0">составное</button></div>'
|
||
+'<div class="feedback" id="p14-qfb"></div></div>';
|
||
h+=secNav('p13','p15')+readBtn('p14');
|
||
box.innerHTML=h; renderMath(box);
|
||
|
||
function isPrime(n){ if(n<2)return false; for(var k=2;k*k<=n;k++)if(n%k===0)return false; return true; }
|
||
|
||
(function(){
|
||
var sel={};
|
||
var grid=document.getElementById('p14-grid'),html='';
|
||
for(var n=2;n<=30;n++) html+='<button class="btn" data-n="'+n+'" style="padding:8px 0;font-weight:700">'+n+'</button>';
|
||
grid.innerHTML=html;
|
||
grid.querySelectorAll('[data-n]').forEach(function(b){ b.addEventListener('click',function(){ var n=+b.getAttribute('data-n'); if(sel[n]){ delete sel[n]; b.classList.remove('primary'); } else { sel[n]=1; b.classList.add('primary'); } }); });
|
||
document.getElementById('p14-chk').addEventListener('click',function(){ var fb=document.getElementById('p14-fb'),ok=0,bad=0,miss=0;
|
||
for(var n=2;n<=30;n++){ var p=isPrime(n),s=!!sel[n]; if(p&&s)ok++; else if(!p&&s)bad++; else if(p&&!s)miss++; }
|
||
if(bad===0&&miss===0){ feedback(fb,true,'✓ Идеально! Все простые числа до 30 найдены. +15 XP'); addXp(15,'p14-iv1'); bumpProgress('p14',35); }
|
||
else feedback(fb,false,'✗ Верных: '+ok+'. Лишних: '+bad+', пропущено: '+miss+'. Простые до 30: 2,3,5,7,11,13,17,19,23,29.'); });
|
||
document.getElementById('p14-rst').addEventListener('click',function(){ sel={}; grid.querySelectorAll('[data-n]').forEach(function(b){ b.classList.remove('primary'); }); document.getElementById('p14-fb').style.display='none'; });
|
||
})();
|
||
|
||
(function(){
|
||
var i=0,score=0,cur=null;
|
||
function gen(){ var n; if(_ri(0,1)===0){ var pr=[2,3,5,7,11,13,17,19,23,29,31,37,41,43]; n=_pick(pr); } else { n=_ri(4,49); while(isPrime(n))n=_ri(4,49); } cur={n:n,prime:isPrime(n)}; }
|
||
function show(){ if(i>=6){ document.getElementById('p14-q').innerHTML='<b>Готово! '+score+' / 6</b>'; if(score>=5){addXp(15,'p14-iv2');bumpProgress('p14',30);}else if(score>=3){addXp(8,'p14-iv2');bumpProgress('p14',16);} return; }
|
||
gen(); document.getElementById('p14-i').textContent=i+1;
|
||
document.getElementById('p14-q').innerHTML='Число $'+cur.n+'$ — простое или составное?'; renderMath(document.getElementById('p14-q'));
|
||
document.getElementById('p14-qfb').style.display='none'; }
|
||
function ans(p){ if(i>=6)return; var fb=document.getElementById('p14-qfb');
|
||
if((p===1)===cur.prime){ score++; feedback(fb,true,'✓ Верно! '+cur.n+' — '+(cur.prime?'простое':'составное')+'.'); } else feedback(fb,false,'✗ Нет. '+cur.n+' — '+(cur.prime?'простое':'составное')+'.');
|
||
document.getElementById('p14-s').textContent=score; i++; setTimeout(show,1200); }
|
||
document.querySelectorAll('#p14-iv2 [data-p]').forEach(function(b){ b.addEventListener('click',function(){ ans(+b.getAttribute('data-p')); }); });
|
||
show();
|
||
})();
|
||
}
|
||
|
||
/* ===================== ДАННЫЕ САЙДБАРА / ГЛОССАРИЯ ===================== */
|
||
var SIDEBARS = {
|
||
p1:{ title:'Шпаргалка § 1', rows:[
|
||
['Шаг 1','понять условие: что дано, что найти'],
|
||
['Шаг 2','составить план действий'],
|
||
['Шаг 3','выполнить вычисления'],
|
||
['Шаг 4','проверить ответ'] ]},
|
||
p2:{ title:'Шпаргалка § 2', rows:[
|
||
['Натуральные','$1,2,3,\\dots$ — для счёта'],
|
||
['Нуль','не натуральное, но нужно в записи'],
|
||
['Класс','группа из 3 разрядов'],
|
||
['Классы','единицы, тысячи, миллионы…'] ]},
|
||
p3:{ title:'Шпаргалка § 3', rows:[
|
||
['Больше цифр','то число и больше: $1000>999$'],
|
||
['Поровну цифр','сравниваем поразрядно слева'],
|
||
['Знаки','$<$ меньше, $>$ больше, $=$ равно'],
|
||
['Острый угол','смотрит на меньшее число'] ]},
|
||
p4:{ title:'Шпаргалка § 4', rows:[
|
||
['Точка','нет размеров; $A$'],
|
||
['Прямая','бесконечна в обе стороны; $a$'],
|
||
['Луч','начало $O$ + бесконечность в одну сторону'],
|
||
['Отрезок','часть прямой между концами $AB$'],
|
||
['Через 2 точки','ровно одна прямая'] ]},
|
||
p5:{ title:'Шпаргалка § 5', rows:[
|
||
['1 см','$=10$ мм'],
|
||
['1 дм','$=10$ см'],
|
||
['1 м','$=100$ см $=1000$ мм'],
|
||
['1 км','$=1000$ м'] ]},
|
||
p6:{ title:'Шпаргалка § 6', rows:[
|
||
['Начало','$O$ — это число $0$'],
|
||
['Единичный отрезок','задаёт «шаг»'],
|
||
['Координата','число точки: $A(3)$'],
|
||
['Правее','значит больше'] ]},
|
||
p7:{ title:'Шпаргалка § 7', rows:[
|
||
['Смотрим','на следующую (младшую) цифру'],
|
||
['$<5$','разряд оставляем'],
|
||
['$\\ge 5$','разряд +1'],
|
||
['Младшие','заменяем нулями; знак $\\approx$'] ]},
|
||
p8:{ title:'Шпаргалка § 8', rows:[
|
||
['Столбик','разряд под разрядом'],
|
||
['$\\ge 10$','переносим в старший разряд'],
|
||
['Не хватает','занимаем у старшего'],
|
||
['$37+99$','$=37+100-1=136$'] ]},
|
||
p9:{ title:'Шпаргалка § 9', rows:[
|
||
['Умножение','быстрое сложение слагаемых'],
|
||
['Деление','обратно умножению'],
|
||
['Проверка','частное · делитель = делимое'],
|
||
['Распределит.','$a(b+c)=ab+ac$'] ]},
|
||
p10:{ title:'Шпаргалка § 10', rows:[
|
||
['Степень','$a^n=a\\cdot a\\cdots a$ ($n$ раз)'],
|
||
['Основание','$a$ — что умножаем'],
|
||
['Показатель','$n$ — сколько множителей'],
|
||
['$a^2$ / $a^3$','квадрат / куб'] ]},
|
||
p11:{ title:'Шпаргалка § 11', rows:[
|
||
['Формула','$a=b\\cdot q+r$'],
|
||
['$q$','неполное частное'],
|
||
['$r$','остаток, всегда $r<b$'],
|
||
['$47:5$','$=9$ (ост. $2$)'] ]},
|
||
p12:{ title:'Шпаргалка § 12', rows:[
|
||
['Делитель','делит число нацело'],
|
||
['Кратное','делится на число нацело'],
|
||
['НОД','наибольший общий делитель'],
|
||
['НОК','наименьшее общее кратное'] ]},
|
||
p13:{ title:'Шпаргалка § 13', rows:[
|
||
['на 2','последняя цифра чётная'],
|
||
['на 5 / 10','оканчивается на 0/5 · на 0'],
|
||
['на 3 / 9','сумма цифр делится на 3 / 9'],
|
||
['на 4','две последние делятся на 4'] ]},
|
||
p14:{ title:'Шпаргалка § 14', rows:[
|
||
['Простое','ровно 2 делителя'],
|
||
['Составное','больше 2 делителей'],
|
||
['1','ни простое, ни составное'],
|
||
['Разложение','$60=2^2\\cdot3\\cdot5$'] ]},
|
||
final:{ title:'Финал главы 1', rows:[
|
||
['5 боссов','разряды, округление, действия, степень'],
|
||
['Победа','4 из 5 и больше'],
|
||
['Награда','+40 XP и достижение «Глава 1 пройдена»'] ]}
|
||
};
|
||
var TIPS = [
|
||
{ sec:'p1', html:'Не бросайся считать сразу. Сначала спроси себя: «что дано?» и «что нужно найти?» — половина дела готова.' },
|
||
{ sec:'p2', html:'Разбивай длинное число на классы по три цифры справа: $12\\,345\\,678$. Так его легко прочитать.' },
|
||
{ sec:'p3', html:'Сначала глянь на длину записи: где цифр больше — то число и больше. Если поровну — сравнивай поразрядно слева направо.' },
|
||
{ sec:'p4', html:'Запоминай по концам: у отрезка два конца, у луча — один (его начало), у прямой — ни одного.' },
|
||
{ sec:'p5', html:'Переводя единицы, держи в голове «лесенку»: мм → см → дм → м, каждый шаг в 10 раз. От м до км — в 1000 раз.' },
|
||
{ sec:'p6', html:'Координата — это сколько единичных отрезков от нуля. Чем правее точка, тем больше её координата.' },
|
||
{ sec:'final', html:'Перед ударом прикинь ответ в уме. Для степени $a^n$ — это $a$, умноженное само на себя $n$ раз.' }
|
||
];
|
||
var GLOSSARY = [
|
||
{ term:'натуральное число', def:'Число, которым считают предметы: $1,2,3,\\dots$ Нуль натуральным не считают.', sec:'p2', aliases:['натуральное число','натуральные числа','натуральных чисел','натурального числа'] },
|
||
{ term:'разряд', def:'Место цифры в записи числа: единицы, десятки, сотни и т. д.', sec:'p2', aliases:['разряд','разряда','разряде','разряды','разрядов'] },
|
||
{ term:'класс', def:'Группа из трёх соседних разрядов: единицы, тысячи, миллионы.', sec:'p2', aliases:['класс','класса','классе','классы','классов'] }
|
||
];
|
||
var BUILDERS = { p1:buildP1, p2:buildP2, p3:buildP3, p4:buildP4, p5:buildP5, p6:buildP6, p7:buildP7, p8:buildP8, p9:buildP9, p10:buildP10, p11:buildP11, p12:buildP12, p13:buildP13, p14:buildP14, final:buildFinal };
|
||
Object.assign(window.M6, { sidebars:SIDEBARS, tips:TIPS, glossary:GLOSSARY, builders:BUILDERS });
|
||
</script>
|
||
|
||
</body>
|
||
</html>
|