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