Практическая работа №4
Основные теоретические положения
Section titled “Основные теоретические положения”1. Объявление функции
Функция позволяет выделить повторяемую или логически завершённую часть программы.
function calculateTotal(price, quantity) { return price * quantity;}Вызов функции:
const total = calculateTotal(1499, 3);
console.log(total);2. Параметры и аргументы
Параметры указываются при объявлении функции:
function calculateArea(width, height) { return width * height;}Аргументы передаются при вызове:
const area = calculateArea(12, 5);Одна функция может вызываться многократно с разными данными.
3. Возвращаемое значение
Для возврата результата используется return.
function getDiscount(amount) { if (amount >= 10000) { return 15; }
if (amount >= 5000) { return 10; }
return 0;}После выполнения return функция завершается.
Результат можно сохранить:
const discount = getDiscount(7200);или использовать сразу:
console.log(getDiscount(7200));4. Функция должна выполнять одну понятную задачу
Не следует помещать всю программу в одну большую функцию.
Например, вместо:
function processOrder() { // получение данных // проверка // расчёт скидки // расчёт доставки // вывод результата}лучше разделить логику:
function isValidAmount(amount) { return amount > 0;}
function calculateDiscount(amount) { // ...}
function calculateDelivery(distance) { // ...}После этого итоговая операция может использовать результаты отдельных функций.
5. Область видимости
Переменная, объявленная внутри функции, доступна только внутри неё.
function calculatePrice() { const price = 1200;
return price;}
console.log(price); // ошибкаПоэтому функции удобны для изоляции промежуточных вычислений.
6. Значения по умолчанию
Параметру можно задать значение по умолчанию:
function calculatePrice(price, quantity = 1) { return price * quantity;}Вызовы:
calculatePrice(500);calculatePrice(500, 3);7. Функциональное выражение
Функцию можно сохранить в переменную:
const calculateTax = function (amount) { return amount * 0.13;};8. Стрелочная функция
Короткую функцию можно записать с помощью стрелочного синтаксиса:
const double = (value) => { return value * 2;};Для одного выражения запись можно сократить:
const double = value => value * 2;9. Функция как значение
Функцию можно передать в другую функцию.
function applyOperation(value, operation) { return operation(value);}
const addTax = value => value * 1.2;
const result = applyOperation(1000, addTax);
console.log(result);Функция applyOperation() не знает заранее, какое именно преобразование будет выполнено.
10. Проверка входных данных
Функция должна корректно обрабатывать недопустимые значения.
function calculateAverage(sum, count) { if (count <= 0) { return null; }
return sum / count;}Использование:
const average = calculateAverage(5000, 4);
if (average === null) { console.log("Невозможно выполнить расчёт");} else { console.log(average);}Задания для выполнения
Section titled “Задания для выполнения”Часть 1. Исследование функций
Выполните задания 1–4 полностью. Они используются как общая тренировочная часть перед самостоятельным вариантом.
Задание 1.1. Параметры и возвращаемое значение
Создайте функцию:
function calculateRectangleArea(width, height) { // ...}Функция должна возвращать площадь прямоугольника.
Проверьте её для значений:
5 × 1012 × 37.5 × 4После этого создайте функцию:
function calculateRectanglePerimeter(width, height) { // ...}Выведите площадь и периметр для каждого набора данных.
Задание 1.2. Проверка входных данных
Создайте функцию:
function isValidAge(age) { // ...}Она должна возвращать:
trueесли возраст находится в диапазоне от 0 до 120, и:
falseв остальных случаях.
Проверьте:
-1018120121Задание 1.3. Разбиение вычисления на функции
Разработайте расчёт стоимости заказа.
Создайте функции:
calculateSubtotal(price, quantity)calculateDiscount(subtotal)calculateTotal(subtotal, discount)Правила скидки:
| Сумма | Скидка |
|---|---|
| менее 3000 ₽ | 0% |
| 3000–4999 ₽ | 5% |
| 5000–9999 ₽ | 10% |
| от 10000 ₽ | 15% |
Функция calculateDiscount() должна возвращать процент скидки.
Функция calculateTotal() должна возвращать итоговую сумму.
Проверьте программу минимум для трёх заказов.
Задание 1.4. Стрелочная функция и функция как аргумент
Создайте стрелочные функции:
const addVat = value => value * 1.2;const applyDiscount = value => value * 0.9;Затем создайте:
function transformPrice(price, operation) { // ...}Функция должна вызвать переданную операцию и вернуть результат.
Проверьте:
transformPrice(1000, addVat);transformPrice(1000, applyDiscount);Объясните, почему в transformPrice() можно передавать разные функции.
Часть 2. Индивидуальное задание
Вариант 1. Интернет-магазин
Задание 1.1. Стоимость позиции
Создайте функцию:
calculateItemTotal(price, quantity)Она должна проверять, что цена и количество положительные, и возвращать стоимость позиции.
При некорректных данных возвращайте null.
Задание 1.2. Скидка заказа
Создайте:
getDiscountPercent(amount)Правила:
- менее
3000₽ —0%; - от
3000₽ —5%; - от
7000₽ —10%; - от
15000₽ —15%.
Задание 1.3. Итог заказа
Создайте:
calculateOrderTotal(price, quantity)Она должна использовать функции из предыдущих заданий и вернуть итоговую сумму со скидкой.
Вариант 2. Служба доставки
Задание 2.1. Стоимость по расстоянию
Создайте:
calculateDeliveryPrice(distance)Правила:
- до
5км —200₽; - до
15км —350₽; - более
15км —500₽.
Задание 2.2. Доплата за массу
Создайте стрелочную функцию:
calculateWeightSurcharge(weight)Если масса превышает 10 кг, доплата составляет 50 ₽ за каждый килограмм превышения.
Задание 2.3. Итог доставки
Создайте функцию, которая использует обе предыдущие и возвращает полную стоимость доставки.
Вариант 3. Мобильный тариф
Задание 3.1. Стоимость превышения
Создайте:
calculateTrafficOverage(usedGb, includedGb, pricePerGb)Если лимит не превышен, функция должна возвращать 0.
Задание 3.2. Скидка за автоплатёж
Создайте стрелочную функцию:
applyAutoPaymentDiscount(subscriptionFee, isAutoPayment)При включённом автоплатеже скидка на абонентскую плату составляет 5%.
Задание 3.3. Итоговая стоимость
Создайте функцию, принимающую абонентскую плату, использованный трафик, лимит, стоимость дополнительного ГБ и состояние автоплатежа.
Используйте функции из заданий 3.1 и 3.2.
Вариант 4. Сервис такси
Задание 4.1. Базовая стоимость
Создайте:
calculateBaseTripPrice(distance)Стоимость:
100 + distance × 25Задание 4.2. Тарифный коэффициент
Создайте:
getTariffCoefficient(tariff)Для:
economy → 1comfort → 1.35business → 1.8Для неизвестного тарифа возвращайте null.
Задание 4.3. Стоимость поездки
Создайте функцию, использующую обе предыдущие функции и возвращающую итоговую стоимость.
Вариант 5. Образовательная система
Задание 5.1. Оценка по баллам
Создайте:
getGrade(score)Она должна возвращать оценку от 2 до 5.
Некорректными считаются значения меньше 0 или больше 100.
Задание 5.2. Проверка допуска
Создайте стрелочную функцию:
canTakeExam(attendance, practicalsCompleted, hasDebt)Допуск разрешён, если посещаемость не ниже 75%, все практические выполнены и задолженности нет.
Задание 5.3. Формирование результата
Создайте функцию, которая принимает данные студента, вызывает обе предыдущие функции и возвращает строку с оценкой и состоянием допуска.
Вариант 6. Банковская операция
Задание 6.1. Проверка суммы
Создайте:
isValidPaymentAmount(amount, balance)Платёж допустим, если сумма положительная и не превышает остаток.
Задание 6.2. Комиссия
Создайте:
calculateCommission(amount, paymentType)Правила:
card—1%;sbp—0%;transfer—1.5%.
Задание 6.3. Выполнение расчёта
Создайте функцию, которая сначала проверяет возможность платежа, затем рассчитывает комиссию и возвращает итоговую сумму списания.
Вариант 7. Облачное хранилище
Задание 7.1. Проверка загрузки
Создайте:
canUpload(fileSize, freeSpace)Функция должна вернуть true или false.
Задание 7.2. Процент заполнения
Создайте:
calculateUsagePercent(usedSpace, totalSpace)Не допускайте деление на 0.
Задание 7.3. Состояние хранилища
Создайте функцию, использующую calculateUsagePercent().
Она должна вернуть:
- до
70%—Нормальное; - от
70%до90%—Мало свободного места; - выше
90%—Критическое заполнение.
Вариант 8. Складская система
Задание 8.1. Проверка остатка
Создайте:
needsRestock(stock, minStock)Она должна возвращать true, если товар необходимо пополнить.
Задание 8.2. Стоимость партии
Создайте стрелочную функцию:
calculateBatchCost(price, quantity)Задание 8.3. Формирование заказа поставщику
Создайте функцию, которая принимает текущий остаток, минимальный остаток, требуемое количество и цену.
Если пополнение необходимо, функция должна вернуть стоимость заказа. В противном случае — 0.
Вариант 9. Система технической поддержки
Задание 9.1. Определение приоритета
Создайте:
getPriority(level)Для значений 1–5 верните текстовое обозначение приоритета.
Задание 9.2. Проверка эскалации
Создайте:
needsEscalation(priority, hoursWithoutSolution)Эскалация нужна, если приоритет не ниже 4 или обращение не решено более 24 часов.
Задание 9.3. Обработка обращения
Создайте функцию, использующую обе предыдущие функции и возвращающую итоговое состояние обращения.
Вариант 10. Гостиничная система
Задание 10.1. Стоимость проживания
Создайте:
calculateStayPrice(pricePerNight, nights)Задание 10.2. Скидка
Создайте:
getStayDiscount(nights)Правила:
- менее
5ночей —0%; - 5–9 ночей —
5%; - от 10 ночей —
10%.
Задание 10.3. Итог бронирования
Создайте функцию, использующую две предыдущие функции и возвращающую стоимость проживания со скидкой.
Вариант 11. Парковочная система
Задание 11.1. Базовая стоимость
Создайте:
calculateParkingPrice(hours, pricePerHour)Задание 11.2. Ограничение суточной стоимости
Создайте:
limitDailyPrice(price, dailyLimit)Если рассчитанная стоимость превышает суточный лимит, функция должна вернуть лимит.
Задание 11.3. Итоговая стоимость
Создайте функцию, использующую обе предыдущие.
Для проверки используйте:
80 ₽/чассуточный лимит 600 ₽Вариант 12. Регистрация пользователя
Задание 12.1. Проверка возраста
Создайте:
isAllowedAge(age)Регистрация разрешена с 14 лет.
Задание 12.2. Проверка пароля
Создайте:
isValidPasswordLength(length)Допустимая длина — от 8 до 64 символов.
Задание 12.3. Проверка регистрации
Создайте:
canRegister(age, passwordLength, isBlocked)Она должна использовать обе предыдущие функции и дополнительно учитывать блокировку пользователя.
Вариант 13. Мониторинг сервера
Задание 13.1. Проверка загрузки CPU
Создайте:
getCpuState(cpuLoad)Результаты:
- до
70%—Норма; - 70–89% —
Высокая нагрузка; - от
90%—Критическая нагрузка.
Задание 13.2. Проверка памяти
Создайте стрелочную функцию:
getMemoryUsagePercent(usedMemory, totalMemory)Задание 13.3. Общее состояние
Создайте функцию, использующую обе предыдущие функции.
Если CPU не ниже 90% или память занята более чем на 90%, состояние сервера — Критическое.
Вариант 14. Финансовое планирование
Задание 14.1. Срок накопления
Создайте:
calculateMonthsToGoal(current, monthly, goal)Для расчёта используйте цикл while.
Если ежемесячное пополнение меньше или равно 0, возвращайте null.
Задание 14.2. Итоговая сумма
Создайте:
calculateSavings(current, monthly, months)Для вычисления используйте цикл for.
Задание 14.3. Проверка плана
Создайте функцию, которая использует обе предыдущие и сообщает, будет ли цель достигнута за заданное пользователем количество месяцев.
Вариант 15. Сетевой сервис
Задание 15.1. Классификация HTTP-кода
Создайте:
getHttpStatusGroup(status)Она должна возвращать:
1xx—Информационный;2xx—Успешный;3xx—Перенаправление;4xx—Ошибка клиента;5xx—Ошибка сервера.
Для значений вне диапазона 100–599 возвращайте Некорректный код.
Задание 15.2. Проверка времени ответа
Создайте:
isResponseSlow(responseTime, limit = 500)Используйте параметр по умолчанию.
Задание 15.3. Анализ ответа
Создайте функцию, которая получает HTTP-код и время ответа, использует обе предыдущие функции и возвращает текстовое описание результата.
Требования к результату
Section titled “Требования к результату”В рамках практической работы необходимо:
- выполнить все задания части 1;
- выполнить все три задания назначенного индивидуального варианта;
- использовать параметры и возвращаемые значения функций;
- не дублировать одинаковую логику в нескольких местах программы;
- хотя бы одну функцию записать в стрелочном синтаксисе;
- использовать одну функцию внутри другой либо передать функцию как аргумент;
- проверить программу на корректных и граничных входных данных.
Контрольные вопросы
Section titled “Контрольные вопросы”- Что называется функцией?
- Чем параметры отличаются от аргументов?
- Для чего используется
return? - Что происходит после выполнения
return? - Чем функция, возвращающая значение, отличается от функции, которая только выводит результат?
- Что такое локальная область видимости?
- Почему промежуточные переменные функции обычно не должны быть глобальными?
- Для чего используются параметры по умолчанию?
- Что такое функциональное выражение?
- Что представляет собой стрелочная функция?
- Можно ли сохранить функцию в переменной?
- Можно ли передать функцию в другую функцию как аргумент?
- Почему большую задачу полезно разделять на несколько небольших функций?
- Какими признаками обладает функция, выполняющая одну понятную задачу?
- В каких случаях функция должна возвращать
nullили другое специальное значение?
При защите будьте готовы изменить один из параметров функции, добавить новую проверку входных данных или объяснить порядок вызова функций.