Skip to content

Практическая работа №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 × 10
12 × 3
7.5 × 4

После этого создайте функцию:

function calculateRectanglePerimeter(width, height) {
// ...
}

Выведите площадь и периметр для каждого набора данных.


Задание 1.2. Проверка входных данных

Создайте функцию:

function isValidAge(age) {
// ...
}

Она должна возвращать:

true

если возраст находится в диапазоне от 0 до 120, и:

false

в остальных случаях.

Проверьте:

-1
0
18
120
121

Задание 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 → 1
comfort → 1.35
business → 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;
  • выполнить все три задания назначенного индивидуального варианта;
  • использовать параметры и возвращаемые значения функций;
  • не дублировать одинаковую логику в нескольких местах программы;
  • хотя бы одну функцию записать в стрелочном синтаксисе;
  • использовать одну функцию внутри другой либо передать функцию как аргумент;
  • проверить программу на корректных и граничных входных данных.
  1. Что называется функцией?
  2. Чем параметры отличаются от аргументов?
  3. Для чего используется return?
  4. Что происходит после выполнения return?
  5. Чем функция, возвращающая значение, отличается от функции, которая только выводит результат?
  6. Что такое локальная область видимости?
  7. Почему промежуточные переменные функции обычно не должны быть глобальными?
  8. Для чего используются параметры по умолчанию?
  9. Что такое функциональное выражение?
  10. Что представляет собой стрелочная функция?
  11. Можно ли сохранить функцию в переменной?
  12. Можно ли передать функцию в другую функцию как аргумент?
  13. Почему большую задачу полезно разделять на несколько небольших функций?
  14. Какими признаками обладает функция, выполняющая одну понятную задачу?
  15. В каких случаях функция должна возвращать null или другое специальное значение?

При защите будьте готовы изменить один из параметров функции, добавить новую проверку входных данных или объяснить порядок вызова функций.

Рекомендуемая литература

Section titled “Рекомендуемая литература”
  1. MDN Web Docs — Functions
  2. MDN Web Docs — Function declaration
  3. MDN Web Docs — Arrow functions
  4. JavaScript.info — Functions
  5. JavaScript.info — Function expressions
  6. JavaScript.info — Arrow functions