feat(phys10 ch6 wave1): §34 «Ток в металлах» + §35 «Электролиты»

§34 «Электрический ток в металлах. Сверхпроводимость»:
- 3 makeCard: природа тока, R(t) для металлов, сверхпроводимость
- IV1: симуляция дрейфа электронов в решётке (SVG, slider U)
- IV2: график R(t) = R_0(1 + alpha t), переключение материалов + скачок T_c
- IV3: квикфайр на носителей заряда в средах (6 вопросов)
- IV4: тренажёр 5 задач (rho L/S, R при разных T, T_c ртути)

§35 «Электрический ток в электролитах. Электролиз»:
- 3 makeCard: электролиты/ионы, законы Фарадея, применение
- IV1: симуляция электролиза (катионы → катоду, анионы → аноду)
- IV2: калькулятор массы m = MIt/(Fn) для Cu/Ag/Al/Fe/H
- IV3: квикфайр направления ионов (6 вопросов, 2 кнопки)
- IV4: тренажёр 5 задач (расчёт m для Cu/Ag, F = 96500)
This commit is contained in:
Maxim Dolgolyov
2026-05-29 18:32:53 +03:00
parent e192feefcc
commit bed085ac98
+757 -12
View File
@@ -634,34 +634,779 @@ function wireReadBtn(paraId){
function build_p34(){
const box = document.getElementById('p34-body');
let html = '';
html += makeCard('theory', "Ток в металлах. Сверхпроводимость", "§34", `
<p><b>Ток в металлах. Сверхпроводимость</b> — этот параграф в разработке (Phase 1+).</p>
<p>Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.</p>
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.92rem">
<b>Phase 0:</b> создан скелет учебника. <b>Phase 6+:</b> наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019).
</p>
/* THEORY 1 — Природа тока в металлах */
html += makeCard('theory', "Природа тока в металлах", "§34", `
<p>В <b>металлах</b> свободными носителями заряда являются <b>электроны проводимости</b> — внешние электроны атомов, не связанные с конкретным узлом решётки.</p>
<p style="margin-top:10px">Концентрация свободных электронов огромна: $n \\sim 10^{29}$ в м³.</p>
<p style="margin-top:10px"><b>Кристаллическая решётка</b> металла состоит из положительных ионов в узлах. Между ними движется «электронный газ» — почти свободные электроны.</p>
<p style="margin-top:10px"><b>Без электрического поля</b>: электроны движутся <b>хаотически</b> со скоростями $\\sim 10^5 - 10^6$ м/с. Средняя скорость направленного движения равна нулю — тока нет.</p>
<p style="margin-top:10px"><b>В электрическом поле $\\vec{E}$</b>: на хаотическое движение накладывается <b>дрейфовое</b> движение в сторону, противоположную $\\vec{E}$ (так как заряд электрона отрицательный). Средняя дрейфовая скорость очень мала: $v_{др} \\sim 10^{-3} - 10^{-5}$ м/с.</p>
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px"><b>Парадокс.</b> Дрейф электронов очень медленный, но ток в проводнике включается «мгновенно» — электрическое поле в проводнике устанавливается со скоростью света $c \\approx 3\\cdot 10^8$ м/с.</p>
`);
/* THEORY 2 — Сопротивление и температура */
html += makeCard('rule', "Сопротивление и зависимость от температуры", "§34", `
<p><b>Сопротивление</b> однородного проводника:</p>
<p style="text-align:center;margin:8px 0">$$R = \\rho\\,\\dfrac{L}{S}$$</p>
<ul style="margin:6px 0 6px 22px">
<li>$\\rho$ — удельное сопротивление (Ом·м);</li>
<li>$L$ — длина проводника (м);</li>
<li>$S$ — площадь поперечного сечения (м²).</li>
</ul>
<p style="margin-top:10px"><b>Зависимость от температуры</b> для металлов — линейная:</p>
<p style="text-align:center;margin:8px 0">$$\\rho(t) = \\rho_0\\,(1 + \\alpha t)$$</p>
<p>где $\\rho_0$ — удельное сопротивление при $$C, $t$ — температура в $°$C, $\\alpha$ — <b>температурный коэффициент сопротивления</b> (К$^{-1}$).</p>
<p style="margin-top:10px"><b>Эталонные значения $\\alpha$</b>:</p>
<ul style="margin:6px 0 6px 22px">
<li>Медь: $\\alpha \\approx 0{,}0043$ К$^{-1}$;</li>
<li>Алюминий: $\\alpha \\approx 0{,}0042$ К$^{-1}$;</li>
<li>Железо: $\\alpha \\approx 0{,}0066$ К$^{-1}$;</li>
<li>Платина: $\\alpha \\approx 0{,}0039$ К$^{-1}$ — используется в термометрах сопротивления.</li>
</ul>
<p style="margin-top:10px">С нагревом сопротивление металлов <b>увеличивается</b>: атомы решётки сильнее колеблются и чаще «мешают» электронам дрейфовать.</p>
`);
/* THEORY 3 — Сверхпроводимость */
html += makeCard('example', "Сверхпроводимость", "§34", `
<p><b>Сверхпроводимость</b> — явление полного исчезновения сопротивления у некоторых металлов при температурах ниже <b>критической</b> $T_c$.</p>
<p style="margin-top:10px">Открыта в 1911 году для ртути ($T_c = 4{,}2$ К — близко к абсолютному нулю).</p>
<p style="margin-top:10px"><b>Критические температуры</b>:</p>
<ul style="margin:6px 0 6px 22px">
<li>Ртуть: $T_c = 4{,}2$ К;</li>
<li>Свинец: $T_c = 7{,}2$ К;</li>
<li>Ниобий: $T_c = 9{,}2$ К;</li>
<li>Высокотемпературные сверхпроводники (керамика YBa$_2$Cu$_3$O$_7$): $T_c \\approx 95$ К — выше точки кипения жидкого азота (77 К). Открыты в 1986, революция, Нобелевская премия.</li>
</ul>
<p style="margin-top:10px"><b>В сверхпроводнике ток может циркулировать бесконечно долго без потерь.</b></p>
<p style="margin-top:10px"><b>Применение:</b></p>
<ul style="margin:6px 0 6px 22px">
<li><b>Сверхмощные магниты</b> — МРТ, ускорители (в Большом адронном коллайдере все магниты сверхпроводящие);</li>
<li><b>Маглев-поезда</b> — левитация на сверхпроводящих магнитах;</li>
<li><b>Беспотерьная передача электроэнергии</b> — экспериментально для коротких линий.</li>
</ul>
`);
/* INTERACTIVE 1 — Симуляция дрейфа электронов */
html += `<div class="wg" id="p34-iv1">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 1</span><div class="wg-title">Симуляция дрейфа электронов</div></div>
<div class="wg-help">При $U = 0$ — электроны движутся <b>хаотически</b>, тока нет. При $U > 0$ — на хаос накладывается медленный <b>дрейф</b> в сторону, противоположную $\\vec{E}$. Дрейф $\\Rightarrow$ ток.</div>
<div class="sliders">
<label>Напряжение $U$ (В): <b id="p34-iv1-UL">0.0</b><input type="range" id="p34-iv1-U" min="0" max="10" value="0" step="0.5"></label>
</div>
<div style="background:var(--card);border:1px solid var(--border);border-radius:9px;padding:8px;margin-top:8px">
<svg id="p34-iv1-svg" viewBox="0 0 380 240" width="100%" style="height:auto"></svg>
</div>
<div id="p34-iv1-out" style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.95rem;line-height:1.7;text-align:center"></div>
</div>`;
/* INTERACTIVE 2 — Температурная зависимость */
html += `<div class="wg" id="p34-iv2">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 2</span><div class="wg-title">Сопротивление: график $R(t)$</div></div>
<div class="wg-help">Для металлов: $R(t) = R_0(1 + \\alpha t)$ — прямая линия. Сверхпроводники имеют <b>скачок</b> до $R = 0$ при $T < T_c$.</div>
<div class="sliders">
<label>Материал: <b id="p34-iv2-ML">Медь</b><input type="range" id="p34-iv2-M" min="0" max="3" value="0" step="1"></label>
<label>$R_0$ при $$C (Ом): <b id="p34-iv2-RL">1.0</b><input type="range" id="p34-iv2-R" min="0.1" max="10" value="1" step="0.1"></label>
</div>
<div style="background:var(--card);border:1px solid var(--border);border-radius:9px;padding:8px;margin-top:8px">
<svg id="p34-iv2-svg" viewBox="0 0 380 260" width="100%" style="height:auto"></svg>
</div>
<div id="p34-iv2-out" style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.95rem;line-height:1.7;text-align:center"></div>
</div>`;
/* INTERACTIVE 3 — Носители заряда в разных средах */
html += `<div class="wg" id="p34-iv3">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 3</span><div class="wg-title">Кто переносит ток?</div></div>
<div class="wg-help">В каждой среде свои носители заряда — определи правильно.</div>
<div class="score-display"><span>Задача <b id="p34-iv3-i">1</b> / 6</span><span>Очки: <b id="p34-iv3-s">0</b> / 6</span></div>
<div id="p34-iv3-q" style="padding:14px;background:var(--sec-acc-soft);border-radius:10px;font-size:1.02rem;margin-bottom:10px;text-align:center;min-height:54px"></div>
<div id="p34-iv3-opts" style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px"></div>
<div class="feedback" id="p34-iv3-fb"></div>
<div class="actions"><button class="btn" id="p34-iv3-restart">Начать заново</button></div>
</div>`;
/* INTERACTIVE 4 — Тренажёр сопротивления */
html += `<div class="wg" id="p34-iv4">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 4</span><div class="wg-title">Тренажёр: сопротивление и сверхпроводимость</div></div>
<div class="wg-help">5 задач. Допуск $\\pm 5\\%$. Формулы: $R = \\rho L/S$, $R(t) = R_0(1+\\alpha t)$.</div>
<div class="score-display"><span>Задача <b id="p34-iv4-i">1</b> / 5</span><span>Очки: <b id="p34-iv4-s">0</b> / 5</span></div>
<div id="p34-iv4-q" style="padding:14px;background:var(--sec-acc-soft);border-radius:10px;font-size:1.02rem;margin-bottom:10px;text-align:center;min-height:54px"></div>
<div id="p34-iv4-form" style="display:flex;gap:8px;justify-content:center;margin-bottom:8px;flex-wrap:wrap">
<input type="number" id="p34-iv4-inp" step="any" style="padding:8px 10px;border:1px solid var(--border);border-radius:6px;width:140px;font-size:1rem">
<button class="btn primary" id="p34-iv4-go">Проверить</button>
</div>
<div class="feedback" id="p34-iv4-fb"></div>
<div class="actions"><button class="btn" id="p34-iv4-restart">Начать заново</button></div>
</div>`;
html += secNav(null, 'p35');
html += readButton('p34');
box.innerHTML = html;
renderMath(box);
/* IV1 — Дрейф электронов */
(function(){
const svg = document.getElementById('p34-iv1-svg');
const out = document.getElementById('p34-iv1-out');
const UI = document.getElementById('p34-iv1-U'), UL = document.getElementById('p34-iv1-UL');
const W = 380, H = 240;
// Решётка ионов: сетка
const ions = [];
for(let r=0; r<4; r++){
for(let c=0; c<7; c++){
ions.push({x: 40 + c*48, y: 50 + r*48});
}
}
// Электроны
const N = 22;
const els = [];
for(let k=0; k<N; k++){
els.push({
x: 30 + Math.random()*320,
y: 30 + Math.random()*180,
vx: (Math.random()-0.5)*1.8,
vy: (Math.random()-0.5)*1.8
});
}
let rafId = null;
let configsSeen = new Set(), _done = false;
function step(){
const U = +UI.value;
const drift = U * 0.18; // дрейфовая скорость "пиксели/кадр"
// обновим электроны: хаос + дрейф вправо (если U>0)
els.forEach(e => {
// случайные толчки от ионов
e.vx += (Math.random()-0.5)*0.45;
e.vy += (Math.random()-0.5)*0.45;
// ограничение
const sp = Math.hypot(e.vx, e.vy);
if(sp > 2.4){ e.vx *= 2.4/sp; e.vy *= 2.4/sp; }
e.x += e.vx + drift;
e.y += e.vy;
// отскок от границ
if(e.x < 16){ e.x = 364; }
if(e.x > 364){ e.x = 16; }
if(e.y < 16){ e.y = 16; e.vy = Math.abs(e.vy); }
if(e.y > 220){ e.y = 220; e.vy = -Math.abs(e.vy); }
});
draw();
rafId = requestAnimationFrame(step);
}
function draw(){
const U = +UI.value;
UL.textContent = U.toFixed(1);
let g = '';
g += '<rect x="0" y="0" width="'+W+'" height="'+H+'" fill="#fafafa"/>';
// рамка проводника
g += '<rect x="8" y="14" width="364" height="212" fill="none" stroke="#cbd5e1" stroke-width="1.4" rx="6"/>';
// подпись E
if(U > 0){
g += PHYS.drawArrow(40, 8, 90, 8, '#dc2626', 2, 8);
g += '<text x="100" y="12" font-family="JetBrains Mono,monospace" font-size="12" font-weight="700" fill="#dc2626">E</text>';
}
// ионы (большие красные +)
ions.forEach(io => {
g += '<circle cx="'+io.x+'" cy="'+io.y+'" r="7" fill="#fecaca" stroke="#dc2626" stroke-width="1.4"/>';
g += '<text x="'+io.x+'" y="'+(io.y+3.5)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="11" font-weight="800" fill="#7f1d1d">+</text>';
});
// электроны
els.forEach(e => {
g += '<circle cx="'+e.x.toFixed(1)+'" cy="'+e.y.toFixed(1)+'" r="3.2" fill="#0891b2" stroke="#fff" stroke-width="0.8"/>';
// вектор скорости
if(U > 0){
const sx = e.x, sy = e.y;
const ex = sx + 6, ey = sy;
g += '<line x1="'+sx.toFixed(1)+'" y1="'+sy.toFixed(1)+'" x2="'+ex.toFixed(1)+'" y2="'+ey.toFixed(1)+'" stroke="#0891b2" stroke-width="1" opacity=".7"/>';
}
});
svg.innerHTML = g;
const vDrift = U > 0 ? (U * 0.0002).toFixed(4) : '0';
out.innerHTML = U === 0
? 'При $U = 0$ электроны движутся <b>хаотически</b> — тока нет.'
: '$U = '+U.toFixed(1)+'$ В $\\Rightarrow$ дрейф электронов вправо, $v_{др} \\sim '+vDrift+'$ м/с (примерная оценка).';
renderMath(out);
}
UI.addEventListener('input', ()=>{
configsSeen.add(UI.value);
if(!_done && configsSeen.size >= 4){ _done = true; addXp(15, 'p34-iv1'); bumpProgress('p34', 20); }
});
draw();
rafId = requestAnimationFrame(step);
})();
/* IV2 — R(t) график */
(function(){
const svg = document.getElementById('p34-iv2-svg');
const out = document.getElementById('p34-iv2-out');
const MI = document.getElementById('p34-iv2-M'), ML = document.getElementById('p34-iv2-ML');
const RI = document.getElementById('p34-iv2-R'), RL = document.getElementById('p34-iv2-RL');
const MATS = [
{ name:'Медь', alpha:0.0043, color:'#b45309', sc:false },
{ name:'Алюминий', alpha:0.0042, color:'#64748b', sc:false },
{ name:'Железо', alpha:0.0066, color:'#374151', sc:false },
{ name:'Свинец (сверхпр. при $T<7{,}2$ К)', alpha:0.0042, color:'#7c3aed', sc:true, Tc:7.2 }
];
let switched = new Set(), _done = false;
function draw(){
const m = MATS[Math.min(3, Math.max(0, +MI.value))];
const R0 = +RI.value;
ML.innerHTML = m.name;
RL.textContent = R0.toFixed(1);
renderMath(MI.parentNode);
// Оси: t от -50 до 500 °C; R от 0 до примерно R0*(1+alpha*500)
const Rmax = R0 * (1 + m.alpha * 500) * 1.1;
const Wd = 380, Hd = 260, pad = 38;
const tmin = -50, tmax = 500;
const ux = (Wd - 2*pad) / (tmax - tmin);
const uy = (Hd - 2*pad) / (Rmax - 0);
const toX = t => pad + (t - tmin) * ux;
const toY = R => Hd - pad - R * uy;
let g = '';
g += '<rect x="0" y="0" width="'+Wd+'" height="'+Hd+'" fill="#fafafa"/>';
// сетка
g += '<g stroke="#e5e7eb" stroke-width="1">';
for(let t=0; t<=500; t+=100){
const x = toX(t);
g += '<line x1="'+x+'" y1="'+pad+'" x2="'+x+'" y2="'+(Hd-pad)+'"/>';
}
g += '</g>';
// оси
g += '<line x1="'+pad+'" y1="'+toY(0)+'" x2="'+(Wd-pad)+'" y2="'+toY(0)+'" stroke="#0f172a" stroke-width="1.4"/>';
g += '<line x1="'+toX(0)+'" y1="'+pad+'" x2="'+toX(0)+'" y2="'+(Hd-pad)+'" stroke="#0f172a" stroke-width="1.4"/>';
g += '<text x="'+(Wd-pad+2)+'" y="'+(toY(0)-4)+'" font-size="11" fill="#0f172a">t, °C</text>';
g += '<text x="'+(toX(0)+4)+'" y="'+(pad-2)+'" font-size="11" fill="#0f172a">R, Ом</text>';
// tick labels
g += '<g font-size="10" fill="#64748b">';
for(let t=0; t<=500; t+=100){
g += '<text x="'+(toX(t)-3)+'" y="'+(toY(0)+12)+'">'+t+'</text>';
}
g += '<text x="'+(toX(0)+4)+'" y="'+(toY(R0)+3)+'">'+R0.toFixed(1)+'</text>';
g += '</g>';
// Линия R(t)
let path = '';
for(let i=0; i<=80; i++){
const t = tmin + (tmax - tmin)*i/80;
const Rv = R0 * (1 + m.alpha * t);
path += (i===0 ? 'M' : 'L') + toX(t).toFixed(1) + ',' + toY(Math.max(0,Rv)).toFixed(1) + ' ';
}
g += '<path d="'+path+'" stroke="'+m.color+'" stroke-width="2.4" fill="none"/>';
// Если сверхпроводник — вертикальный скачок до 0 при T=Tc
if(m.sc){
// Tc в °C
const tcC = m.Tc - 273.15;
// отметим линию
const xTc = toX(tcC);
if(xTc > pad && xTc < Wd - pad){
g += '<line x1="'+xTc+'" y1="'+toY(0)+'" x2="'+xTc+'" y2="'+toY(R0)+'" stroke="#dc2626" stroke-width="2.2" stroke-dasharray="4 3"/>';
g += '<text x="'+(xTc+4)+'" y="'+toY(R0*0.5)+'" font-size="10" fill="#dc2626">T_c</text>';
}
g += '<text x="'+(Wd/2)+'" y="'+(Hd-8)+'" text-anchor="middle" font-size="10" fill="#7c3aed">Слева от $T_c$ — сверхпроводимость: $R = 0$</text>';
}
// Точка R при t=100
const t100 = 100;
const R100 = R0 * (1 + m.alpha * t100);
g += '<circle cx="'+toX(t100)+'" cy="'+toY(R100)+'" r="4.5" fill="'+m.color+'" stroke="#fff" stroke-width="2"/>';
g += '<text x="'+(toX(t100)+8)+'" y="'+(toY(R100)-6)+'" font-family="JetBrains Mono,monospace" font-size="10" fill="'+m.color+'">R(100°C) = '+R100.toFixed(2)+'</text>';
svg.innerHTML = g;
out.innerHTML = '$\\alpha = '+m.alpha.toFixed(4)+'$ К$^{-1}$ &nbsp; $R(100°C) = '+R0.toFixed(2)+'\\cdot(1+'+m.alpha.toFixed(4)+'\\cdot 100) = '+R100.toFixed(3)+'$ Ом';
renderMath(out);
}
MI.addEventListener('input', ()=>{
switched.add(MI.value);
draw();
if(!_done && switched.size >= 3){ _done = true; addXp(15, 'p34-iv2'); bumpProgress('p34', 20); }
});
RI.addEventListener('input', draw);
draw();
})();
/* IV3 — Носители заряда */
(function(){
const OPTS = ['Электроны', 'Ионы', 'Электроны + ионы'];
const Q = [
{ q:'В <b>металлах</b> ток переносят…', ans:0, why:'Свободные электроны проводимости (~$10^{29}$ в м³). Ионы решётки неподвижны.' },
{ q:'В <b>электролитах</b> (раствор соли) ток переносят…', ans:1, why:'Положительные катионы и отрицательные анионы движутся к электродам.' },
{ q:'В <b>газах при электрическом разряде</b> ток переносят…', ans:2, why:'Электроны (ионизированные при разряде) и положительные ионы.' },
{ q:'В <b>вакуумной электронной лампе</b> ток переносят…', ans:0, why:'Только электроны, испускаемые горячим катодом (термоэлектронная эмиссия).' },
{ q:'В <b>сверхпроводнике</b> (металл при $T<T_c$) ток переносят…', ans:0, why:'Электроны, но <b>без сопротивления</b> — куперовские пары не рассеиваются на решётке.' },
{ q:'В <b>полупроводнике</b> ток переносят…', ans:2, why:'Электроны проводимости и «дырки» (положительные носители) — оба типа.' }
];
let i = 0, score = 0;
const qEl = document.getElementById('p34-iv3-q');
const oEl = document.getElementById('p34-iv3-opts');
const fb = document.getElementById('p34-iv3-fb');
const iEl = document.getElementById('p34-iv3-i');
const sEl = document.getElementById('p34-iv3-s');
function show(){
if(i >= Q.length){
qEl.innerHTML = '<b>Готово!</b> Результат: ' + score + ' / ' + Q.length;
oEl.innerHTML = '';
if(score === Q.length){ addXp(15, 'p34-iv3'); bumpProgress('p34', 25); }
else if(score >= 4){ addXp(8, 'p34-iv3'); bumpProgress('p34', 15); }
return;
}
iEl.textContent = (i+1);
sEl.textContent = score;
qEl.innerHTML = Q[i].q;
oEl.innerHTML = OPTS.map((t,k) => '<button class="btn primary" data-v="'+k+'">'+t+'</button>').join('');
fb.style.display = 'none';
renderMath(qEl);
oEl.querySelectorAll('button').forEach(b => {
b.addEventListener('click', () => {
const v = +b.dataset.v;
if(v === Q[i].ans){ score++; feedback(fb, true, '&#10003; Верно! '+Q[i].why+' Дальше ▶'); }
else feedback(fb, false, '&#10007; Верно: '+OPTS[Q[i].ans]+'. '+Q[i].why+' Дальше ▶');
sEl.textContent = score;
oEl.querySelectorAll('button').forEach(x => x.disabled = true);
i++;
setTimeout(show, 1900);
});
});
}
document.getElementById('p34-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); });
show();
})();
/* IV4 — Тренажёр */
(function(){
const Q = [
{ q:'Медь: $\\rho = 1{,}7\\cdot 10^{-8}$ Ом·м. Провод $L = 10$ м, сечение $S = 1$ мм² $= 10^{-6}$ м². Найди $R$ (Ом).', ans:0.17, tol:0.01, why:'$R = \\rho L/S = 1{,}7\\cdot 10^{-8}\\cdot 10 / 10^{-6} = 0{,}17$ Ом.' },
{ q:'Медь: $R_0 = 1$ Ом при $0°$C, $\\alpha = 0{,}0043$ К$^{-1}$. Найди $R$ при $100°$C (Ом).', ans:1.43, tol:0.05, why:'$R = R_0(1 + \\alpha t) = 1\\cdot(1 + 0{,}0043\\cdot 100) = 1{,}43$ Ом.' },
{ q:'Сверхпроводимость — это явление, когда $R$… (1=максимально, 2=равно нулю, 3=пропорц. $T$). Введи номер.', ans:2, tol:0.1, why:'При $T<T_c$ сопротивление сверхпроводника <b>равно нулю</b>.' },
{ q:'Первая критическая температура сверхпроводимости ртути (в кельвинах). Введи число.', ans:4.2, tol:0.3, why:'Камерлинг-Оннес, 1911: $T_c({Hg}) = 4{,}2$ К.' },
{ q:'Алюминий ($\\alpha = 0{,}0042$ К$^{-1}$). $R_0 = 5$ Ом при $0°$C. Найди $R$ при $50°$C (Ом).', ans:6.05, tol:0.2, why:'$R = 5(1 + 0{,}0042\\cdot 50) = 5\\cdot 1{,}21 = 6{,}05$ Ом.' }
];
let i = 0, score = 0;
const qEl = document.getElementById('p34-iv4-q');
const fb = document.getElementById('p34-iv4-fb');
const iEl = document.getElementById('p34-iv4-i');
const sEl = document.getElementById('p34-iv4-s');
const inp = document.getElementById('p34-iv4-inp');
const bGo = document.getElementById('p34-iv4-go');
function show(){
if(i >= Q.length){
qEl.innerHTML = '<b>Готово!</b> Результат: ' + score + ' / ' + Q.length;
inp.disabled = true; bGo.disabled = true;
if(score === Q.length){ addXp(15, 'p34-iv4'); bumpProgress('p34', 25); }
else if(score >= 3){ addXp(8, 'p34-iv4'); bumpProgress('p34', 15); }
return;
}
iEl.textContent = (i+1);
sEl.textContent = score;
qEl.innerHTML = Q[i].q;
fb.style.display = 'none';
inp.value = ''; inp.disabled = false; bGo.disabled = false; inp.focus();
renderMath(qEl);
}
function check(){
if(inp.disabled) return;
const v = parseFloat(inp.value.replace(',','.'));
if(!isFinite(v)){ feedback(fb, false, 'Введи число.'); return; }
const tol = Math.max(Q[i].tol, Math.abs(Q[i].ans)*0.05);
const ok = Math.abs(v - Q[i].ans) <= tol;
if(ok){ score++; feedback(fb, true, '&#10003; Верно! '+Q[i].why+' Дальше ▶'); }
else feedback(fb, false, '&#10007; Верно: '+Q[i].ans+'. '+Q[i].why+' Дальше ▶');
sEl.textContent = score;
inp.disabled = true; bGo.disabled = true;
i++;
setTimeout(show, 1900);
}
bGo.addEventListener('click', check);
inp.addEventListener('keydown', e => { if(e.key==='Enter') check(); });
document.getElementById('p34-iv4-restart').addEventListener('click', () => { i = 0; score = 0; inp.disabled=false; bGo.disabled=false; show(); });
show();
})();
wireReadBtn('p34');
}
function build_p35(){
const box = document.getElementById('p35-body');
let html = '';
html += makeCard('theory', "Ток в электролитах", "§35", `
<p><b>Ток в электролитах</b> — этот параграф в разработке (Phase 1+).</p>
<p>Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «алгебры 11» — таблицы, симуляции, ползунки, drag-and-drop и автопроверяемые тренажёры.</p>
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.92rem">
<b>Phase 0:</b> создан скелет учебника. <b>Phase 6+:</b> наполнение этого § содержанием по учебнику «Физика 10» (Беларусь, 2019).
</p>
/* THEORY 1 — Электролиты и ионная проводимость */
html += makeCard('theory', "Электролиты и ионная проводимость", "§35", `
<p><b>Электролиты</b> — вещества, проводящие электрический ток в растворе или расплаве за счёт движения ионов:</p>
<ul style="margin:6px 0 6px 22px">
<li>Растворы солей, кислот, щелочей в воде;</li>
<li>Расплавы солей.</li>
</ul>
<p style="margin-top:10px">В электролите присутствуют <b>свободные ионы</b> — продукт диссоциации молекул электролита:</p>
<ul style="margin:6px 0 6px 22px">
<li><b>Катионы</b> ($+$): Na$^+$, K$^+$, Cu$^{2+}$, Fe$^{2+}$, H$^+$ и др.;</li>
<li><b>Анионы</b> ($-$): Cl$^-$, SO$_4^{2-}$, NO$_3^-$, OH$^-$ и др.</li>
</ul>
<p style="margin-top:10px"><b>В электрическом поле</b> ионы движутся к электродам:</p>
<ul style="margin:6px 0 6px 22px">
<li>Катионы $(+)$ — к <b>катоду</b> $(-$ электрод);</li>
<li>Анионы $(-)$ — к <b>аноду</b> $(+$ электрод).</li>
</ul>
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px"><b>Главное отличие от металлов:</b> в электролите переносится не только заряд, но и <b>вещество</b> — на электродах идут химические реакции. Это явление называется <b>электролизом</b>.</p>
`);
/* THEORY 2 — Законы Фарадея */
html += makeCard('rule', "Законы Фарадея для электролиза", "§35", `
<p><b>Первый закон Фарадея</b>: масса вещества, выделившегося на электроде, прямо пропорциональна заряду, прошедшему через электролит:</p>
<p style="text-align:center;margin:8px 0">$$m = k\\,I\\,t = k\\,q$$</p>
<ul style="margin:6px 0 6px 22px">
<li>$m$ — масса вещества (кг);</li>
<li>$I$ — сила тока (А);</li>
<li>$t$ — время (с);</li>
<li>$k$ — <b>электрохимический эквивалент</b> вещества (кг/Кл).</li>
</ul>
<p style="margin-top:10px"><b>Второй закон Фарадея</b>: электрохимический эквивалент пропорционален молярной массе и обратно пропорционален валентности:</p>
<p style="text-align:center;margin:8px 0">$$k = \\dfrac{M}{F\\,n}$$</p>
<ul style="margin:6px 0 6px 22px">
<li>$M$ — молярная масса (кг/моль);</li>
<li>$n$ — валентность иона;</li>
<li>$F = N_A\\,e \\approx 96\\,500$ Кл/моль — <b>постоянная Фарадея</b>.</li>
</ul>
<p style="margin-top:10px"><b>Объединённый закон Фарадея</b>:</p>
<p style="text-align:center;margin:8px 0">$$m = \\dfrac{M}{F\\,n}\\,I\\,t$$</p>
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px"><b>Физический смысл $F$:</b> это заряд $\\sim 1$ моль однозарядных ионов, $F = N_A\\,e \\approx 6{,}022\\cdot 10^{23}\\cdot 1{,}6\\cdot 10^{-19} \\approx 96\\,500$ Кл.</p>
`);
/* THEORY 3 — Применение электролиза */
html += makeCard('example', "Применение электролиза", "§35", `
<p><b>Промышленные применения</b>:</p>
<ul style="margin:6px 0 6px 22px">
<li><b>Электролиз алюминия</b> — основной способ его получения из боксита. Огромные ванны рядом с электростанциями.</li>
<li><b>Электрометаллургия меди</b>: получение чистой меди электролизом раствора CuSO$_4$.</li>
<li><b>Производство хлора и каустической соды</b> — электролиз раствора NaCl.</li>
<li><b>Гальванопластика</b>: точные металлические копии скульптур, форм для печати — осаждение металла на форму.</li>
<li><b>Гальваностегия</b>: декоративные и защитные покрытия — хромирование, золочение, никелирование.</li>
<li><b>Зарядка аккумуляторов</b> — процесс, обратный разрядке (тоже электролиз).</li>
</ul>
<p style="margin-top:10px"><b>Пример расчёта.</b> Сколько меди ($M = 64$ г/моль, $n = 2$) выделится на катоде при $I = 5$ А за $t = 1$ ч?</p>
<p style="text-align:center;margin:8px 0">$m = \\dfrac{M I t}{F n} = \\dfrac{0{,}064 \\cdot 5 \\cdot 3600}{96\\,500 \\cdot 2} \\approx 5{,}97$ г</p>
<p style="margin-top:10px"><b>Серебро</b> $(M = 108$ г/моль, $n = 1)$ при тех же условиях:</p>
<p style="text-align:center;margin:8px 0">$m = \\dfrac{0{,}108 \\cdot 5 \\cdot 3600}{96\\,500 \\cdot 1} \\approx 20{,}15$ г — почти в 4 раза больше!</p>
`);
/* INTERACTIVE 1 — Симуляция электролиза */
html += `<div class="wg" id="p35-iv1">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 1</span><div class="wg-title">Симуляция электролиза</div></div>
<div class="wg-help">Положительные катионы (красные) движутся к <b>катоду</b> (слева, $-$). Отрицательные анионы (синие) — к <b>аноду</b> (справа, $+$). Скорость пропорциональна току $I$.</div>
<div class="sliders">
<label>Сила тока $I$ (А): <b id="p35-iv1-IL">0.0</b><input type="range" id="p35-iv1-I" min="0" max="10" value="0" step="0.5"></label>
</div>
<div style="background:var(--card);border:1px solid var(--border);border-radius:9px;padding:8px;margin-top:8px">
<svg id="p35-iv1-svg" viewBox="0 0 380 280" width="100%" style="height:auto"></svg>
</div>
<div id="p35-iv1-out" style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.95rem;line-height:1.7;text-align:center"></div>
</div>`;
/* INTERACTIVE 2 — Калькулятор электролиза */
html += `<div class="wg" id="p35-iv2">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 2</span><div class="wg-title">Калькулятор массы вещества при электролизе</div></div>
<div class="wg-help">Формула: $m = \\dfrac{M\\,I\\,t}{F\\,n}$, $F = 96\\,500$ Кл/моль.</div>
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;margin-bottom:10px">
<label style="display:flex;flex-direction:column;gap:4px;font-size:.92rem">Вещество:
<select id="p35-iv2-sub" style="padding:7px;border:1px solid var(--border);border-radius:6px">
<option value="0">Медь (Cu): M=64, n=2</option>
<option value="1">Серебро (Ag): M=108, n=1</option>
<option value="2">Алюминий (Al): M=27, n=3</option>
<option value="3">Железо (Fe): M=56, n=2</option>
<option value="4">Водород (H): M=1, n=1</option>
</select>
</label>
<label style="display:flex;flex-direction:column;gap:4px;font-size:.92rem">$I$ (А):<input type="number" id="p35-iv2-I" value="5" step="0.1" min="0" style="padding:7px;border:1px solid var(--border);border-radius:6px"></label>
<label style="display:flex;flex-direction:column;gap:4px;font-size:.92rem">$t$ (с):<input type="number" id="p35-iv2-t" value="3600" step="any" min="0" style="padding:7px;border:1px solid var(--border);border-radius:6px"></label>
</div>
<div class="actions"><button class="btn primary" id="p35-iv2-calc">Вычислить массу $m$</button></div>
<div id="p35-iv2-out" style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.98rem;line-height:1.8;text-align:center;min-height:40px"></div>
</div>`;
/* INTERACTIVE 3 — Куда движется ион? */
html += `<div class="wg" id="p35-iv3">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 3</span><div class="wg-title">Куда движется ион?</div></div>
<div class="wg-help">Катионы $(+)$ → к катоду $(-)$. Анионы $(-)$ → к аноду $(+)$.</div>
<div class="score-display"><span>Задача <b id="p35-iv3-i">1</b> / 6</span><span>Очки: <b id="p35-iv3-s">0</b> / 6</span></div>
<div id="p35-iv3-q" style="padding:14px;background:var(--sec-acc-soft);border-radius:10px;font-size:1.05rem;margin-bottom:10px;text-align:center;min-height:54px"></div>
<div id="p35-iv3-opts" style="display:grid;grid-template-columns:1fr 1fr;gap:8px"></div>
<div class="feedback" id="p35-iv3-fb"></div>
<div class="actions"><button class="btn" id="p35-iv3-restart">Начать заново</button></div>
</div>`;
/* INTERACTIVE 4 — Тренажёр электролиза */
html += `<div class="wg" id="p35-iv4">
<div class="wg-header"><span class="wg-badge">ИНТЕРАКТИВ 4</span><div class="wg-title">Тренажёр: электролиз</div></div>
<div class="wg-help">5 задач. $F = 96\\,500$ Кл/моль. Допуск $\\pm 5\\%$.</div>
<div class="score-display"><span>Задача <b id="p35-iv4-i">1</b> / 5</span><span>Очки: <b id="p35-iv4-s">0</b> / 5</span></div>
<div id="p35-iv4-q" style="padding:14px;background:var(--sec-acc-soft);border-radius:10px;font-size:1.02rem;margin-bottom:10px;text-align:center;min-height:54px"></div>
<div id="p35-iv4-form" style="display:flex;gap:8px;justify-content:center;margin-bottom:8px;flex-wrap:wrap">
<input type="number" id="p35-iv4-inp" step="any" style="padding:8px 10px;border:1px solid var(--border);border-radius:6px;width:140px;font-size:1rem">
<button class="btn primary" id="p35-iv4-go">Проверить</button>
</div>
<div class="feedback" id="p35-iv4-fb"></div>
<div class="actions"><button class="btn" id="p35-iv4-restart">Начать заново</button></div>
</div>`;
html += secNav('p34', 'p36');
html += readButton('p35');
box.innerHTML = html;
renderMath(box);
/* IV1 — Симуляция электролиза */
(function(){
const svg = document.getElementById('p35-iv1-svg');
const out = document.getElementById('p35-iv1-out');
const II = document.getElementById('p35-iv1-I'), IL = document.getElementById('p35-iv1-IL');
const W = 380, H = 280;
// Ионы: красные катионы (+) и синие анионы (-)
const NCat = 12, NAn = 12;
const cats = [], ans = [];
for(let k=0; k<NCat; k++){
cats.push({ x: 80 + Math.random()*220, y: 80 + Math.random()*160, vy: (Math.random()-0.5)*1.0 });
}
for(let k=0; k<NAn; k++){
ans.push({ x: 80 + Math.random()*220, y: 80 + Math.random()*160, vy: (Math.random()-0.5)*1.0 });
}
let rafId = null;
let configs = new Set(), _done = false;
function step(){
const I = +II.value;
const v = I * 0.25;
cats.forEach(p => {
p.x -= v; // катионы влево (к катоду)
p.vy += (Math.random()-0.5)*0.4;
if(Math.abs(p.vy) > 1.4) p.vy *= 0.7;
p.y += p.vy;
if(p.x < 75){ p.x = 295; }
if(p.y < 80){ p.y = 80; p.vy = Math.abs(p.vy); }
if(p.y > 240){ p.y = 240; p.vy = -Math.abs(p.vy); }
});
ans.forEach(p => {
p.x += v; // анионы вправо (к аноду)
p.vy += (Math.random()-0.5)*0.4;
if(Math.abs(p.vy) > 1.4) p.vy *= 0.7;
p.y += p.vy;
if(p.x > 305){ p.x = 85; }
if(p.y < 80){ p.y = 80; p.vy = Math.abs(p.vy); }
if(p.y > 240){ p.y = 240; p.vy = -Math.abs(p.vy); }
});
draw();
rafId = requestAnimationFrame(step);
}
function draw(){
const I = +II.value;
IL.textContent = I.toFixed(1);
let g = '';
g += '<rect x="0" y="0" width="'+W+'" height="'+H+'" fill="#fafafa"/>';
// ванна с электролитом
g += '<rect x="60" y="65" width="260" height="195" rx="10" fill="#e0f2fe" stroke="#0891b2" stroke-width="2"/>';
g += '<text x="190" y="58" text-anchor="middle" font-family="Inter,sans-serif" font-size="11" font-weight="700" fill="#0f172a">Электролит (раствор)</text>';
// катод (слева, минус)
g += '<rect x="70" y="75" width="14" height="180" fill="#6b7280" stroke="#374151" stroke-width="1.4"/>';
g += '<text x="77" y="68" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="13" font-weight="800" fill="#0891b2">К ('+''+')</text>';
// анод (справа, плюс)
g += '<rect x="296" y="75" width="14" height="180" fill="#6b7280" stroke="#374151" stroke-width="1.4"/>';
g += '<text x="303" y="68" text-anchor="middle" font-family="JetBrains Mono,monospace" font-size="13" font-weight="800" fill="#dc2626">А (+)</text>';
// батарея внизу
g += '<text x="190" y="276" text-anchor="middle" font-family="Inter,sans-serif" font-size="10" fill="#64748b">Источник тока</text>';
g += PHYS.batteryEMF(190, 270, undefined, 'h');
// провода
g += PHYS.wire(77, 257, 77, 270);
g += PHYS.wire(77, 270, 175, 270);
g += PHYS.wire(205, 270, 303, 270);
g += PHYS.wire(303, 270, 303, 257);
// ионы — катионы (красные, +)
cats.forEach(p => {
g += '<circle cx="'+p.x.toFixed(1)+'" cy="'+p.y.toFixed(1)+'" r="6" fill="#fecaca" stroke="#dc2626" stroke-width="1.4"/>';
g += '<text x="'+p.x.toFixed(1)+'" y="'+(p.y+3).toFixed(1)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="10" font-weight="800" fill="#7f1d1d">+</text>';
});
// анионы (синие, -)
ans.forEach(p => {
g += '<circle cx="'+p.x.toFixed(1)+'" cy="'+p.y.toFixed(1)+'" r="6" fill="#dbeafe" stroke="#1d4ed8" stroke-width="1.4"/>';
g += '<text x="'+p.x.toFixed(1)+'" y="'+(p.y+3).toFixed(1)+'" text-anchor="middle" font-family="Inter,sans-serif" font-size="11" font-weight="800" fill="#1e3a8a">'+''+'</text>';
});
// стрелка направления для катионов и анионов
if(I > 0){
g += PHYS.drawArrow(200, 50, 130, 50, '#dc2626', 1.6, 7);
g += '<text x="200" y="48" font-family="Inter,sans-serif" font-size="10" fill="#dc2626">катионы</text>';
g += PHYS.drawArrow(180, 30, 250, 30, '#1d4ed8', 1.6, 7);
g += '<text x="120" y="33" font-family="Inter,sans-serif" font-size="10" fill="#1d4ed8">анионы</text>';
}
svg.innerHTML = g;
out.innerHTML = I === 0
? 'При $I = 0$ ионы движутся хаотически (тока нет).'
: '$I = '+I.toFixed(1)+'$ А — катионы дрейфуют к <b>катоду</b> ($-$), анионы к <b>аноду</b> ($+$).';
renderMath(out);
}
II.addEventListener('input', ()=>{
configs.add(II.value);
if(!_done && configs.size >= 4){ _done = true; addXp(15, 'p35-iv1'); bumpProgress('p35', 20); }
});
draw();
rafId = requestAnimationFrame(step);
})();
/* IV2 — Калькулятор */
(function(){
const out = document.getElementById('p35-iv2-out');
const sub = document.getElementById('p35-iv2-sub');
const iI = document.getElementById('p35-iv2-I');
const iT = document.getElementById('p35-iv2-t');
const bGo = document.getElementById('p35-iv2-calc');
const SUBS = [
{ name:'Cu (медь)', M:0.064, n:2 },
{ name:'Ag (серебро)', M:0.108, n:1 },
{ name:'Al (алюминий)', M:0.027, n:3 },
{ name:'Fe (железо)', M:0.056, n:2 },
{ name:'H (водород)', M:0.001, n:1 }
];
const F = 96500;
let count = 0, _done = false;
function calc(){
const s = SUBS[+sub.value];
const I = +iI.value, t = +iT.value;
if(![I,t].every(isFinite) || I < 0 || t < 0){
out.innerHTML = '<b style="color:#dc2626">Проверь ввод: $I \\ge 0$, $t \\ge 0$.</b>';
renderMath(out);
return;
}
const m_kg = (s.M * I * t) / (F * s.n);
const m_g = m_kg * 1000;
let html = '';
html += '<b>'+s.name+'</b>: $M = '+(s.M*1000)+'$ г/моль, $n = '+s.n+'$<br>';
html += '$m = \\dfrac{M\\,I\\,t}{F\\,n} = \\dfrac{'+s.M+'\\cdot '+I+'\\cdot '+t+'}{'+F+'\\cdot '+s.n+'}$<br>';
html += '$m \\approx $ <b>'+m_g.toFixed(3)+' г</b> ($'+m_kg.toExponential(3)+'$ кг)';
out.innerHTML = html;
renderMath(out);
count++;
if(!_done && count >= 3){ _done = true; addXp(10, 'p35-iv2'); bumpProgress('p35', 15); }
}
bGo.addEventListener('click', calc);
[iI, iT].forEach(x => x.addEventListener('keydown', e => { if(e.key==='Enter') calc(); }));
sub.addEventListener('change', calc);
})();
/* IV3 — Куда движется ион */
(function(){
const OPTS = ['К катоду ()', 'К аноду (+)'];
const Q = [
{ q:'Ион меди Cu$^{2+}$ движется…', ans:0, why:'Катион (+) → к катоду ($-$). На катоде восстанавливается до Cu.' },
{ q:'Ион SO$_4^{2-}$ движется…', ans:1, why:'Анион ($-$) → к аноду (+).' },
{ q:'Ион натрия Na$^+$ движется…', ans:0, why:'Катион → к катоду.' },
{ q:'Ион хлора Cl$^-$ движется…', ans:1, why:'Анион → к аноду. На аноде окисляется до Cl$_2$.' },
{ q:'Ион водорода H$^+$ движется…', ans:0, why:'Катион → к катоду. На катоде восстанавливается до H$_2$.' },
{ q:'Ион гидроксила OH$^-$ движется…',ans:1, why:'Анион → к аноду. На аноде окисляется (выделяется O$_2$).' }
];
let i = 0, score = 0;
const qEl = document.getElementById('p35-iv3-q');
const oEl = document.getElementById('p35-iv3-opts');
const fb = document.getElementById('p35-iv3-fb');
const iEl = document.getElementById('p35-iv3-i');
const sEl = document.getElementById('p35-iv3-s');
function show(){
if(i >= Q.length){
qEl.innerHTML = '<b>Готово!</b> Результат: ' + score + ' / ' + Q.length;
oEl.innerHTML = '';
if(score === Q.length){ addXp(15, 'p35-iv3'); bumpProgress('p35', 25); }
else if(score >= 4){ addXp(8, 'p35-iv3'); bumpProgress('p35', 15); }
return;
}
iEl.textContent = (i+1);
sEl.textContent = score;
qEl.innerHTML = Q[i].q;
oEl.innerHTML = OPTS.map((t,k) => '<button class="btn primary" data-v="'+k+'">'+t+'</button>').join('');
fb.style.display = 'none';
renderMath(qEl);
oEl.querySelectorAll('button').forEach(b => {
b.addEventListener('click', () => {
const v = +b.dataset.v;
if(v === Q[i].ans){ score++; feedback(fb, true, '&#10003; Верно! '+Q[i].why+' Дальше ▶'); }
else feedback(fb, false, '&#10007; Верно: '+OPTS[Q[i].ans]+'. '+Q[i].why+' Дальше ▶');
sEl.textContent = score;
oEl.querySelectorAll('button').forEach(x => x.disabled = true);
i++;
setTimeout(show, 1900);
});
});
}
document.getElementById('p35-iv3-restart').addEventListener('click', () => { i = 0; score = 0; show(); });
show();
})();
/* IV4 — Тренажёр */
(function(){
const Q = [
{ q:'$I = 2$ А, $t = 30$ мин $= 1800$ с. Медь (Cu, $M = 64$ г/моль, $n = 2$), $F = 96\\,500$ Кл/моль. Найди $m$ (в <b>граммах</b>).', ans:1.19, tol:0.06, why:'$m = MIt/(Fn) = 64\\cdot 2\\cdot 1800/(96\\,500\\cdot 2) \\approx 1{,}19$ г.' },
{ q:'$I = 5$ А, $t = 1$ ч $= 3600$ с. Медь ($M=64$, $n=2$). Найди $m$ (г).', ans:5.97, tol:0.3, why:'$m = 64\\cdot 5\\cdot 3600/(96\\,500\\cdot 2) \\approx 5{,}97$ г.' },
{ q:'Серебро ($M = 108$ г/моль, $n = 1$). $I = 1$ А, $t = 3600$ с. Найди $m$ (г).', ans:4.03, tol:0.2, why:'$m = 108\\cdot 1\\cdot 3600/(96\\,500\\cdot 1) \\approx 4{,}03$ г.' },
{ q:'К какому электроду движутся <b>катионы</b>? (1 = анод, 2 = катод). Введи номер.', ans:2, tol:0.1, why:'Катионы $(+)$ движутся к катоду $(-)$.' },
{ q:'Постоянная Фарадея $F$ в Кл/моль (округлённое значение). Введи число.', ans:96500, tol:500, why:'$F = N_A \\cdot e \\approx 96\\,500$ Кл/моль.' }
];
let i = 0, score = 0;
const qEl = document.getElementById('p35-iv4-q');
const fb = document.getElementById('p35-iv4-fb');
const iEl = document.getElementById('p35-iv4-i');
const sEl = document.getElementById('p35-iv4-s');
const inp = document.getElementById('p35-iv4-inp');
const bGo = document.getElementById('p35-iv4-go');
function show(){
if(i >= Q.length){
qEl.innerHTML = '<b>Готово!</b> Результат: ' + score + ' / ' + Q.length;
inp.disabled = true; bGo.disabled = true;
if(score === Q.length){ addXp(15, 'p35-iv4'); bumpProgress('p35', 25); }
else if(score >= 3){ addXp(8, 'p35-iv4'); bumpProgress('p35', 15); }
return;
}
iEl.textContent = (i+1);
sEl.textContent = score;
qEl.innerHTML = Q[i].q;
fb.style.display = 'none';
inp.value = ''; inp.disabled = false; bGo.disabled = false; inp.focus();
renderMath(qEl);
}
function check(){
if(inp.disabled) return;
const v = parseFloat(inp.value.replace(',','.'));
if(!isFinite(v)){ feedback(fb, false, 'Введи число.'); return; }
const tol = Math.max(Q[i].tol, Math.abs(Q[i].ans)*0.05);
const ok = Math.abs(v - Q[i].ans) <= tol;
if(ok){ score++; feedback(fb, true, '&#10003; Верно! '+Q[i].why+' Дальше ▶'); }
else feedback(fb, false, '&#10007; Верно: '+Q[i].ans+'. '+Q[i].why+' Дальше ▶');
sEl.textContent = score;
inp.disabled = true; bGo.disabled = true;
i++;
setTimeout(show, 1900);
}
bGo.addEventListener('click', check);
inp.addEventListener('keydown', e => { if(e.key==='Enter') check(); });
document.getElementById('p35-iv4-restart').addEventListener('click', () => { i = 0; score = 0; inp.disabled=false; bGo.disabled=false; show(); });
show();
})();
wireReadBtn('p35');
}