JavaScript · Синтаксис · Начальный уровень

Функции: уровень 3

15 задач

Упражнения по функциям JavaScript уровня 3: функции с режимами работы, флагами, несколькими условиями, обработкой строк, массивов и чисел для развития алгоритмического мышления.

Параметры, управляющие поведением

#
Эти задачи знакомят с паттерном, который постоянно встречается в реальном коде: параметр, управляющий тем, что функция делает, а не тем, над чем она работает. Наиболее распространённые формы — строка-режим и булевый флаг. Строка-режим — одно из небольшого набора литеральных значений, таких как "add", "sub", "sum", "product". Функция ветвится по ним: ```javascript function calculate(a, b, operation) { if (operation === "add") { return a + b; } else if (operation === "sub") { return a - b; } } ``` Булевый флаг переключает между двумя вариантами поведения: ```javascript function formatText(text, upper) { if (upper) { return text.toUpperCase(); } else { return text.toLowerCase(); } } ``` Ключевой момент: данные (текст, числа) и поведение (что с ними делать) — оба являются входами функции. Это делает функцию гибкой без необходимости писать отдельную для каждой комбинации. Распространённая ошибка — трактовать флаг как строку: if (upper === true) более хрупко, чем if (upper), а if (upper === "true") всегда будет false, когда upper — настоящий булев тип. Булевые параметры уже являются true или false — используйте их напрямую.

Паттерны режимов и флагов

#
Большинство задач здесь сочетают режим или флаг с коротким вычислением. Блок if/else if — это вся функция: ```javascript function scaleNumber(n, mode) { if (mode === "double") { return n * 2; } else if (mode === "triple") { return n * 3; } } function combineNumbers(numbers, mode) { if (mode === "sum") { let total = 0; for (const n of numbers) total += n; return total; } else if (mode === "product") { let result = 1; for (const n of numbers) result *= n; return result; } } ``` Для операций над массивом режим выбирает вычисление — но обе ветки используют одинаковую структуру итерации. Булевые флаги с двумя симметричными вариантами поведения: ```javascript function pickNumber(a, b, getMax) { if (getMax) { return a >= b ? a : b; } else { return a <= b ? a : b; } } ``` condition ? a : b — тернарный оператор JavaScript. Эквивалент блока if/else, но умещается в одно выражение. Используйте его, когда обе ветки короткие. Когда одна ветка просто возвращает неизменённый вход: ```javascript function maybeAbs(n, useAbs) { if (useAbs) { return Math.abs(n); } return n; } ``` else не нужен, когда один путь заканчивается на return — голый return в конце обрабатывает другой случай.
01

Режим double или triple.

#

Напишите функцию, которая принимает число и строку-режим: "double" или "triple". Если режим "double" — вернуть число, умноженное на 2, если "triple" — умноженное на 3.

function scaleNumber(n, mode) {
    // ваш код здесь
}
Решение
function scaleNumber(n, mode) {
    if (mode === "double") {
        return n * 2;
    } else if (mode === "triple") {
        return n * 3;
    } else {
        return n;
    }
}
02

Флаг верхнего регистра.

#

Напишите функцию, которая принимает строку и логическое значение. Если флаг upper равен true — вернуть строку в верхнем регистре, иначе — в нижнем.

function formatText(text, upper) {
    // ваш код здесь
}
Решение
function formatText(text, upper) {
    if (upper) {
        return text.toUpperCase();
    } else {
        return text.toLowerCase();
    }
}
03

Операция add или sub.

#

Напишите функцию, которая принимает два числа и строку-операцию: "add" или "sub". Верните сумму или разность в зависимости от операции.

function calculate(a, b, operation) {
    // ваш код здесь
}
Решение
function calculate(a, b, operation) {
    if (operation === "add") {
        return a + b;
    } else if (operation === "sub") {
        return a - b;
    } else {
        return 0;
    }
}
04

Переворот по условию.

#

Напишите функцию, которая принимает строку и число. Если число больше 5 — вернуть строку в обратном порядке, иначе — вернуть строку без изменений.

function conditionalReverse(text, limit) {
    // ваш код здесь
}
Решение
function conditionalReverse(text, limit) {
    if (limit > 5) {
        return text.split('').reverse().join('');
    } else {
        return text;
    }
}
05

Абсолютное значение по флагу.

#

Напишите функцию, которая принимает число и флаг. Если флаг true — вернуть абсолютное значение, если false — вернуть число как есть.

function maybeAbs(n, useAbs) {
    // ваш код здесь
}
Решение
function maybeAbs(n, useAbs) {
    if ((useAbs) && (n < 0)) {
        return -n;
    }
    return n;
}
06

Режим first или last.

#

Напишите функцию, которая принимает строку и режим: "first" или "last". Верните либо первый символ строки, либо последний.

function pickChar(text, mode) {
    // ваш код здесь
}
Решение
function pickChar(text, mode) {
    if (text === "") {
        return "";
    }

    if (mode === "first") {
        return text[0];
    } else if (mode === "last") {
        return text[text.length - 1];
    } else {
        return "";
    }
}
07

Сумма или произведение.

#

Напишите функцию, которая принимает массив чисел и режим: "sum" или "product". Верните сумму или произведение всех элементов.

function combineNumbers(numbers, mode) {
    // ваш код здесь
}
Решение
function combineNumbers(numbers, mode) {
    if (mode === "sum") {
        let total = 0;

        for (let n of numbers) {
            total += n;
        }

        return total;

    } else if (mode === "product") {
        let result = 1;

        for (let n of numbers) {
            result *= n;
        }

        return result;

    } else {
        return 0;
    }
}
08

Удаление пробелов по флагу.

#

Напишите функцию, которая принимает строку и флаг. Если флаг true — удалить все пробелы, если false — вернуть строку без изменений.

function cleanSpaces(text, remove) {
    // ваш код здесь
}
Решение
function cleanSpaces(text, remove) {
    if (!(remove)) {
        return text;
    }
    let result = "";
    for (let ch of text) {
        if (ch !== " ") {
            result += ch;
        }
    }
    return result;
}
09

Режим even или odd.

#

Напишите функцию, которая принимает число и режим: "even" или "odd". Верните true, если число соответствует режиму.

function checkParity(n, mode) {
    // ваш код здесь
}
Решение
function checkParity(n, mode) {
    if (mode === "even") {
        return n % 2 === 0;

    } else if (mode === "odd") {
        return n % 2 !== 0;

    } else {
        return false;
    }
}
10

Первые или последние 3 символа.

#

Напишите функцию, которая принимает строку и режим: "short" или "long". Если режим "short" — вернуть первые 3 символа, если "long" — последние 3 символа.

function sliceText(text, mode) {
    // ваш код здесь
}
Решение
function sliceText(text, mode) {
    if (text.length < 3) {
        return text;
    }
    if (mode === "short") {
        return text.slice(0, 3);
    } else if (mode === "long") {
        return text.slice(-3);
    }
}
11

Большее или меньшее по флагу.

#

Напишите функцию, которая принимает два числа и флаг. Если флаг true — вернуть большее число, если false — меньшее.

function pickNumber(a, b, get_max) {
    // ваш код здесь
}
Решение
function pickNumber(a, b, getMax) {
    if (getMax) {
        return (a > b ? a : b);
    } else {
        return (a < b ? a : b);
    }
}
12

Count или length.

#

Напишите функцию, которая принимает строку и режим: "count" или "length". Если режим "count" — вернуть количество букв "a", если "length" — длину строки.

function analyzeText(text, mode) {
    // ваш код здесь
}
Решение
function analyzeText(text, mode) {
    if (mode === "length") {
        return text.length;
    } else if (mode === "count") {
        let cnt = 0;
        for (let ch of text.toLowerCase()) {
            if (ch === "a") {
                cnt += 1;
            }
        }
        return cnt;
    }
}
13

Квадрат или куб.

#

Напишите функцию, которая принимает число и флаг. Если флаг true — вернуть квадрат числа, если false — куб числа.

function powerByFlag(n, square) {
    // ваш код здесь
}
Решение
function powerByFlag(n, square) {
    if (square) {
        return n * n;
    } else {
        return n * n * n;
    }
}
14

Обрезка start или end.

#

Напишите функцию, которая принимает строку и режим: "start" или "end". Если "start" — вернуть строку без первых 2 символов, если "end" — без последних 2.

function trimText(text, mode) {
    // ваш код здесь
}
Решение
function trimText(text, mode) {
    if (text.length <= 2) {
        return "";
    }
    if (mode === "start") {
        return text.slice(2);
    } else if (mode === "end") {
        return text.slice(0, -2);
    }
}
15

Sign или abs.

#

Напишите функцию, которая принимает число и режим: "sign" или "abs". Если режим "sign" — вернуть строку "positive", "negative" или "zero", если "abs" — вернуть абсолютное значение числа.

function numberInfo(n, mode) {
    // ваш код здесь
}
Решение
function numberInfo(n, mode) {
    if (mode === "abs") {
        return (n < 0 ? -n : n);

    } else if (mode === "sign") {
        if (n > 0) {
            return "positive";

        } else if (n < 0) {
            return "negative";

        } else {
            return "zero";
        }

    } else {
        return null;
    }
}