diff --git a/frontend/textbooks/algebra_8.html b/frontend/textbooks/algebra_8.html index 3d7c9f9..a494864 100644 --- a/frontend/textbooks/algebra_8.html +++ b/frontend/textbooks/algebra_8.html @@ -760,6 +760,10 @@ input,select,textarea{font-family:inherit} + + Глава 3 + + Глава 2 diff --git a/frontend/textbooks/algebra_8_ch3.html b/frontend/textbooks/algebra_8_ch3.html index 1adf3b1..851b2de 100644 --- a/frontend/textbooks/algebra_8_ch3.html +++ b/frontend/textbooks/algebra_8_ch3.html @@ -2283,7 +2283,287 @@ function buildP18(){ document.getElementById('p18d-reset').addEventListener('click', ()=>{ sorter.reset(); document.getElementById('p18d-fb').style.display='none'; }); })(); } -function buildFinal3stub(){ document.getElementById('final3-body').innerHTML = `

Финал главы

Будет в Wave 4 — 7 боссов, увлекательная математика, практика.

${secNav('p18',null)}`; } +function buildFinal3stub(){ buildFinal3(); } +function buildFinal3(){ + const box = document.getElementById('final3-body'); + let html = ''; + + html += `
${ICONS.theory}
Поздравляем!
+

Вы прошли 6 параграфов главы «Неравенства с одной переменной». В финале вас ждут 7 боссов — по одному на каждый параграф и один общий. Победите всех — получите титул «Чемпион неравенств».

+
`; + + html += widget('Боссы главы 3','BOSS ARENA','Каждый босс — 5 заданий. Победите всех 7, чтобы открыть финальный титул.',` +
+ `); + + html += widget('Увлекательная математика','BONUS','3 факта про неравенства.',` +
Почему меняется знак при умножении на отрицательное? +
Геометрически: умножение на $-1$ — это отражение числовой прямой относительно нуля. То, что было правее (больше), теперь оказалось левее (меньше). Поэтому «больше» становится «меньше».
+
+
Кто придумал знаки $<$ и $>$? +
Английский математик Томас Хэрриот в 1631 году предложил эти знаки. Левый конец — узкий, правый — широкий: с маленькой стороны меньшее, с широкой — большее. Знак точка слева, точка справа наглядно показывает направление сравнения.
+
+
Неравенство Коши +
Знаменитое неравенство: $\\dfrac{a + b}{2} \\geq \\sqrt{ab}$ для $a, b \\geq 0$ — среднее арифметическое не меньше среднего геометрического. Равенство — когда $a = b$. Это краеугольный камень многих доказательств в высшей математике.
+
`); + + html += widget('Финальная практика','PRACTICE','Случайные задачи из всей главы.',` +
Решено: 0Правильно: 0Серия: 0
+
+
+ + + +
+ `); + + html += `
${ICONS.home}
Сертификат прохождения
+

Как вы оцените своё знание неравенств?

+
+
`; + + html += secNav('p18', null); + box.innerHTML = html; + if(window.renderMathInElement) setTimeout(()=>renderMath(box), 0); + + /* BOSSES */ + const BOSSES = [ + { id:'b1', name:'Хранитель сравнения', sub:'§ 13 · свойства неравенств', icon:'<>', hp:5, tasks:[ + { t:'select', q:'Что больше: $-7$ или $-3$?', opts:['$-3$','$-7$','равны','зависит'], ok:0 }, + { t:'yesno', q:'При умножении на $-2$ знак неравенства меняется.', ok:true }, + { t:'input', q:'Дано $a > b$. Найдите $c$ такое, что $a + c$ и $b + c$ остаются в том же порядке. (введите любое число, например 5)', ans:[5] }, + { t:'select', q:'$a > b$, $b > c$. Тогда:', opts:['$a > c$','$a < c$','$a = c$','зависит'], ok:0 }, + { t:'yesno', q:'Из $a > b > 0$ следует $a^2 > b^2$.', ok:true }, + ]}, + { id:'b2', name:'Алхимик границ', sub:'§ 14 · оценка значений', icon:'±', hp:5, tasks:[ + { t:'input', q:'$1 \\leq x \\leq 3$, $2 \\leq y \\leq 5$. Найдите верхнюю границу $x + y$.', ans:[8] }, + { t:'input', q:'Те же границы. Найдите нижнюю границу $x - y$.', ans:[-4] }, + { t:'input', q:'Те же границы (все $>0$). Найдите верхнюю границу $xy$.', ans:[15] }, + { t:'yesno', q:'Можно сложить $a > b$ и $c < d$, чтобы получить $a + c > b + d$.', ok:false }, + { t:'select', q:'Если $0 < a < b$ и $0 < c < d$, то:', opts:['$ac < bd$','$ac > bd$','$ac = bd$','неизвестно'], ok:0 }, + ]}, + { id:'b3', name:'Архитектор промежутков', sub:'§ 15 · линейные', icon:'[]', hp:5, tasks:[ + { t:'select', q:'Решение $2x - 4 > 0$:', opts:['$(2;\\,+\\infty)$','$[2;\\,+\\infty)$','$(-\\infty;\\,2)$','$\\{2\\}$'], ok:0 }, + { t:'select', q:'Решение $-3x \\geq 9$:', opts:['$(-\\infty;\\,-3]$','$[-3;\\,+\\infty)$','$(-\\infty;\\,3]$','$[3;\\,+\\infty)$'], ok:0 }, + { t:'yesno', q:'Промежуток $[2;\\,5)$ включает точку $5$.', ok:false }, + { t:'select', q:'Запись $x > 4$ соответствует:', opts:['$(4;\\,+\\infty)$','$[4;\\,+\\infty)$','$(-\\infty;\\,4)$','$(-\\infty;\\,4]$'], ok:0 }, + { t:'input', q:'Корень неравенства $5x = 25$ (граница). Чему равен $x$?', ans:[5] }, + ]}, + { id:'b4', name:'Дирижёр пересечений', sub:'§ 16 · системы', icon:'∩', hp:5, tasks:[ + { t:'select', q:'$\\begin{cases} x > 2 \\\\ x \\leq 5 \\end{cases}$:', opts:['$(2;\\,5]$','$[2;\\,5)$','$(2;\\,5)$','$\\emptyset$'], ok:0 }, + { t:'yesno', q:'Система $\\begin{cases} x > 5 \\\\ x < 3 \\end{cases}$ имеет решение.', ok:false }, + { t:'select', q:'Совокупность $\\left[\\begin{array}{l} x < 0 \\\\ x \\geq 4 \\end{array}\\right.$:', opts:['$(-\\infty;\\,0) \\cup [4;\\,+\\infty)$','$[0;\\,4)$','$\\emptyset$','$\\mathbb{R}$'], ok:0 }, + { t:'yesno', q:'Система использует логическое «И», совокупность — «ИЛИ».', ok:true }, + { t:'select', q:'Пересечение $[1;\\,5]$ и $[3;\\,8]$:', opts:['$[3;\\,5]$','$[1;\\,8]$','$\\emptyset$','$[1;\\,3]$'], ok:0 }, + ]}, + { id:'b5', name:'Мастер параболы', sub:'§ 17 · квадратные', icon:'∪', hp:5, tasks:[ + { t:'select', q:'Решение $x^2 - 4 > 0$:', opts:['$(-\\infty;\\,-2) \\cup (2;\\,+\\infty)$','$(-2;\\,2)$','$[-2;\\,2]$','$\\emptyset$'], ok:0 }, + { t:'select', q:'$x^2 + 1 > 0$:', opts:['$\\mathbb{R}$','$\\emptyset$','$x \\neq 0$','$x > 0$'], ok:0 }, + { t:'yesno', q:'При $D < 0$ и $a > 0$ выражение $ax^2 + bx + c$ всегда положительно.', ok:true }, + { t:'select', q:'$x^2 - 5x + 6 \\leq 0$ имеет решение:', opts:['$[2;\\,3]$','$(2;\\,3)$','$(-\\infty;\\,2) \\cup (3;\\,+\\infty)$','$\\emptyset$'], ok:0 }, + { t:'input', q:'Сколько решений у $x^2 + 9 < 0$ (количество, 0 если нет)?', ans:[0] }, + ]}, + { id:'b6', name:'Властелин ОДЗ', sub:'§ 18 · дробно-рац.', icon:'1/x', hp:5, tasks:[ + { t:'input', q:'Запрещённая точка для $\\dfrac{1}{x - 5}$:', ans:[5] }, + { t:'select', q:'$\\dfrac{x - 1}{x + 2} > 0$:', opts:['$(-\\infty;\\,-2) \\cup (1;\\,+\\infty)$','$(-2;\\,1)$','$[-2;\\,1]$','$\\emptyset$'], ok:0 }, + { t:'yesno', q:'Точка, где знаменатель равен нулю, ВСЕГДА выколотая.', ok:true }, + { t:'select', q:'$\\dfrac{x + 3}{x - 4} \\leq 0$:', opts:['$[-3;\\,4)$','$(-3;\\,4)$','$[-3;\\,4]$','$\\emptyset$'], ok:0 }, + { t:'yesno', q:'$\\dfrac{1}{x} > 0$ верно при любом $x \\neq 0$.', ok:false }, + ]}, + { id:'b7', name:'Чемпион неравенств', sub:'Финал · вся глава', icon:'★', hp:7, tasks:[ + { t:'input', q:'$4x + 3 > 11$. Граничное значение $x$:', ans:[2] }, + { t:'select', q:'Знак $a > b$ после умножения на $-5$:', opts:['Меняется','Не меняется','Зависит','Исчезает'], ok:0 }, + { t:'select', q:'$1 \\leq x \\leq 4$, $2 \\leq y \\leq 6$. Верхняя граница $xy$:', opts:['$24$','$8$','$12$','$10$'], ok:0 }, + { t:'select', q:'$\\begin{cases} x \\geq 0 \\\\ x \\leq 10 \\end{cases}$:', opts:['$[0;\\,10]$','$(0;\\,10)$','$\\mathbb{R}$','$\\emptyset$'], ok:0 }, + { t:'select', q:'$x^2 - 9 < 0$:', opts:['$(-3;\\,3)$','$[-3;\\,3]$','$(-\\infty;\\,-3) \\cup (3;\\,+\\infty)$','$\\emptyset$'], ok:0 }, + { t:'input', q:'Запрещённая точка для $\\dfrac{x + 1}{x - 7}$:', ans:[7] }, + { t:'yesno', q:'Метод интервалов работает только для квадратных неравенств.', ok:false }, + ]}, + ]; + + const BOSS_STATE = (function(){ + try { return JSON.parse(localStorage.getItem('algebra8_ch3_bosses') || '{}'); } catch(e){ return {}; } + })(); + function saveBosses(){ try{ localStorage.setItem('algebra8_ch3_bosses', JSON.stringify(BOSS_STATE)); }catch(e){} } + + function renderBossGrid(){ + const g = document.getElementById('boss-grid'); + g.innerHTML = ''; + BOSSES.forEach(b=>{ + const won = BOSS_STATE[b.id]; + const c = document.createElement('div'); + c.style.cssText = 'background:' + (won ? 'linear-gradient(135deg,var(--ok-bg),#d1fae5)' : 'var(--card)') + ';border:1.5px solid ' + (won ? 'var(--ok)' : 'var(--border)') + ';border-radius:10px;padding:10px 12px;cursor:pointer;text-align:center;transition:transform .15s,box-shadow .15s'; + c.innerHTML = '
' + b.icon + '
' + b.name + '
' + b.sub + '
' + (won ? '
✓ Побеждён
' : '
'); + c.addEventListener('click', ()=>startBoss(b.id)); + c.addEventListener('mouseover', ()=>{ c.style.transform='translateY(-2px)'; c.style.boxShadow='var(--sh2)'; }); + c.addEventListener('mouseout', ()=>{ c.style.transform=''; c.style.boxShadow=''; }); + g.appendChild(c); + }); + if(window.renderMathInElement) renderMath(g); + } + + let currentBoss = null, taskIdx = 0, hpLeft = 0; + function startBoss(id){ + const b = BOSSES.find(x => x.id === id); + if(!b) return; + currentBoss = b; taskIdx = 0; hpLeft = b.hp; + document.getElementById('boss-arena').style.display = 'block'; + document.getElementById('boss-name').textContent = b.name; + document.getElementById('boss-subname').textContent = b.sub; + document.getElementById('boss-emoji').textContent = b.icon; + showTask(); + } + function showTask(){ + const t = currentBoss.tasks[taskIdx]; + if(!t){ winBoss(); return; } + document.getElementById('boss-hp').style.width = (hpLeft / currentBoss.hp * 100) + '%'; + const tEl = document.getElementById('boss-task'); + tEl.innerHTML = '
Задание ' + (taskIdx + 1) + ' / ' + currentBoss.tasks.length + '
' + t.q + '
'; + renderMath(tEl); + const opts = document.getElementById('boss-opts'); opts.innerHTML = ''; + document.getElementById('boss-fb').style.display = 'none'; + if(t.t === 'select'){ + t.opts.forEach((o, k)=>{ + const b = document.createElement('button'); + b.className = 'btn'; b.innerHTML = o; b.style.cssText = 'text-align:left'; + b.addEventListener('click', ()=>checkAnswer(k === t.ok, b)); + opts.appendChild(b); + }); + renderMath(opts); + } else if(t.t === 'yesno'){ + ['Да','Нет'].forEach((lab, k)=>{ + const b = document.createElement('button'); + b.className = 'btn'; b.textContent = lab; + b.addEventListener('click', ()=>checkAnswer((k === 0) === t.ok, b)); + opts.appendChild(b); + }); + } else if(t.t === 'input'){ + const wrap = document.createElement('div'); + wrap.style.cssText = 'display:flex;gap:8px;align-items:center'; + const inp = document.createElement('input'); + inp.type = 'text'; inp.placeholder = 'ваш ответ'; inp.className = 'tinp'; inp.style.flex = '1'; + const go = document.createElement('button'); go.className = 'btn primary'; go.textContent = 'Ответ'; + go.addEventListener('click', ()=>{ + const u = parseFloat(inp.value.replace(',','.')); + const ok = t.ans.some(a => Math.abs(u - a) < 1e-6); + checkAnswer(ok, go); + }); + inp.addEventListener('keyup', e=>{ if(e.key === 'Enter') go.click(); }); + wrap.appendChild(inp); wrap.appendChild(go); opts.appendChild(wrap); + } + } + function checkAnswer(ok, btn){ + const fb = document.getElementById('boss-fb'); fb.style.display = 'block'; + if(ok){ + if(btn) btn.classList.add('ok'); + feedback(fb, true, '✓ Точное попадание!'); + taskIdx++; + setTimeout(showTask, 700); + } else { + if(btn) btn.classList.add('fail'); + feedback(fb, false, '✗ Промах! Попробуйте ещё.'); + } + } + function winBoss(){ + BOSS_STATE[currentBoss.id] = 1; saveBosses(); + achievement('boss_' + currentBoss.id, 'Победил: ' + currentBoss.name); + bumpProgress('final3', 14); confetti(); + document.getElementById('boss-task').innerHTML = '
' + currentBoss.icon + '

Победа!

Босс «' + currentBoss.name + '» повержен.

'; + document.getElementById('boss-opts').innerHTML = ''; + document.getElementById('boss-fb').style.display = 'none'; + document.getElementById('boss-back').addEventListener('click', closeBoss); + renderBossGrid(); + if(BOSSES.every(b => BOSS_STATE[b.id])){ + setTimeout(()=>{ achievement('all_bosses', 'Чемпион неравенств!'); confetti(); refreshCert(); }, 800); + } + } + function closeBoss(){ document.getElementById('boss-arena').style.display = 'none'; currentBoss = null; } + document.getElementById('boss-quit').addEventListener('click', closeBoss); + renderBossGrid(); + + /* PRACTICE */ + (function(){ + let cur = null, total = 0, score = 0, streak = 0; + function gen(){ + const t = Math.floor(Math.random()*5); + if(t === 0){ + // линейное + const a = (Math.random()<0.5?-1:1)*(1+Math.floor(Math.random()*4)); + const b = -5+Math.floor(Math.random()*11); + const c = -5+Math.floor(Math.random()*11); + const v = (c - b) / a; + const flip = a < 0; + return { q:'Решите $' + a + 'x ' + (b>=0?'+ '+b:'- '+Math.abs(b)) + ' > ' + c + '$. Введите граничное значение $x$.', ans:[v] }; + } + if(t === 1){ + // оценка + const a = 1+Math.floor(Math.random()*3), b = a+1+Math.floor(Math.random()*3); + const c = 1+Math.floor(Math.random()*3), d = c+1+Math.floor(Math.random()*3); + return { q:'Дано: $' + a + ' \\leq x \\leq ' + b + '$, $' + c + ' \\leq y \\leq ' + d + '$. Верхняя граница $x + y$:', ans:[b + d] }; + } + if(t === 2){ + // система + const a = -5+Math.floor(Math.random()*5), b = a+2+Math.floor(Math.random()*5); + return { q:'$\\begin{cases} x > ' + a + ' \\\\ x \\leq ' + b + ' \\end{cases}$. Введите верхнюю границу.', ans:[b] }; + } + if(t === 3){ + // квадратное + const r = 1+Math.floor(Math.random()*5); + return { q:'Сколько корней у $x^2 - ' + (r*r) + ' = 0$?', ans:[2] }; + } + // дробное + const r = (Math.random()<0.5?-1:1)*(1+Math.floor(Math.random()*8)); + return { q:'Запрещённая точка для $\\dfrac{1}{x - ' + r + '}$:', ans:[r] }; + } + function show(){ + cur = gen(); + document.getElementById('prac-task').innerHTML = cur.q; + renderMath(document.getElementById('prac-task')); + document.getElementById('prac-inp').value = ''; + document.getElementById('prac-fb').style.display = 'none'; + } + document.getElementById('prac-go').addEventListener('click', ()=>{ + const fb = document.getElementById('prac-fb'); fb.style.display = 'block'; + const u = parseFloat(document.getElementById('prac-inp').value.replace(',','.')); + const ok = cur.ans.some(a => Math.abs(u - a) < 1e-6); + total++; + if(ok){ score++; streak++; feedback(fb, true, '✓'); if(streak === 5){ achievement('prac_streak', 'Серия из 5!'); confetti(); } } + else { streak = 0; feedback(fb, false, 'Правильно: ' + cur.ans.join(', ')); } + document.getElementById('prac-i').textContent = total; + document.getElementById('prac-score').textContent = score; + document.getElementById('prac-streak').textContent = streak; + if(total >= 5) bumpProgress('final3', 4); + }); + document.getElementById('prac-next').addEventListener('click', show); + document.getElementById('prac-inp').addEventListener('keyup', e=>{ if(e.key === 'Enter') document.getElementById('prac-go').click(); }); + show(); + })(); + + function refreshCert(){ + const won = BOSSES.filter(b => BOSS_STATE[b.id]).length; + const cs = document.getElementById('cert-state'); + if(!cs) return; + if(won === BOSSES.length){ + cs.innerHTML = '
ЧЕМПИОН НЕРАВЕНСТВ
Все 7 боссов главы 3 повержены — вы освоили §§ 13–18.
'; + } else { + cs.innerHTML = 'Побеждено боссов: ' + won + ' / ' + BOSSES.length + '. Победите всех, чтобы получить титул.'; + } + } + refreshCert(); +}