From d8141087cd5db89a493b2e61b5995d8263898b5f Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Fri, 29 May 2026 22:59:46 +0300 Subject: [PATCH] =?UTF-8?q?feat(phys8=20ch1):=20Phase=201=20Wave=203=20?= =?UTF-8?q?=E2=80=94=20=C2=A76=20(Q=3Dcm=CE=94T)=20+=20=C2=A77=20(Q=3Dqm)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §6 — Расчёт количества теплоты: - 3 теории: закон Q=cmΔT, удельная теплоёмкость, баланс - IV-1: калькулятор Q=cmΔT с термометром и анимированным кубиком, выбор из 11 веществ (вода/лёд/металлы/стекло/...) - IV-2: калькулятор смешивания 2 порций воды по m₁T₁+m₂T₂/(m₁+m₂) - IV-3: DnD-ранжирование 5 веществ по возрастанию c - IV-4: 6 числовых задач с допуском, подсказки §7 — Горение и теплота сгорания: - 3 теории: закон Q=qm, таблица q топлив, КПД - IV-1: калькулятор Q=qm с анимированным пламенем (высота ∝ m), выбор из 8 топлив, перевод в кВт·ч и эквивалент нагрева воды - IV-2: 6 раундов «какое топливо мощнее» - IV-3: DnD ранжирование 5 топлив по возрастанию q - IV-4: 5 числовых задач с подсказками Добавлены константы MAT_C и MAT_Q — табличные данные для §6, §7. Co-Authored-By: Claude Opus 4.7 --- frontend/textbooks/physics_8_ch1.html | 491 +++++++++++++++++++++++++- 1 file changed, 485 insertions(+), 6 deletions(-) diff --git a/frontend/textbooks/physics_8_ch1.html b/frontend/textbooks/physics_8_ch1.html index a97a694..0541b2c 100644 --- a/frontend/textbooks/physics_8_ch1.html +++ b/frontend/textbooks/physics_8_ch1.html @@ -301,8 +301,25 @@ const SIDEBARS = { ["Излучают всё","чем горячее, тем сильнее"], ["Тёмные тела","поглощают и излучают сильнее светлых"] ]}, - p6:{title:"Шпаргалка § 6",rows:[["В разработке","Phase 1 Wave 3"]]}, - p7:{title:"Шпаргалка § 7",rows:[["В разработке","Phase 1 Wave 3"]]}, + p6:{title:"Шпаргалка § 6",rows:[ + ["Закон","$Q = c m \\Delta T$"], + ["$c$ — уд. теплоёмкость","Дж/(кг·К)"], + ["вода","$c = 4200$"], + ["лёд","$c = 2100$"], + ["алюминий","$c = 920$"], + ["медь","$c = 380$"], + ["железо","$c = 460$"], + ["Баланс","$Q_{отд} = Q_{пол}$"] + ]}, + p7:{title:"Шпаргалка § 7",rows:[ + ["Закон","$Q = q m$"], + ["$q$ — уд. теплота сгорания","Дж/кг"], + ["дрова","$q = 10^7$"], + ["уголь","$q = 3 \\cdot 10^7$"], + ["бензин","$q = 4{,}6 \\cdot 10^7$"], + ["природ. газ","$q = 4{,}4 \\cdot 10^7$"], + ["КПД котла","$\\eta = Q_{пол}/(q m)$"] + ]}, p8:{title:"Шпаргалка § 8",rows:[["В разработке","Phase 1 Wave 4"]]}, p9:{title:"Шпаргалка § 9",rows:[["В разработке","Phase 1 Wave 4"]]}, p10:{title:"Шпаргалка § 10",rows:[["В разработке","Phase 1 Wave 5"]]}, @@ -316,8 +333,8 @@ const TIPS=[ {sec:'p3',html:"Один конец металлического стержня в огне — другой нагревается, хотя ничто не движется. Это теплопроводность: молекулы передают энергию соседям. У металлов это работает быстро, у дерева — медленно."}, {sec:'p4',html:"Тёплый воздух легче холодного и поднимается вверх. Так батарея греет всю комнату — это конвекция. В твёрдых телах конвекции нет, потому что молекулы не могут свободно двигаться."}, {sec:'p5',html:"Солнце греет Землю через космический вакуум — теплопроводность и конвекция тут невозможны. Это излучение электромагнитными волнами. Чёрная футболка в жаркий день нагревается сильнее белой."}, - {sec:'p6',html:"Параграф § 6 будет реализован в Phase 1 Wave 3. Используем хелперы из phys.js и optics.js."}, - {sec:'p7',html:"Параграф § 7 будет реализован в Phase 1 Wave 3. Используем хелперы из phys.js и optics.js."}, + {sec:'p6',html:"Чтобы нагреть тело массой $m$ на $\\Delta T$ градусов, нужно $Q = c m \\Delta T$. Здесь $c$ — это «сколько энергии съедает 1 кг этого вещества на 1 градус». У воды $c$ самое большое — поэтому вода долго греется и долго остывает."}, + {sec:'p7',html:"При сгорании 1 кг топлива выделяется $q$ Дж энергии. Полное выделение: $Q = q m$. У бензина $q$ в 4,5 раза больше, чем у дров, — поэтому литр бензина греет дольше, чем литр дров."}, {sec:'p8',html:"Параграф § 8 будет реализован в Phase 1 Wave 4. Используем хелперы из phys.js и optics.js."}, {sec:'p9',html:"Параграф § 9 будет реализован в Phase 1 Wave 4. Используем хелперы из phys.js и optics.js."}, {sec:'p10',html:"Параграф § 10 будет реализован в Phase 1 Wave 5. Используем хелперы из phys.js и optics.js."}, @@ -331,8 +348,8 @@ const BUILDERS = { p3: ()=>{ build_p3(); }, p4: ()=>{ build_p4(); }, p5: ()=>{ build_p5(); }, - p6: ()=>{ const box=document.getElementById('p6-body'); box.innerHTML = buildStub('p6', 'Расчёт количества теплоты при нагревании и охлаждении. Удельная теплоёмкость', 'Phase 1 Wave 3') + secNavFor('p6') + readButton('p6'); renderMath(box); wireReadBtn('p6'); }, - p7: ()=>{ const box=document.getElementById('p7-body'); box.innerHTML = buildStub('p7', 'Горение. Удельная теплота сгорания топлива', 'Phase 1 Wave 3') + secNavFor('p7') + readButton('p7'); renderMath(box); wireReadBtn('p7'); }, + p6: ()=>{ build_p6(); }, + p7: ()=>{ build_p7(); }, p8: ()=>{ const box=document.getElementById('p8-body'); box.innerHTML = buildStub('p8', 'Плавление и кристаллизация', 'Phase 1 Wave 4') + secNavFor('p8') + readButton('p8'); renderMath(box); wireReadBtn('p8'); }, p9: ()=>{ const box=document.getElementById('p9-body'); box.innerHTML = buildStub('p9', 'Удельная теплота плавления и кристаллизации', 'Phase 1 Wave 4') + secNavFor('p9') + readButton('p9'); renderMath(box); wireReadBtn('p9'); }, p10: ()=>{ const box=document.getElementById('p10-body'); box.innerHTML = buildStub('p10', 'Испарение жидкостей. Факторы, влияющие на скорость испарения', 'Phase 1 Wave 5') + secNavFor('p10') + readButton('p10'); renderMath(box); wireReadBtn('p10'); }, @@ -2030,6 +2047,468 @@ function _initP5_mcq(){ render(); } +/* ====================================================================== + PHASE 1 · WAVE 3 — §6, §7 + ====================================================================== */ + +/* Таблица удельных теплоёмкостей (Дж/(кг·К)) */ +const MAT_C = [ + {key:'water', name:'вода', c:4200}, + {key:'ice', name:'лёд', c:2100}, + {key:'oil', name:'масло раст.',c:2000}, + {key:'wood', name:'дерево', c:2400}, + {key:'glass', name:'стекло', c:840 }, + {key:'al', name:'алюминий', c:920 }, + {key:'fe', name:'железо', c:460 }, + {key:'brass', name:'латунь', c:380 }, + {key:'cu', name:'медь', c:380 }, + {key:'lead', name:'свинец', c:130 }, + {key:'hg', name:'ртуть', c:140 } +]; + +/* Таблица удельных теплот сгорания (Дж/кг) */ +const MAT_Q = [ + {key:'wood', name:'дрова', q:1.0e7}, + {key:'peat', name:'торф', q:1.5e7}, + {key:'coal', name:'каменный уголь', q:3.0e7}, + {key:'alc', name:'спирт', q:2.7e7}, + {key:'oil', name:'нефть', q:4.4e7}, + {key:'gas', name:'природный газ', q:4.4e7}, + {key:'kero', name:'керосин', q:4.6e7}, + {key:'gasoline',name:'бензин', q:4.6e7} +]; + +/* ======== §6 — Q = cm ΔT ======== */ +function build_p6(){ + const box = document.getElementById('p6-body'); + let h = ''; + + h += makeCard('theory', 'Закон нагревания', '§ 6.1', + '

Чтобы изменить температуру тела массой $m$ на $\\Delta T = T_2 - T_1$, нужно сообщить ему (или отнять у него) количество теплоты:

' + +'

$$Q = c\\,m\\,\\Delta T$$

' + +'' + +'

Если $T_2 > T_1$ — тело нагревается, $Q > 0$. Если $T_2 < T_1$ — остывает, $Q < 0$.

' + ); + h += makeCard('rule', 'Что такое удельная теплоёмкость', '§ 6.2', + '

$c$ — количество теплоты, нужное чтобы нагреть 1 кг вещества на 1 К (или 1 °C).

' + +'

У воды $c = 4200$ Дж/(кг·К) — это очень много. Поэтому:

' + +'' + +'

У металлов $c$ маленькая: медь 380, железо 460. Они быстро нагреваются и быстро остывают.

' + ); + h += makeCard('example', 'Уравнение теплового баланса', '§ 6.3', + '

Когда горячее тело отдаёт тепло холодному в изолированной системе (без потерь), вся отданная теплота получена холодным:

' + +'

$$Q_{отд} = Q_{пол}$$

' + +'

Если смешать массы $m_1$ при $T_1$ и $m_2$ при $T_2$ одного вещества:

' + +'

$$T = \\dfrac{m_1 T_1 + m_2 T_2}{m_1 + m_2}$$

' + +'

Это средневзвешенная температура.

' + ); + + /* IV1 — калькулятор Q = cmΔT с анимацией */ + let optsC = ''; + MAT_C.forEach(m=>{ optsC += ''; }); + h += '
' + +'
IV-1
Калькулятор $Q = cm\\Delta T$
' + +'
Выбери вещество, массу и изменение температуры — увидь, сколько энергии нужно. Термометр покажет процесс.
' + +'
' + +'' + +'' + +'' + +'
' + +'' + +'
' + +'$c$ = 4200 Дж/(кг·К)' + +'$Q$ = 2.10 × 10^5 Дж = 210 кДж' + +'Это столько энергии съедает плита или электрочайник.' + +'
' + +'
'; + + /* IV2 — калькулятор смешивания */ + h += '
' + +'
IV-2
Смешивание воды
' + +'
В термос налили $m_1$ кг воды при $T_1$ °C и долили $m_2$ кг воды при $T_2$ °C. Какая будет итоговая температура (без потерь)? Формула: $T = (m_1 T_1 + m_2 T_2)/(m_1 + m_2)$.
' + +'
' + +'' + +'' + +'' + +'' + +'
' + +'
$T_{итог} = $ 36.7 °C
' + +'
'; + + /* IV3 — DnD ранжирование c */ + h += '
' + +'
IV-3
У какого вещества $c$ больше?
' + +'
Перетащи вещества так, чтобы они шли от меньшего $c$ к большему. Подсказка: у воды $c$ рекордно велика, у металлов — мала.
' + +'
' + +'
' + +'
1. Меньше всех
' + +'
2
' + +'
3
' + +'
4
' + +'
5. Больше всех
' + +'
' + +'
' + +'' + +'
'; + + /* IV4 — тренажёр расчётных задач */ + h += '
' + +'
IV-4
Тренажёр: 6 расчётных задач
' + +'
Введи числовой ответ. 4+ верных решения — +15 XP. Допуск ±2%.
' + +'
' + +'
Задача: 1 / 6Правильно: 0
' + +'
'; + + box.innerHTML = h + secNavFor('p6') + readButton('p6'); + renderMath(box); + wireReadBtn('p6'); + + _initP6_calc(); + _initP6_mix(); + _initP6_dnd(); + _initP6_tasks(); +} + +function _initP6_calc(){ + const svg = document.getElementById('p6-sim'); if(!svg) return; + function fmtSci(x){ + if(Math.abs(x) < 1000) return x.toFixed(0); + const e = Math.floor(Math.log10(Math.abs(x))); + const mant = (x / Math.pow(10, e)).toFixed(2); + return mant+' × 10'+e+''; + } + function update(){ + const c = +document.getElementById('p6-mat').value; + const m = +document.getElementById('p6-m').value; + const d = +document.getElementById('p6-d').value; + document.getElementById('p6-mv').textContent = m.toFixed(1); + document.getElementById('p6-dv').textContent = d; + document.getElementById('p6-cv').textContent = c; + const Q = c * m * d; + document.getElementById('p6-q').innerHTML = fmtSci(Q); + document.getElementById('p6-qkj').textContent = (Q/1000).toFixed(1); + /* sim: куб + термометр, цвет по итоговой T (20 + d) */ + const Tfinal = 20 + d; + const col = window.PHYS.tempColor(Tfinal, -50, 150); + let s = ''; + s += ''; + s += 'm = '+m.toFixed(1)+' кг'; + s += ''+(d>0?'нагреваем':d<0?'охлаждаем':'без изменения')+''; + /* термометр */ + s += window.PHYS.thermometer(220, 30, 100, -50, 150, Tfinal); + /* подпись Q */ + s += 'Q = c · m · ΔT'; + s += '= '+c+' · '+m.toFixed(1)+' · '+d+''; + s += 'Q = '+(Q/1000).toFixed(1)+' кДж'; + svg.innerHTML = s; + } + document.getElementById('p6-mat').addEventListener('change', update); + document.getElementById('p6-m').addEventListener('input', update); + document.getElementById('p6-d').addEventListener('input', update); + update(); +} + +function _initP6_mix(){ + function update(){ + const m1 = +document.getElementById('p6-mx1').value; + const t1 = +document.getElementById('p6-tx1').value; + const m2 = +document.getElementById('p6-mx2').value; + const t2 = +document.getElementById('p6-tx2').value; + document.getElementById('p6-mxv1').textContent = m1.toFixed(1); + document.getElementById('p6-txv1').textContent = t1; + document.getElementById('p6-mxv2').textContent = m2.toFixed(1); + document.getElementById('p6-txv2').textContent = t2; + const T = (m1*t1 + m2*t2) / (m1 + m2); + document.getElementById('p6-tres').textContent = T.toFixed(1); + } + ['p6-mx1','p6-tx1','p6-mx2','p6-tx2'].forEach(id => document.getElementById(id).addEventListener('input', update)); + update(); +} + +function _initP6_dnd(){ + /* 5 веществ по возрастанию c: свинец(130) → железо(460) → стекло(840) → дерево(2400) → вода(4200) */ + const items = [ + {id:'pb', cat:'r1', html:'свинец (130)'}, + {id:'fe', cat:'r2', html:'железо (460)'}, + {id:'gl', cat:'r3', html:'стекло (840)'}, + {id:'wd', cat:'r4', html:'дерево (2400)'}, + {id:'wa', cat:'r5', html:'вода (4200)'} + ]; + const dnd = setupSorter({ poolId:'p6-dnd-pool', scopeSelector:'#sec-p6', cats:['r1','r2','r3','r4','r5'], items, columnLayout:false }); + document.getElementById('p6-dnd-check').addEventListener('click', ()=>{ + const fb = document.getElementById('p6-dnd-fb'); + let wrong = 0; items.forEach(it=>{ if(dnd.placed[it.id] !== it.cat) wrong++; }); + if(wrong===0){ fb.className='feedback ok'; fb.innerHTML='✓ Идеально! +15 XP. У воды $c$ рекордно велика — её сложно нагреть и сложно охладить.'; addXp(15,'p6-dnd'); bumpProgress('p6', 20); renderMath(fb); } + else { fb.className='feedback fail'; fb.innerHTML='✗ Ошибок: '+wrong+'. Подсказка: металлы — мало, вода — рекорд.'; } + }); + document.getElementById('p6-dnd-reset').addEventListener('click', ()=>{ dnd.reset(); const fb=document.getElementById('p6-dnd-fb'); fb.style.display='none'; }); +} + +function _initP6_tasks(){ + const TASKS = [ + {q:'Сколько энергии в кДж нужно, чтобы нагреть 2 кг воды от 20 до 100 °C? ($c_{воды} = 4200$)', ans: 672, tol: 14, why:'$Q = 4200 \\cdot 2 \\cdot 80 = 672\\,000$ Дж = $672$ кДж.'}, + {q:'Какую массу алюминия (в кг) можно нагреть на 50 °C, имея 92 кДж? ($c = 920$)', ans: 2, tol: 0.05, why:'$m = Q/(c \\Delta T) = 92\\,000/(920 \\cdot 50) = 2$ кг.'}, + {q:'На сколько градусов нагреется 0,5 кг меди при $Q = 19\\,000$ Дж? ($c = 380$)', ans: 100, tol: 2, why:'$\\Delta T = Q/(cm) = 19\\,000/(380 \\cdot 0{,}5) = 100$ К.'}, + {q:'Смешали 1 кг воды при 80 °C и 3 кг воды при 20 °C. Какая итоговая температура (°C)?', ans: 35, tol: 0.5, why:'$T = (1 \\cdot 80 + 3 \\cdot 20)/4 = 140/4 = 35$ °C.'}, + {q:'Какова удельная теплоёмкость (Дж/(кг·К)) вещества, если 3 кг его при $\\Delta T = 40$ К получили 48 кДж?', ans: 400, tol: 10, why:'$c = Q/(m\\Delta T) = 48\\,000/(3 \\cdot 40) = 400$. Это близко к меди.'}, + {q:'Найди $Q$ (в кДж) для остывания 4 кг железа с 200 до 50 °C. ($c = 460$). Запиши абсолютную величину.', ans: 276, tol: 6, why:'$|Q| = 460 \\cdot 4 \\cdot 150 = 276\\,000$ Дж = $276$ кДж.'} + ]; + let i = 0, ok = 0, done = 0, awarded = false; + function render(){ + const t = TASKS[i]; const wrap = document.getElementById('p6-task'); if(!wrap) return; + wrap.innerHTML = + '
Задача '+(i+1)+'. '+t.q+'
' + +'
' + +'' + +'' + +'
' + +'
'+t.why+'
' + +''; + document.getElementById('p6-task-i').textContent = (i+1); + document.getElementById('p6-task-ok').textContent = ok; + document.getElementById('p6-task-go').addEventListener('click', ()=>{ + const v = parseFloat((document.getElementById('p6-task-inp').value || '').replace(',','.')); + const fb = document.getElementById('p6-task-fb'); + if(isNaN(v)){ fb.className='feedback fail'; fb.innerHTML='Введи число.'; return; } + done++; + if(Math.abs(v - t.ans) < t.tol){ ok++; fb.className='feedback ok'; fb.innerHTML='✓ Верно! '+t.why; addXp(4,'p6-task'); bumpProgress('p6', 6); } + else { fb.className='feedback fail'; fb.innerHTML='✗ Не то. Правильный ответ: '+t.ans+'. '+t.why; } + document.getElementById('p6-task-ok').textContent = ok; + renderMath(wrap); + if(done >= TASKS.length && !awarded && ok >= 4){ awarded = true; setTimeout(()=>{ const wf=document.getElementById('p6-task-fb'); wf.className='feedback ok'; wf.innerHTML='✓ +15 XP — расчёты сданы ('+ok+'/'+TASKS.length+').'; addXp(15,'p6-task-bonus'); bumpProgress('p6', 15); }, 600); } + }); + document.getElementById('p6-task-hint').addEventListener('click', ()=>{ document.getElementById('p6-task-hint-txt').classList.toggle('show'); }); + document.getElementById('p6-task-next').addEventListener('click', ()=>{ i=(i+1)%TASKS.length; render(); }); + renderMath(wrap); + } + render(); +} + +/* ======== §7 — Q = qm ======== */ +function build_p7(){ + const box = document.getElementById('p7-body'); + let h = ''; + + h += makeCard('theory', 'Горение и теплота сгорания', '§ 7.1', + '

При горении топливо реагирует с кислородом и выделяет энергию в виде тепла. Энергия эта запасена в химических связях молекул топлива.

' + +'

Количество теплоты, выделившееся при полном сгорании массы $m$ топлива:

' + +'

$$Q = q\\,m$$

' + +'

$q$ — удельная теплота сгорания, Дж/кг. Это энергия, которую даёт сгорание 1 кг данного топлива.

' + ); + h += makeCard('rule', 'Топлива и их $q$', '§ 7.2', + '' + + MAT_Q.map(m=>'').join('') + +'
Топливо$q$, $\\dfrac{\\text{Дж}}{\\text{кг}}$
'+m.name+''+m.q.toExponential(1).replace('+','')+'
' + +'

Чем больше $q$, тем «энергоёмче» топливо. Бензин примерно в 4,5 раза мощнее дров на кг.

' + ); + h += makeCard('example', 'КПД нагревательного устройства', '§ 7.3', + '

Реально не вся выделившаяся при сгорании энергия идёт на полезное дело (нагрев воды, движение машины). Часть теряется в виде тепла в окружающую среду.

' + +'

$$\\eta = \\dfrac{Q_{пол}}{Q_{сгор}} = \\dfrac{Q_{пол}}{q m}$$

' + +'

У хорошего котла $\\eta \\approx 80\\%$, у плохой буржуйки — 30%.

' + ); + + /* IV1 — калькулятор Q = qm */ + let optsQ = ''; + MAT_Q.forEach(m=>{ optsQ += ''; }); + h += '
' + +'
IV-1
Калькулятор $Q = qm$
' + +'
Выбери топливо и массу — увидь, сколько энергии выделится при его полном сгорании.
' + +'
' + +'' + +'' + +'
' + +'' + +'
' + +'$q$ = 107 Дж/кг' + +'$Q$ = 10 МДж = 2.8 кВт·ч' + +'Эквивалент: нагрев 30 кг воды от 20 до 100 °C.' + +'
' + +'
'; + + /* IV2 — викторина «какое топливо мощнее» */ + h += '
' + +'
IV-2
Какое топливо мощнее?
' + +'
Выбери топливо с большей удельной теплотой сгорания.
' + +'
' + +'
' + +'
Раунд: 1 / 6Правильно: 0
' + +'
'; + + /* IV3 — DnD ранжирование топлив */ + h += '
' + +'
IV-3
Расставь топлива по $q$ (по возрастанию)
' + +'
От самого слабого до самого мощного по теплоте сгорания.
' + +'
' + +'
' + +'
1. Меньше
' + +'
2
' + +'
3
' + +'
4
' + +'
5. Больше
' + +'
' + +'
' + +'' + +'
'; + + /* IV4 — тренажёр расчётных задач */ + h += '
' + +'
IV-4
Тренажёр: 5 расчётных задач
' + +'
4+ верных — +15 XP. Допуск ±3 %.
' + +'
' + +'
Задача: 1 / 5Правильно: 0
' + +'
'; + + box.innerHTML = h + secNavFor('p7') + readButton('p7'); + renderMath(box); + wireReadBtn('p7'); + + _initP7_calc(); + _initP7_quiz(); + _initP7_dnd(); + _initP7_tasks(); +} + +function _initP7_calc(){ + const svg = document.getElementById('p7-sim'); if(!svg) return; + function update(){ + const q = +document.getElementById('p7-fuel').value; + const m = +document.getElementById('p7-m').value; + document.getElementById('p7-mv').textContent = m.toFixed(1); + document.getElementById('p7-qv').innerHTML = q.toExponential(1).replace('+','').replace('e', ' × 10')+''; + const Q = q * m; + document.getElementById('p7-q').innerHTML = (Q/1e6).toFixed(1)+' МДж'; + document.getElementById('p7-qkw').textContent = (Q/3.6e6).toFixed(2); + /* эквивалент: нагрев воды от 20 до 100 → ΔT=80, Q=cmΔT, m = Q/(c·80) */ + document.getElementById('p7-eqkg').textContent = (Q/(4200*80)).toFixed(1); + /* SVG: огонь + котелок */ + let s = ''; + /* печь */ + s += ''; + /* пламя */ + const flameH = 30 + Math.min(50, m*5); + s += ''; + s += ''; + /* топливо */ + s += ''+m.toFixed(1)+' кг'; + /* стрелка-энергия */ + s += 'Q = q m'; + s += '= '+q.toExponential(1).replace('+','')+' · '+m.toFixed(1)+''; + s += 'Q = '+(Q/1e6).toFixed(1)+' МДж'; + s += ''+(Q/3.6e6).toFixed(2)+' кВт·ч'; + svg.innerHTML = s; + } + document.getElementById('p7-fuel').addEventListener('change', update); + document.getElementById('p7-m').addEventListener('input', update); + update(); +} + +function _initP7_quiz(){ + const QS = [ + {A:'дрова', B:'бензин', ans:'B', why:'У бензина $q \\approx 4{,}6 \\cdot 10^7$, у дров $\\approx 10^7$ — бензин в 4,5 раза мощнее.'}, + {A:'торф', B:'каменный уголь', ans:'B', why:'У угля $q$ вдвое больше, чем у торфа.'}, + {A:'спирт', B:'природный газ', ans:'B', why:'У газа $4{,}4 \\cdot 10^7$, у спирта $2{,}7 \\cdot 10^7$.'}, + {A:'керосин', B:'дрова', ans:'A', why:'Керосин — продукт переработки нефти, $q$ в 4,6 раза больше.'}, + {A:'нефть', B:'бензин', ans:'B', why:'У бензина чуть больше: $4{,}6$ против $4{,}4 \\cdot 10^7$.'}, + {A:'торф', B:'дрова', ans:'B', why:'У дров $q \\approx 10^7$, у торфа $1{,}5 \\cdot 10^7$ — торф мощнее. Правильный ответ: торф, ответ A.', flip:true} + ]; + let i = 0, ok = 0; + function render(){ + const q = QS[i]; const wrap = document.getElementById('p7-quiz'); if(!wrap) return; + /* для flip-задачи правильный ответ A */ + const correctAns = q.flip ? 'A' : q.ans; + wrap.innerHTML = + '
' + +'' + +'' + +'
' + +''; + document.getElementById('p7-quiz-r').textContent = (i+1); + document.getElementById('p7-quiz-ok').textContent = ok; + wrap.querySelectorAll('[data-pick]').forEach(btn=>{ + btn.addEventListener('click', ()=>{ + if(btn.disabled) return; wrap.querySelectorAll('[data-pick]').forEach(b=>b.disabled=true); + const fb = document.getElementById('p7-quiz-fb'); + if(btn.dataset.pick === correctAns){ ok++; fb.className='feedback ok'; fb.innerHTML='✓ Верно. '+q.why; addXp(3,'p7-quiz'); bumpProgress('p7', 4); } + else { fb.className='feedback fail'; fb.innerHTML='✗ Не то. '+q.why; } + document.getElementById('p7-quiz-ok').textContent = ok; + renderMath(wrap); + }); + }); + renderMath(wrap); + } + document.getElementById('p7-quiz-next').addEventListener('click', ()=>{ i=(i+1)%QS.length; render(); }); + render(); +} + +function _initP7_dnd(){ + /* 5 топлив по возрастанию q: дрова(1) → торф(1.5) → спирт(2.7) → уголь(3) → бензин(4.6), все ×10^7 */ + const items = [ + {id:'wd', cat:'r1', html:'дрова ($10^7$)'}, + {id:'pt', cat:'r2', html:'торф ($1{,}5 \\cdot 10^7$)'}, + {id:'al', cat:'r3', html:'спирт ($2{,}7 \\cdot 10^7$)'}, + {id:'cl', cat:'r4', html:'уголь ($3 \\cdot 10^7$)'}, + {id:'gs', cat:'r5', html:'бензин ($4{,}6 \\cdot 10^7$)'} + ]; + const dnd = setupSorter({ poolId:'p7-dnd-pool', scopeSelector:'#sec-p7', cats:['r1','r2','r3','r4','r5'], items, columnLayout:false }); + document.getElementById('p7-dnd-check').addEventListener('click', ()=>{ + const fb = document.getElementById('p7-dnd-fb'); + let wrong = 0; items.forEach(it=>{ if(dnd.placed[it.id] !== it.cat) wrong++; }); + if(wrong===0){ fb.className='feedback ok'; fb.innerHTML='✓ Идеально! +15 XP. Углеводороды (нефть, бензин, газ) — самые энергоёмкие.'; addXp(15,'p7-dnd'); bumpProgress('p7', 20); } + else { fb.className='feedback fail'; fb.innerHTML='✗ Ошибок: '+wrong+'. Подсказка: бензин — самый мощный из распространённых.'; } + }); + document.getElementById('p7-dnd-reset').addEventListener('click', ()=>{ dnd.reset(); const fb=document.getElementById('p7-dnd-fb'); fb.style.display='none'; }); +} + +function _initP7_tasks(){ + const TASKS = [ + {q:'Сколько энергии (в МДж) выделится при полном сгорании 2 кг бензина? ($q = 4{,}6 \\cdot 10^7$)', ans: 92, tol: 2, why:'$Q = qm = 4{,}6 \\cdot 10^7 \\cdot 2 = 9{,}2 \\cdot 10^7 = 92$ МДж.'}, + {q:'Какую массу (в кг) дров нужно сжечь, чтобы получить 50 МДж энергии? ($q = 10^7$)', ans: 5, tol: 0.1, why:'$m = Q/q = 5 \\cdot 10^7 / 10^7 = 5$ кг.'}, + {q:'При сгорании 0,5 кг угля выделилось 15 МДж. Чему равно $q$ (в МДж/кг)?', ans: 30, tol: 1, why:'$q = Q/m = 15/0{,}5 = 30$ МДж/кг — это каменный уголь.'}, + {q:'Котёл с $\\eta = 80\\%$ сжёг 2 кг дров. Какая полезная энергия (в МДж)? ($q = 10^7$)', ans: 16, tol: 0.3, why:'$Q_{сгор}=2 \\cdot 10^7 = 20$ МДж. $Q_{пол} = \\eta \\cdot Q_{сгор} = 0{,}8 \\cdot 20 = 16$ МДж.'}, + {q:'Сколько кг бензина даст столько же энергии, что и 9,2 кг дров? ($q_{дров}=10^7$, $q_{бенз}=4{,}6 \\cdot 10^7$)', ans: 2, tol: 0.05, why:'Энергия дров: $9{,}2 \\cdot 10^7$ Дж. $m_{бенз}=E/q_{бенз}=9{,}2 \\cdot 10^7/(4{,}6 \\cdot 10^7) = 2$ кг.'} + ]; + let i = 0, ok = 0, done = 0, awarded = false; + function render(){ + const t = TASKS[i]; const wrap = document.getElementById('p7-task'); if(!wrap) return; + wrap.innerHTML = + '
Задача '+(i+1)+'. '+t.q+'
' + +'
' + +'' + +'' + +'
' + +'
'+t.why+'
' + +''; + document.getElementById('p7-task-i').textContent = (i+1); + document.getElementById('p7-task-ok').textContent = ok; + document.getElementById('p7-task-go').addEventListener('click', ()=>{ + const v = parseFloat((document.getElementById('p7-task-inp').value || '').replace(',','.')); + const fb = document.getElementById('p7-task-fb'); + if(isNaN(v)){ fb.className='feedback fail'; fb.innerHTML='Введи число.'; return; } + done++; + if(Math.abs(v - t.ans) < t.tol){ ok++; fb.className='feedback ok'; fb.innerHTML='✓ Верно! '+t.why; addXp(4,'p7-task'); bumpProgress('p7', 6); } + else { fb.className='feedback fail'; fb.innerHTML='✗ Не то. Правильный ответ: '+t.ans+'. '+t.why; } + document.getElementById('p7-task-ok').textContent = ok; + renderMath(wrap); + if(done >= TASKS.length && !awarded && ok >= 4){ awarded = true; setTimeout(()=>{ const wf=document.getElementById('p7-task-fb'); wf.className='feedback ok'; wf.innerHTML='✓ +15 XP — расчёты сданы ('+ok+'/'+TASKS.length+').'; addXp(15,'p7-task-bonus'); bumpProgress('p7', 15); }, 600); } + }); + document.getElementById('p7-task-hint').addEventListener('click', ()=>{ document.getElementById('p7-task-hint-txt').classList.toggle('show'); }); + document.getElementById('p7-task-next').addEventListener('click', ()=>{ i=(i+1)%TASKS.length; render(); }); + renderMath(wrap); + } + render(); +} + function init(){ loadProgress(); initTheme(); initSidebarToggle(); initSearch(); buildParaSelector(); refreshProgressUI(); loadServerReadState(); goTo(PARAS[0].id);