JavaScript · Синтаксис · Початковий рівень
ООП, об'єкти, алгоритмічне мислення
Вправи з JavaScript на ООП, об'єкти та алгоритмічне мислення: класи для аналізу даних, підрахунок слів та символів, робота з оцінками, паролями, статистикою та перетворенням об'єктів.
Короткий вступ до теми та пояснення перед вправами (вправи нижче):
Патерни реєстру, лічильника і агрегатора
#Вправи:
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;
}
}
Журнал оцінок 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;
}
}
Підрахунок кожної літери.
#Напишіть функцію, яка приймає рядок і повертає об’єкт із кількістю кожної літери.
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;
}
Перевірка надійності пароля.
#Створіть клас 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;
}
}
Інвентар товарів.
#Створіть клас 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;
}
}
Групування слів за довжиною.
#Напишіть функцію, яка приймає масив слів і повертає об’єкт: - ключ — довжина слова - значення — скільки слів такої довжини
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;
}
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;
}
}
Голосні та приголосні.
#Напишіть функцію, яка приймає рядок і повертає об’єкт з кількістю голосних і приголосних букв.
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;
}
Реєстрація користувачів.
#Створіть клас 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;
}
}
Класифікація чисел.
#Напишіть функцію, яка приймає масив чисел і повертає об’єкт: - "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;
}
Кошик покупок.
#Створіть клас 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;
}
}
Позиція першої появи символу.
#Напишіть функцію, яка приймає рядок і повертає об’єкт, де ключ — символ, значення — позиція його першої появи в рядку.
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;
}
Таблиця очок гравців.
#Створіть клас 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;
}
}
Обмін ключів і значень.
#Напишіть функцію, яка приймає об’єкт і повертає новий об’єкт, де ключі та значення поміняні місцями. Гарантується, що значення унікальні.
function swapDict(d) {
// ваш код тут
}
Рішення
function swapDict(d) {
let result = {};
for (const [k, v] of Object.entries(d)) {
result[v] = k;
}
return result;
}
Аналізатор тексту.
#Створіть клас 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,
};
}
}