/
Codeboy1
/
lab6
Обзор
Документация
Войти
/
Codeboy1
/
lab6
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
1.html
510 строк
27 KB
Codeboy1
create: 1.html, 2.html, 3.html, 4.html, 5.html, 6.html, 7.html, 8.html, 9.html
01 апр 2026, 14:10
Верифицирован
01 апр 2026, 14:10
b887c38
Код
Авторство
О чём код?
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Комплекс заданий: математика, строки, массивы, матрицы, даты</title> <style> body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background: #f0f2f5; margin: 0; padding: 20px; color: #1a2634; } .container { max-width: 1300px; margin: 0 auto; background: white; border-radius: 28px; box-shadow: 0 12px 30px rgba(0,0,0,0.1); padding: 24px 28px; } h1 { font-size: 1.9rem; margin-top: 0; border-left: 6px solid #2c7da0; padding-left: 20px; color: #0b3b4f; } .grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); gap: 18px; margin-top: 20px; } .card { background: #ffffff; border-radius: 20px; box-shadow: 0 4px 12px rgba(0,0,0,0.05); padding: 18px 20px 22px; transition: transform 0.1s ease, box-shadow 0.2s; border: 1px solid #e2e8f0; } .card:hover { box-shadow: 0 12px 20px rgba(0,0,0,0.08); transform: translateY(-2px); } .card h3 { margin-top: 0; margin-bottom: 12px; font-weight: 600; font-size: 1.3rem; color: #1e4a6b; border-bottom: 2px dashed #cbd5e1; padding-bottom: 8px; } .card p { font-size: 0.9rem; color: #2d3e50; margin: 12px 0; line-height: 1.4; } button { background: #2c7da0; border: none; color: white; font-weight: 600; padding: 8px 18px; border-radius: 40px; cursor: pointer; font-size: 0.85rem; transition: background 0.2s, transform 0.05s; margin-top: 8px; box-shadow: 0 1px 2px rgba(0,0,0,0.05); } button:hover { background: #1f5e7a; } button:active { transform: scale(0.97); } .badge { font-size: 0.7rem; background: #eef2ff; display: inline-block; padding: 2px 8px; border-radius: 20px; color: #1f5e7a; margin-bottom: 8px; } footer { margin-top: 30px; text-align: center; font-size: 0.8rem; color: #5c6f87; border-top: 1px solid #e2edf2; padding-top: 20px; } @media (max-width: 700px) { .container { padding: 16px; } .card { padding: 16px; } } </style> </head> <body> <div class="container"> <h1>📚 Интерактивные скрипты (prompt / alert)</h1> <p style="margin-bottom: 5px;">Каждое задание — отдельная функция. Данные вводятся через <code>prompt()</code>, результат — через <code>alert()</code>.</p> <div class="grid"> <!-- a. sin(x) --> <div class="card"> <div class="badge">Задание a</div> <h3>📐 sin(x)</h3> <p>Вычислить синус угла <strong>x</strong> (в радианах). Пользователь вводит число x.</p> <button id="btnSin">Вычислить sin(x)</button> </div> <!-- b. Принадлежность точки квадрату (стороны параллельны осям) --> <div class="card"> <div class="badge">Задание b</div> <h3>⬛ Квадрат (противоположные вершины)</h3> <p>Введите координаты двух противоположных вершин (x1,y1) и (x2,y2), затем точку (x,y). Определить, принадлежит ли точка квадрату.</p> <button id="btnSquare">Проверить точку</button> </div> <!-- c. Сумма двух квадратов натуральных чисел --> <div class="card"> <div class="badge">Задание c</div> <h3>🔢 Сумма двух квадратов</h3> <p>Натуральное число n. Можно ли представить n = a² + b², где a,b ∈ ℕ?</p> <button id="btnSumSquares">Проверить число</button> </div> <!-- d. Проверка email на наличие @ --> <div class="card"> <div class="badge">Задание d</div> <h3>📧 Валидация email</h3> <p>Проверить, содержит ли введённый адрес электронной почты символ '@'. Если нет — предупреждение.</p> <button id="btnEmailCheck">Проверить email</button> </div> <!-- e. Доля латинских букв в строке (в процентах) --> <div class="card"> <div class="badge">Задание e</div> <h3>🔤 Латинские буквы (%)</h3> <p>Введите строку s. Вычислить процент символов, являющихся буквами латинского алфавита (a-z, A-Z).</p> <button id="btnLatinPercent">Подсчитать %</button> </div> <!-- f. Удалить повторные вхождения слов (пробелы любые) --> <div class="card"> <div class="badge">Задание f</div> <h3>🗣️ Удалить дубликаты слов</h3> <p>Строка из слов, разделенных пробелами (один или несколько). Удалить все повторные вхождения слов, сохранив порядок первых вхождений.</p> <button id="btnRemoveDuplicates">Обработать строку</button> </div> <!-- g. Массив случайных чисел, вывести по 5 в строке в обратном порядке --> <div class="card"> <div class="badge">Задание g</div> <h3>🎲 Массив случайных чисел (обратный порядок)</h3> <p>Введите n (размер массива). Создать массив случайных чисел от 0 до 100, вывести по 5 чисел в строке в обратном порядке.</p> <button id="btnReverseArray">Сгенерировать и вывести</button> </div> <!-- h. Квадратная матрица n x n, обнулить диагонали кроме max и min --> <div class="card"> <div class="badge">Задание h</div> <h3>🧮 Матрица: диагонали (кроме max/min)</h3> <p>Порядок n, матрица случайных чисел (0..50). Заменить нулями элементы главной и побочной диагоналей, <strong>кроме наибольшего и наименьшего</strong> среди них. Вывод alert.</p> <button id="btnMatrixDiag">Построить матрицу</button> </div> <!-- i. Прибавить n дней к текущей дате --> <div class="card"> <div class="badge">Задание i</div> <h3>📅 Дата + n дней</h3> <p>Введите целое число n (может быть отрицательным). Прибавить n дней к текущей дате и вывести результат в формате ГГГГ-ММ-ДД.</p> <button id="btnAddDays">Прибавить дни</button> </div> <!-- j. Месяцев до 1 сентября от текущей даты --> <div class="card"> <div class="badge">Задание j</div> <h3>🗓️ Месяцев до 1 сентября</h3> <p>Рассчитать, сколько полных месяцев осталось от текущей даты до 1 сентября (ближайшего или будущего). Вывод с пояснением.</p> <button id="btnMonthsToSep">Сколько месяцев?</button> </div> </div> <footer>Все скрипты работают через prompt/alert согласно условию. Ввод проверяется, где необходимо.</footer> </div> <script> // ---------------------- a. sin(x) ------------------------- function taskSin() { let input = prompt("Введите значение x (в радианах):"); if (input === null) return; let x = parseFloat(input); if (isNaN(x)) { alert("Ошибка: введите число."); return; } let result = Math.sin(x); alert(`sin(${x}) = ${result.toFixed(6)}`); } // ---------------------- b. Квадрат, стороны || осям ----------------- function taskSquarePoint() { // запрашиваем координаты противоположных вершин let x1 = prompt("Введите x1 (первая вершина):"); if (x1 === null) return; let y1 = prompt("Введите y1 (первая вершина):"); if (y1 === null) return; let x2 = prompt("Введите x2 (противоположная вершина):"); if (x2 === null) return; let y2 = prompt("Введите y2 (противоположная вершина):"); if (y2 === null) return; let px = prompt("Введите x координату точки:"); if (px === null) return; let py = prompt("Введите y координату точки:"); if (py === null) return; let x1n = parseFloat(x1), y1n = parseFloat(y1); let x2n = parseFloat(x2), y2n = parseFloat(y2); let pxn = parseFloat(px), pyn = parseFloat(py); if (isNaN(x1n) || isNaN(y1n) || isNaN(x2n) || isNaN(y2n) || isNaN(pxn) || isNaN(pyn)) { alert("Ошибка: все координаты должны быть числами."); return; } // определяем границы квадрата: стороны параллельны осям => minX, maxX, minY, maxY let minX = Math.min(x1n, x2n); let maxX = Math.max(x1n, x2n); let minY = Math.min(y1n, y2n); let maxY = Math.max(y1n, y2n); // проверка что это квадрат (длины сторон равны) let sideX = maxX - minX; let sideY = maxY - minY; if (Math.abs(sideX - sideY) > 1e-9) { alert("Введённые координаты не образуют квадрат (стороны не равны).\n" + `Ширина: ${sideX}, высота: ${sideY}. Квадрат требует равенства.`); return; } let inside = (pxn >= minX && pxn <= maxX && pyn >= minY && pyn <= maxY); alert(`Точка (${pxn}, ${pyn}) ${inside ? "принадлежит" : "НЕ принадлежит"} квадрату с вершинами (${minX},${minY}) — (${maxX},${maxY})`); } // ---------------------- c. Сумма двух квадратов натуральных чисел ----------------- function taskSumOfTwoSquares() { let input = prompt("Введите натуральное число n:"); if (input === null) return; let n = parseInt(input, 10); if (isNaN(n) || n <= 0 || !Number.isInteger(n)) { alert("Ошибка: требуется натуральное число (целое > 0)."); return; } let found = false; let limit = Math.floor(Math.sqrt(n)); for (let a = 1; a <= limit; a++) { let a2 = a * a; let remain = n - a2; if (remain < 1) continue; let b = Math.floor(Math.sqrt(remain)); if (b * b === remain && b >= 1) { found = true; break; } } if (found) { alert(`Число ${n} можно представить в виде суммы двух квадратов натуральных чисел.`); } else { alert(`Число ${n} НЕЛЬЗЯ представить в виде суммы двух квадратов натуральных чисел.`); } } // ---------------------- d. Проверка email на @ ----------------- function taskEmailCheck() { let email = prompt("Введите адрес электронной почты:"); if (email === null) return; if (email.includes('@')) { alert("Адрес корректен: символ '@' присутствует."); } else { alert("⚠️ ВНИМАНИЕ! В адресе электронной почты отсутствует символ '@'."); } } // ---------------------- e. Доля латинских букв (%) ----------------- function taskLatinPercent() { let s = prompt("Введите строку s:"); if (s === null) return; if (s.length === 0) { alert("Строка пуста. Доля латинских букв = 0%"); return; } let latinCount = 0; for (let ch of s) { if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { latinCount++; } } let percent = (latinCount / s.length) * 100; alert(`Строка: "${s}"\nЛатинских букв: ${latinCount} из ${s.length}\nДоля: ${percent.toFixed(2)}%`); } // ---------------------- f. Удалить повторные вхождения слов ----------------- function taskRemoveDuplicateWords() { let s = prompt("Введите строку из слов, разделенных пробелами (можно несколькими):"); if (s === null) return; // разбиваем по пробелам, фильтруем пустые токены let words = s.trim().split(/\s+/); let seen = new Set(); let uniqueWords = []; for (let w of words) { if (!seen.has(w)) { seen.add(w); uniqueWords.push(w); } } let resultStr = uniqueWords.join(' '); alert(`Исходная: "${s}"\nПосле удаления повторов: "${resultStr}"`); } // ---------------------- g. Массив случайных чисел, вывод по 5 в строке в обратном порядке ----------------- function taskRandomArrayReverse() { let nInput = prompt("Введите n (размер массива):"); if (nInput === null) return; let n = parseInt(nInput, 10); if (isNaN(n) || n <= 0) { alert("Ошибка: n должно быть положительным целым числом."); return; } let arr = []; for (let i = 0; i < n; i++) { arr.push(Math.floor(Math.random() * 101)); // 0..100 } let reversed = [...arr].reverse(); // формируем вывод по 5 чисел в строке let outputLines = []; for (let i = 0; i < reversed.length; i += 5) { let chunk = reversed.slice(i, i + 5); outputLines.push(chunk.join(' ')); } let previewArr = "Исходный массив: " + arr.join(', ') + "\n\n"; let reversedFormatted = "Массив в обратном порядке (по 5 чисел в строке):\n" + outputLines.join('\n'); alert(previewArr + reversedFormatted); } // ---------------------- h. Квадратная матрица, обнулить диагонали (кроме max/min) ----------------- function taskMatrixDiagonals() { let nInput = prompt("Введите порядок квадратной матрицы n (натуральное число):"); if (nInput === null) return; let n = parseInt(nInput, 10); if (isNaN(n) || n <= 0) { alert("Ошибка: n должно быть натуральным числом (1,2,3...)."); return; } // Генерируем матрицу n x n случайные числа от 0 до 50 let matrix = Array.from({ length: n }, () => Array(n).fill(0)); for (let i = 0; i < n; i++) { for (let j = 0; j < n; j++) { matrix[i][j] = Math.floor(Math.random() * 51); } } // Собираем элементы на главной и побочной диагоналях (сохраняем значения и позиции) let diagElements = []; // {value, i, j} for (let i = 0; i < n; i++) { // главная диагональ (i,i) diagElements.push({ value: matrix[i][i], i: i, j: i, type: "main" }); // побочная диагональ (i, n-1-i), если i != n-1-i (чтобы не дублировать при пересечении в центре) let jSec = n - 1 - i; if (jSec !== i) { // избегаем двойного учёта центрального элемента для нечетного n diagElements.push({ value: matrix[i][jSec], i: i, j: jSec, type: "secondary" }); } } if (diagElements.length === 0) { // при n=0 не бывает, но на всякий случай alert("Матрица пуста."); return; } // Находим максимальное и минимальное значение среди диагональных элементов let maxVal = -Infinity, minVal = Infinity; for (let elem of diagElements) { if (elem.value > maxVal) maxVal = elem.value; if (elem.value < minVal) minVal = elem.value; } // Обнуляем элементы главной и побочной диагоналей, кроме тех, что равны maxVal или minVal // (если несколько максимумов/минимумов — все они сохраняются) for (let elem of diagElements) { if (elem.value !== maxVal && elem.value !== minVal) { matrix[elem.i][elem.j] = 0; } } // Формируем красивый вывод матрицы в alert (ограничим, если слишком большая) let matrixStr = "Исходная матрица (слева) и результат (справа) через '→'\n\n"; // Для наглядности: покажем преобразование. Но нужно сгенерировать исходную матрицу снова? сохраним исходную для вывода let originalMatrix = Array.from({ length: n }, (_, i) => Array.from({ length: n }, (_, j) => { // восстанавливаем исходные значения для вывода (т.к. matrix изменён) // проще перегенерировать исходные данные для красоты, но мы можем сохранить копию до изменений. // создадим копию исходной матрицы до изменений. return 0; // временно, сделаем по-другому. })); // пересоздадим исходную матрицу для отображения (потеряно? нет, пересоздадим) let origMatrix = Array.from({ length: n }, () => Array(n).fill(0)); for (let i = 0; i < n; i++) { for (let j = 0; j < n; j++) { origMatrix[i][j] = Math.floor(Math.random() * 51); // заполним заново? Несовместимость: мы ранее уже сгенерировали matrix. Чтобы сохранить согласованность, переопределим matrix и origMatrix единообразно. } } // Переделаем чистую генерацию без путаницы: заново создадим матрицу и проделаем всю логику let matrixNew = Array.from({ length: n }, () => Array(n).fill(0)); for (let i = 0; i < n; i++) { for (let j = 0; j < n; j++) { matrixNew[i][j] = Math.floor(Math.random() * 51); } } let origCopy = matrixNew.map(row => [...row]); // Соберем диагонали для matrixNew let diagVals = []; for (let i = 0; i < n; i++) { diagVals.push({ value: matrixNew[i][i], i: i, j: i }); let j2 = n - 1 - i; if (j2 !== i) diagVals.push({ value: matrixNew[i][j2], i: i, j: j2 }); } let maxD = Math.max(...diagVals.map(v => v.value)); let minD = Math.min(...diagVals.map(v => v.value)); for (let elem of diagVals) { if (elem.value !== maxD && elem.value !== minD) { matrixNew[elem.i][elem.j] = 0; } } // Форматирование для вывода: покажем до 12 строк чтобы не перегружать alert let origPreview = origCopy.map(row => row.map(v => String(v).padStart(3, ' ')).join(' ')).join('\n'); let resPreview = matrixNew.map(row => row.map(v => String(v).padStart(3, ' ')).join(' ')).join('\n'); let info = `Размер матрицы: ${n}x${n}\nНаибольшее значение на диагоналях (главная+побочная): ${maxD}\nНаименьшее: ${minD}\nЭти элементы сохранены, остальные диагональные обнулены.\n\nИсходная матрица:\n${origPreview}\n\nМатрица после преобразования:\n${resPreview}`; alert(info); } // ---------------------- i. Прибавить n дней к текущей дате ----------------- function taskAddDays() { let input = prompt("Введите количество дней n (целое число, может быть отрицательным):"); if (input === null) return; let n = parseInt(input, 10); if (isNaN(n)) { alert("Ошибка: введите целое число."); return; } let now = new Date(); let newDate = new Date(now); newDate.setDate(now.getDate() + n); let formatted = newDate.toISOString().slice(0, 10); alert(`Текущая дата: ${now.toISOString().slice(0, 10)}\nПрибавили ${n} дн. → Новая дата: ${formatted}`); } // ---------------------- j. Сколько месяцев осталось до 1 сентября ----------------- function taskMonthsToSeptember() { let today = new Date(); let currentYear = today.getFullYear(); // Создаем дату 1 сентября текущего года let sepThisYear = new Date(currentYear, 8, 1); // месяц 8 = сентябрь (0-индекс) let targetDate; if (today > sepThisYear) { // если сегодня после 1 сентября этого года, то следующий год targetDate = new Date(currentYear + 1, 8, 1); } else { targetDate = sepThisYear; } // разница в месяцах: (год разница * 12) + разница месяцев let yearDiff = targetDate.getFullYear() - today.getFullYear(); let monthDiff = targetDate.getMonth() - today.getMonth(); let totalMonths = yearDiff * 12 + monthDiff; // дополнительная корректировка по дням: если сегодняшнее число больше 1-го сентября в будущем месяце? Но для месяцев "осталось" обычно считают целые месяцы // уточним, если день месяца у сегодняшней даты > дня целевого месяца (1), то месяц не полный. Но условие: "сколько месяцев осталось" — можно вывести приблизительно целое количество полных месяцев // улучшим: если день сегодня больше 1, то оставшиеся месяцы уменьшаем на 1 если до конца месяца? логичнее вывести с уточнением. let remainderMsg = ""; if (today.getDate() > 1 && totalMonths >= 0) { let nextMonthCheck = new Date(today.getFullYear(), today.getMonth() + 1, 1); if (nextMonthCheck <= targetDate) { remainderMsg = " (с учётом дня: менее полного месяца, итог округлён вниз)"; } } if (totalMonths < 0) totalMonths = 0; // на всякий случай alert(`Сегодня: ${today.toISOString().slice(0, 10)}\nЦелевая дата: ${targetDate.toISOString().slice(0, 10)}\n\n📆 До 1 сентября осталось ${totalMonths} полных месяцев.${remainderMsg}`); } // ----- Привязка кнопок ----- document.getElementById("btnSin").addEventListener("click", taskSin); document.getElementById("btnSquare").addEventListener("click", taskSquarePoint); document.getElementById("btnSumSquares").addEventListener("click", taskSumOfTwoSquares); document.getElementById("btnEmailCheck").addEventListener("click", taskEmailCheck); document.getElementById("btnLatinPercent").addEventListener("click", taskLatinPercent); document.getElementById("btnRemoveDuplicates").addEventListener("click", taskRemoveDuplicateWords); document.getElementById("btnReverseArray").addEventListener("click", taskRandomArrayReverse); document.getElementById("btnMatrixDiag").addEventListener("click", taskMatrixDiagonals); document.getElementById("btnAddDays").addEventListener("click", taskAddDays); document.getElementById("btnMonthsToSep").addEventListener("click", taskMonthsToSeptember); </script> </body> </html>