JavaScript · Синтаксис · Початковий рівень

ООП, об'єкти, алгоритмічне мислення

15 завдань

Вправи з JavaScript на ООП, об'єкти та алгоритмічне мислення: класи для аналізу даних, підрахунок слів та символів, робота з оцінками, паролями, статистикою та перетворенням об'єктів.

Звичайні об'єкти як стан класу

#
Коли клас повинен відстежувати змінну кількість елементів — оцінки багатьох студентів, рахунки гравців, слова в тексті — звичайний об'єкт {}, збережений у this, є правильним інструментом. ```javascript class GradeBook { constructor() { this.grades = {}; } add(name, grade) { if (!(name in this.grades)) { this.grades[name] = []; } this.grades[name].push(grade); } average(name) { const grades = this.grades[name] || []; if (grades.length === 0) return 0; return grades.reduce((sum, g) => sum + g, 0) / grades.length; } } ``` this.grades ініціалізується як порожній об'єкт у constructor. Перевірка name in this.grades тестує, чи вже існує ключ. || [] — безпечний запасний варіант, коли ключ може бути відсутнім. Для підрахунку входжень — частота слів, кількість букв: ```javascript class WordCounter { constructor(text) { this.text = text; } count() { const result = {}; for (const word of this.text.split(" ")) { result[word] = (result[word] || 0) + 1; } return result; } } ``` result[word] || 0 повертає поточний лічильник якщо ключ існує, або 0 якщо ні. Додавання 1 дає новий лічильник. Це стандартна ідіома підрахунку в JavaScript.

Патерни реєстру, лічильника і агрегатора

#
Реєстр, що запобігає дублікатам — використовуємо Set для зберігання зареєстрованих імен: ```javascript class UserRegistry { constructor() { this.users = new Set(); } register(username) { if (this.users.has(username)) { return false; } this.users.add(username); return true; } } ``` Set.has() — аналог Python's in для множин. Set.add() додає елемент. Клас із балансом, що дотримується правила: ```javascript class BankAccount { constructor() { this.balance = 0; } deposit(amount) { this.balance += amount; } withdraw(amount) { if (amount > this.balance) { return false; } this.balance -= amount; return true; } } ``` Пошук найкращого гравця — ітеруємо по записах об'єкта, відстежуємо ключ із максимальним значенням: ```javascript class ScoreTable { constructor() { this.scores = {}; } add(name, points) { this.scores[name] = (this.scores[name] || 0) + points; } topPlayer() { let topName = null; let topScore = -Infinity; for (const [name, score] of Object.entries(this.scores)) { if (score > topScore) { topScore = score; topName = name; } } return topName; } } ``` Object.entries() повертає пари [ключ, значення], які можна деструктурувати прямо в заголовку for...of. -Infinity гарантує, що будь-який реальний рахунок буде більшим за початкове значення.
01

WordCounter для тексту.

#

Створіть клас WordCounter, який приймає рядок тексту. Додайте метод count, який повертає об’єкт, де: - ключ — слово - значення — скільки разів воно зустрічається в тексті

class WordCounter {
    // ваш код тут
}
Рішення
class WordCounter {
    constructor(text) {
        this.text = text;
    }

    count() {
        let result = {};

        let words = this.text.trim()
            ? this.text.trim().split(/\s+/)
            : [];

        for (let w of words) {
            if (w in result) {
                result[w] += 1;
            } else {
                result[w] = 1;
            }
        }

        return result;
    }
}
02

Журнал оцінок GradeBook.

#

Створіть клас GradeBook. Метод add(name, grade) додає оцінку учню. Метод average(name) повертає середню оцінку учня.

class GradeBook {
    // ваш код тут
}
Рішення
class GradeBook {
    constructor() {
        this.data = {};
    }

    add(name, grade) {
        if (!(name in this.data)) {
            this.data[name] = [];
        }

        this.data[name].push(grade);
    }

    average(name) {
        let grades = this.data[name] ?? [];

        if (grades.length === 0) {
            return 0;
        }

        return grades.reduce((total, value) => total + value, 0) / grades.length;
    }
}
03

Підрахунок кожної літери.

#

Напишіть функцію, яка приймає рядок і повертає об’єкт із кількістю кожної літери.

function letterStats(text) {
    // ваш код тут
}
Рішення
function letterStats(text) {
    let result = {};

    for (let ch of text) {
        if (/^\p{L}$/u.test(ch)) {
            ch = ch.toLowerCase();

            if (ch in result) {
                result[ch] += 1;
            } else {
                result[ch] = 1;
            }
        }
    }

    return result;
}
04

Перевірка надійності пароля.

#

Створіть клас PasswordChecker. Метод check повертає true, якщо пароль: - довжина ≥ 8 - є хоча б одна цифра

class PasswordChecker {
    // ваш код тут
}
Рішення
class PasswordChecker {
    check(password) {
        if (password.length < 8) {
            return false;
        }

        let hasDigit = false;

        for (let ch of password) {
            if (/^\d$/.test(ch)) {
                hasDigit = true;
                break;
            }
        }

        return hasDigit;
    }
}
05

Інвентар товарів.

#

Створіть клас Inventory. Метод addItem(name, count) додає товар. Метод totalItems() повертає загальну кількість усіх товарів.

class Inventory {
    // ваш код тут
}
Рішення
class Inventory {
    constructor() {
        this.items = {};
    }

    addItem(name, count) {
        if (name in this.items) {
            this.items[name] += count;
        } else {
            this.items[name] = count;
        }
    }

    totalItems() {
        let total = 0;

        for (let c of Object.values(this.items)) {
            total += c;
        }

        return total;
    }
}
06

Групування слів за довжиною.

#

Напишіть функцію, яка приймає масив слів і повертає об’єкт: - ключ — довжина слова - значення — скільки слів такої довжини

function lengthGroups(words) {
    // ваш код тут
}
Рішення
function lengthGroups(words) {
    let result = {};

    for (let w of words) {
        let l = w.length;

        if (l in result) {
            result[l] += 1;
        } else {
            result[l] = 1;
        }
    }

    return result;
}
07

BankAccount без мінуса.

#

Створіть клас BankAccount з методами: - deposit(amount) - withdraw(amount) — не дає піти в мінус

class BankAccount {
    // ваш код тут
}
Рішення
class BankAccount {
    constructor(balance) {
        this.balance = balance;
    }
    deposit(amount) {
        this.balance += amount;
    }
    withdraw(amount) {
        if (amount <= this.balance) {
            this.balance -= amount;
            return true;
        }
        return false;
    }
}
08

Голосні та приголосні.

#

Напишіть функцію, яка приймає рядок і повертає об’єкт з кількістю голосних і приголосних букв.

function vowelsAndConsonants(text) {
    // ваш код тут
}
Рішення
function vowelsAndConsonants(text) {
    let vowels = "aeiou";

    let result = {
        vowels: 0,
        consonants: 0
    };

    for (let ch of text.toLowerCase()) {
        if (/^\p{L}$/u.test(ch)) {

            if (vowels.includes(ch)) {
                result.vowels += 1;

            } else {
                result.consonants += 1;
            }
        }
    }

    return result;
}
09

Реєстрація користувачів.

#

Створіть клас UserRegistry. Метод register(username): - повертає true, якщо користувача додано - false, якщо такий уже є

let users = [];

class UserRegistry {
    // ваш код тут
}
Рішення
let users = [];

class UserRegistry {
    register(username) {
        if (users.includes(username)) {
            return false;
        }

        users.push(username);

        return true;
    }
}
10

Класифікація чисел.

#

Напишіть функцію, яка приймає масив чисел і повертає об’єкт: - "positive" - "negative" - "zero"

function numberSummary(nums) {
    // ваш код тут
}
Рішення
function numberSummary(nums) {
    let result = {"positive": 0, "negative": 0, "zero": 0};
    for (let n of nums) {
        if (n > 0) {
            result["positive"] += 1;
        } else if (n < 0) {
            result["negative"] += 1;
        } else {
            result["zero"] += 1;
        }
    }
    return result;
}
11

Кошик покупок.

#

Створіть клас ShoppingCart. Метод add(product, price) додає товар. Метод total() повертає суму всіх цін.

class ShoppingCart {
    // ваш код тут
}
Рішення
class ShoppingCart {
    constructor() {
        this.items = {};
    }
    add(product, price) {
        this.items[product] = price;
    }
    total() {
        let total = 0;
        for (let p of Object.values(this.items)) {
            total += p;
        }
        return total;
    }
}
12

Позиція першої появи символу.

#

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

function firstPositions(text) {
    // ваш код тут
}
Рішення
function firstPositions(text) {
    let result = {};

    for (let i = 0; i < text.length; i++) {
        if (!(text[i] in result)) {
            result[text[i]] = i;
        }
    }

    return result;
}
13

Таблиця очок гравців.

#

Створіть клас ScoreTable. Метод add(name, ponumbers) додає очки гравцю. Метод top_Player() повертає ім’я гравця з максимальним рахунком.

class ScoreTable {
    // ваш код тут
}
Рішення
class ScoreTable {
    constructor() {
        this.scores = {};
    }

    add(name, points) {
        if (name in this.scores) {
            this.scores[name] += points;
        } else {
            this.scores[name] = points;
        }
    }

    topPlayer() {
        let names = Object.keys(this.scores);

        if (names.length === 0) {
            return null;
        }

        let top = null;
        let maxScore = -1;

        for (const [name, score] of Object.entries(this.scores)) {
            if (score > maxScore) {
                maxScore = score;
                top = name;
            }
        }

        return top;
    }
}
14

Обмін ключів і значень.

#

Напишіть функцію, яка приймає об’єкт і повертає новий об’єкт, де ключі та значення поміняні місцями. Гарантується, що значення унікальні.

function swapDict(d) {
    // ваш код тут
}
Рішення
function swapDict(d) {
    let result = {};
    for (const [k, v] of Object.entries(d)) {
        result[v] = k;
    }
    return result;
}
15

Аналізатор тексту.

#

Створіть клас TextAnalyzer. Метод analyze повертає об’єкт: - "chars" — кількість символів - "words" — кількість слів - "lines" — кількість рядків

class TextAnalyzer {
    // ваш код тут
}
Рішення
class TextAnalyzer {
    constructor(text) {
        this.text = text;
    }

    analyze() {
        const chars = this.text.length;
        const words = this.text.trim() ? this.text.trim().split(/\s+/).length : 0;
        const lines = this.text ? this.text.split("\n").length : 0;

        return {
            chars,
            words,
            lines,
        };
    }
}