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 . Метод add_item(name, count) добавляет товар. Метод total_items() возвращает общее количество всех товаров.
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,
};
}
}