5 легких задач по JavaScript для новичков: решайте быстро и просто

JavaScript – один из самых популярных языков программирования. Он используется для создания веб-сайтов, мобильных приложений, игр и многого другого. В этой статье мы представим вам пять простых задач по JavaScript, которые помогут вам начать практиковать свои знания в этом языке программирования.

Начальный уровень задач подходит для людей, которые только начинают изучать JavaScript. Все задачи не требуют специальных знаний, и их можно решить, используя только базовые концепции языка.

Вы можете использовать эти задачи, чтобы проверить свой прогресс в изучении языка программирования. Также эти задачи могут быть отличным способом, чтобы попрактиковаться в программировании на JavaScript и узнать, как они могут быть использованы на практике.

Начните с малого, и вы быстро заметите, как легко и быстро вы начнете решать задачи на JavaScript.

Примечание: Прежде чем начать работу над этими задачами, убедитесь, что вы понимаете основы JavaScript, такие как переменные, условные операторы и циклы.

Работа с переменными

Переменная — это контейнер, в котором хранится значение, которое может быть изменено в процессе выполнения программы. В JavaScript переменные объявляются с помощью ключевого слова var, let или const.

Для объявления переменной нужно указать ее имя. Имена переменных могут содержать буквы, цифры, знаки доллара ($) и подчеркивания (_). Однако, имя переменной не может начинаться с цифры и не может совпадать с зарезервированными словами JavaScript.

Присваивание значения переменной осуществляется с помощью знака равенства (=):

var x = 5;

let y = "Hello";

const z = true;

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

Для вывода значения переменной в консоль можно использовать метод console.log():

var age = 25;

console.log(age); // выводится 25

При работе с переменными важно следить за их типом данных. JavaScript имеет несколько встроенных типов данных, таких как числа (numbers), строки (strings), булевые значения (booleans), массивы (arrays), объекты (objects) и другие.

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

В общем, работа с переменными — это основа программирования на JavaScript. Чем лучше вы понимаете и умеете работать с переменными, тем более глубоко сможете изучать этот язык.

Создание переменных

В JavaScript переменные используются для хранения значений, которые могут меняться во время выполнения программы. Создание переменной в JavaScript происходит с помощью ключевого слова var, после которого указывается имя переменной.

Имя переменной может содержать буквы, цифры, символ подчеркивания (_) и доллар ($) и не должно начинаться с цифры. Однако, для удобства чтения кода, принято использовать имена, которые описывают содержимое переменной.

Например, чтобы создать переменную, которая будет хранить имя пользователя, можно написать:

var userName = "John";

Здесь переменная userName имеет тип строки и содержит значение «John». В JavaScript всего есть 5 типов данных: строки (string), числа (number), булевы значения (boolean), объекты (object) и null.

Также, переменные в JavaScript могут быть определены без использования ключевого слова var, но это не рекомендуется, так как в этом случае переменная становится глобальной и может привести к ошибкам в работе программы.

Важно помнить, что значения переменных могут быть изменены в любой момент выполнения программы с помощью оператора присваивания =. Например:

userName = "Alex";

В этом случае значение переменной userName будет изменено на «Alex».

Присваивание значений

Присваивание значений — это одна из основных задач программирования на JavaScript. В JavaScript присваивание значений осуществляется с помощью знака равенства (=).

Пример:

var x = 5;

В данном примере мы присваиваем значению x значение 5 с помощью знака равенства.

Значения можно присваивать не только числам, но и строкам, булевым значениям, объектам и другим типам данных.

Можно также присваивать значение переменной с помощью других операторов. Например, оператор += добавляет значение справа от знака равенства к уже имеющемуся значению переменной.

Пример:

var x = 5;

x += 3;

console.log(x); // Результат: 8

В данном примере мы добавили к значению переменной x значение 3 с помощью оператора += и вывели результат в консоль.

Важно помнить, что значения можно присваивать любое количество раз и в любое время выполнения программы.

Пример:

var x = 5;

x = 10;

x = "строка";

В данном примере мы три раза присвоили переменной x значения: 5, 10 и «строка».

Вывод: присваивание значений – это одна из наиболее элементарных функций языка JavaScript, которая используется в программировании для работы с данными и необходима для того, чтобы объявить переменные, задавать значения и изменять их в процессе работы программы.

Вывод значений на экран

В JavaScript для вывода значений на экран используются различные методы:

  • alert() — позволяет вывести диалоговое окно с текстом сообщения;
  • console.log() — выводит значение в консоль разработчика, что помогает отследить ошибки и проверить работу скрипта;
  • document.write() — добавляет текст на страницу непосредственно в HTML;
  • innerHTML — изменяет содержимое выбранного HTML-элемента;
  • textContent — изменяет текстовое содержимое выбранного HTML-элемента.

Для вывода информации на страницу, можно также использовать теги <p>, <em>, <strong>, <ul>, <ol>, <li>. Например, чтобы вывести список с помощью тега <ul>, необходимо использовать вложенные теги <li> и заполнить их нужной информацией:

  • <ul> — начало списка;
  • <li> — начало элемента списка;
  • текст элемента списка;
  • </li> — конец элемента списка;
  • повторение для каждого элемента списка;
  • </ul> — конец списка.

Также для вывода информации на страницу можно использовать таблицы. Для создания таблицы необходимо использовать теги <table> для самой таблицы, <tr> — для строк в таблице, <td> — для ячеек таблицы. Например:

Строка 1, ячейка 1Строка 1, ячейка 2
Строка 2, ячейка 1Строка 2, ячейка 2

Таким образом, на странице можно выводить информацию разными способами и украшать ее, чтобы пользователю было приятнее и удобнее работать с веб-приложением.

Работа с массивами

Массив — это структура данных, которая позволяет хранить большое количество элементов одного типа в одном месте. Для работы с массивами в JavaScript есть несколько методов.

Создание массива

Массив можно создать, указав в квадратных скобках элементы через запятую. Например:

let arr = [1, 2, 3, 4, 5];

Массив можно создать и с помощью конструктора:

let arr = new Array(1, 2, 3, 4, 5);

Второй метод часто используется, когда необходимо создать массив определенной длины, заполненный пустыми ячейками.

Добавление элементов в массив

С помощью метода push() можно добавить элемент в конец массива:

let arr = [1, 2, 3];

arr.push(4);

console.log(arr); // [1, 2, 3, 4]

С помощью метода unshift() можно добавить элемент в начало массива:

let arr = [1, 2, 3];

arr.unshift(0);

console.log(arr); // [0, 1, 2, 3]

Удаление элементов из массива

С помощью метода pop() можно удалить последний элемент из массива:

let arr = [1, 2, 3, 4];

arr.pop();

console.log(arr); // [1, 2, 3]

С помощью метода shift() можно удалить первый элемент из массива:

let arr = [1, 2, 3, 4];

arr.shift();

console.log(arr); // [2, 3, 4]

Поиск элементов в массиве

С помощью метода indexOf() можно найти индекс элемента в массиве:

let arr = [1, 2, 3, 4];

console.log(arr.indexOf(3)); // 2

Если элемент не найден, метод вернет -1.

Итерирование по массиву

Для перебора всех элементов массива можно использовать циклы:

  • for
  • for…of
  • forEach()

Например, цикл for:

let arr = [1, 2, 3, 4, 5];

for(let i = 0; i < arr.length; i++) {

console.log(arr[i]);

}

Цикл for…of:

let arr = [1, 2, 3, 4, 5];

for(let item of arr) {

console.log(item);

}

Метод forEach():

let arr = [1, 2, 3, 4, 5];

arr.forEach(function(item, index, array) {

console.log(item);

});

В метод forEach() передается функция, которая будет выполнена для каждого элемента массива. Функция может принимать до трех параметров: элемент массива, индекс элемента и сам массив.

Создание массива

Массив — это упорядоченный список, состоящий из одного или нескольких значений, которые могут быть любого типа, включая другие массивы. Его создание — базовая задача в JavaScript.

Для создания массива в JavaScript используется квадратные скобки []. Внутри скобок перечисляются элементы массива через запятую.

Например, создадим массив из трех чисел:

let numbers = [1, 2, 3];

Также можно создать пустой массив:

let emptyArray = [];

Массивы могут содержать элементы разных типов данных. Например:

let mixedArray = ["text", 123, true, ["nested", "array"]];

Для доступа к элементам массива используется индекс, начиная с нуля:

let firstElement = numbers[0]; // 1

Добавление нового элемента в конец массива происходит при помощи метода push(). Например:

numbers.push(4); // [1, 2, 3, 4]

Метод pop() удаляет последний элемент массива:

numbers.pop(); // [1, 2, 3]

Массивы могут также содержать методы и свойства, которые могут помочь при работе с ними. Например, метод forEach() позволяет выполнить функцию для каждого элемента массива:

numbers.forEach(function(number) {

  console.log(number);

});

//выведет 1, 2, 3 в консоль

Добавление и удаление элементов

JavaScript позволяет добавлять и удалять элементы на странице. Для этого используются методы DOM (Document Object Model), которые позволяют манипулировать содержимым HTML-документа.

Для добавления элемента на страницу необходимо создать его с помощью метода createElement() и добавить на страницу с помощью метода appendChild(). Например, чтобы добавить элемент с жирным текстом в элемент с курсивным текстом, необходимо выполнить следующий код:

let strongEl = document.createElement('strong');

strongEl.textContent = 'с жирным текстом';

let emEl = document.querySelector('em');

emEl.appendChild(strongEl);

Для удаления элемента на странице необходимо выбрать его с помощью метода querySelector() или getElementById() и удалить его с помощью метода removeChild(). Например, чтобы удалить элемент с жирным текстом из элемента с курсивным текстом, необходимо выполнить следующий код:

let strongEl = document.querySelector('em strong');

let emEl = document.querySelector('em');

emEl.removeChild(strongEl);

Также можно удалить элемент с помощью метода remove(), который доступен у самого элемента. Например, чтобы удалить элемент элемент с жирным текстом, необходимо выполнить следующий код:

let strongEl = document.querySelector('strong');

strongEl.remove();

Добавление и удаление элементов может быть полезным для динамического изменения содержимого страницы, например, при создании интерактивных элементов или динамических списков.

Поиск элементов в массиве

JavaScript предоставляет несколько способов для поиска элементов в массиве.

Метод indexOf()

Метод indexOf() используется для поиска значения в массиве и возвращает первый индекс, на котором найдено значение. Если значение не найдено, возвращается -1.

const arr = [2, 5, 8, 11];

const index = arr.indexOf(8);

console.log(index); // Output: 2

Метод find()

Метод find() используется для поиска первого элемента в массиве, удовлетворяющего условию заданному в колбек функции. Если элемент не найден, возвращает undefined.

const arr = [2, 4, 6, 8];

const even = arr.find((element) => element % 2 === 0);

console.log(even); // Output: 2

Метод filter()

Метод filter() используется для поиска всех элементов в массиве, удовлетворяющих условию заданному в колбек функции. Если ни один элемент не найден, возвращает пустой массив []

const arr = [2, 4, 6, 8];

const even = arr.filter((element) => element % 2 === 0);

console.log(even); // Output: [2, 4, 6, 8]

Метод includes()

Метод includes() используется для проверки наличия элемента в массиве. Возвращает true если значение найдено и false если нет.

const arr = [2, 4, 6, 8];

const isFound = arr.includes(6);

console.log(isFound); // Output: true

Умение правильно и эффективно искать элементы в массиве, очень важно при работе с JavaScript и его современными фреймворками и библиотеками.

Работа с условными операторами

Условные операторы позволяют выполнить различные действия в зависимости от выполнения определенного условия. В JavaScript для этого используется оператор if. С его помощью можно проверять значения переменных и выполнять соответствующий блок кода.

Например, если мы хотим выполнить какое-то действие только в том случае, если значение переменной x меньше 10, то мы можем написать следующий код:

var x = 5;

if (x < 10) {

console.log("Значение переменной меньше 10");

}

В данном примере мы объявляем переменную x со значением 5 и проверяем ее значение с помощью оператора if. Если условие x < 10 выполняется, то выполняется код в блоке {…}.

Кроме оператора if, в JavaScript есть также операторы else и else if, которые позволяют выполнить определенный блок кода, если условие не выполняется или выполняется частично. Например, такой код:

var x = 15;

if (x < 10) {

console.log("Значение переменной меньше 10");

} else {

console.log("Значение переменной больше или равно 10");

}

выполнит код в блоке else {…}, так как условие x < 10 не выполняется.

Если же нам нужно выполнить определенный блок кода в зависимости от значения переменной, мы можем использовать оператор switch. Он позволяет сравнивать значение переменной с несколькими возможными вариантами и выполнить соответствующий блок кода. Например:

var x = 2;

switch(x) {

case 1:

console.log("Переменная равна 1");

break;

case 2:

console.log("Переменная равна 2");

break;

default:

console.log("Переменная не равна ни 1, ни 2");

break;

}

Здесь мы определяем значение переменной x равным 2 и сравниваем его с двумя возможными вариантами с помощью оператора switch. Выполняется блок кода соответствующий значению переменной.

Условные операторы — важный инструмент при написании скриптов на JavaScript. Для начала можно практиковаться на простых задачах и постепенно переходить к более сложным.

Оператор if-else

Оператор if-else является одним из основных блоков управления в JavaScript. Он позволяет определять, выполнять ли определенный блок кода в зависимости от условия.

Синтаксис оператора if-else:

if (условие) {

блок кода, который выполнится, если условие верно

} else {

блок кода, который выполнится, если условие неверно

}

Если условие в скобках (условие) истинно, то выполняется первый блок кода. Если условие ложно, то выполняется второй блок кода, который находится в фигурных скобках {} после ключевого слова else.

Условие может быть любым выражением, которое возвращает логическое значение true или false.

Оператор if-else может использоваться одиночно или многократно вложенным, что дает большую гибкость в управлении выполнением кода.

Оператор switch-case

Оператор switch-case в JavaScript является одним из способов множественного условного оператора. Этот оператор позволяет упростить код, который выполняет различные действия в зависимости от значения переменной.

Оператор switch принимает значение переменной и сравнивает его с каждым case внутри. Когда значение переменной соответствует значению case, выполняются команды, которые находятся после соответствующего case.

Например, рассмотрим следующий пример:

var dayOfWeek = "Понедельник"

switch (dayOfWeek) {

case "Понедельник":

console.log("Сегодня понедельник");

break;

case "Вторник":

console.log("Сегодня вторник");

break;

case "Среда":

console.log("Сегодня среда");

break;

default:

console.log("Неизвестный день недели");

break;

}

В этом примере переменная dayOfWeek имеет значение «Понедельник». Учитывая это значение, оператор switch срабатывает и выполняет команды, которые находятся после первого case. Т.е. выведется сообщение «Сегодня понедельник». Если значение case не соответствует значению переменной, тогда выполняется команда, которая находится после default.

Оператор switch-case очень удобен, когда нужно сравнить переменную с несколькими значениями. Он также позволяет уменьшить количество кода, что улучшает читаемость и поддерживаемость кода. Единственным недостатком этого оператора может служить то, что иногда он может приводить к некоторой неоднозначности в коде.

Работа с циклами

Циклы — это одно из основных средств программирования на JavaScript. Они позволяют выполнять одно и то же действие несколько раз, обрабатывая различные данные. Наиболее распространенными циклами в JavaScript являются циклы for, while, do/while.

Цикл for часто используется для перебора массивов или других коллекций данных. Внутри цикла можно выполнять какие-то действия с каждым элементом массива, например, выводить его значение.

Цикл while, в отличие от цикла for, позволяет продолжать выполнение до тех пор, пока не будет выполнено определенное условие. Это удобно, когда неизвестно заранее количество итераций, необходимых для выполнения операции.

Цикл do/while — еще один способ повторения действий некоторое количество раз. Он особенно полезен, когда необходимо выполнить некоторый блок кода хотя бы один раз.

Используйте циклы с умом, так как некорректное их использование может привести к утечке памяти или бесконечному выполнению программы.

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

В целом, циклы — это элементарные конструкции языка JavaScript, без которых не обходится ни одна программирование на этом языке. При правильном использовании они позволяют ускорить и оптимизировать работу программы, а также сделать код более читаемым и понятным.

Цикл for

Цикл for – один из основных инструментов программирования на JavaScript. Состоит из трех аргументов, разделенных точкой с запятой: начальное значение счетчика, условие продолжения цикла и шаг итерации.

Пример общего синтаксиса:

for (начальное_значение; условие; шаг) {

// код для повторения

}

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

Пример использования цикла for:

for (let i = 1; i <= 10; i++) {

console.log(i);

}

В этой функции цикл выводит числа от 1 до 10 в консоль. Шаг итерации указан как i++, то есть после каждой итерации переменная i увеличивается на 1.

Цикл for также может использоваться для работы с массивами, объектами и другими структурами данных, а также для создания таблиц и других многократных элементов на веб-странице.

Цикл while

Цикл while — это один из видов циклов в JavaScript, который позволяет выполнять повторяющиеся действия до тех пор, пока условие, заданное внутри цикла, истинно.

Синтаксис цикла while выглядит следующим образом:

while (условие) {

    // действия, которые выполняются внутри цикла

}

Условие может быть любым выражением, которое можно привести к логическому значению true или false. Если условие истинно, то действия внутри цикла будут выполняться до тех пор, пока условие не перестанет быть истинным.

Пример использования цикла while:

let i = 0;

while (i < 10) {

    console.log(i);

    i++;

}

В данном примере цикл while будет выполняться до тех пор, пока переменная i меньше 10. Каждую итерацию внутри цикла будет выводиться значение переменной i в консоль, а затем значение переменной i будет увеличиваться на 1.

Цикл while очень удобен для работы с массивами и другими коллекциями данных, когда неизвестно заранее количество элементов, которые нужно обработать.

Цикл do-while

Цикл do-while является одним из видов циклов в JavaScript. В отличие от цикла while, условие проверяется после выполнения тела цикла, что означает, что тело цикла выполнится как минимум один раз.

Конструкция цикла выглядит следующим образом:

do{
  // тело цикла   // выполняется как минимум один раз
}while (<условие>);

Если условие возвращает true, цикл продолжает свою работу, пока условие не вернет false.

Пример использования цикла do-while:

let i = 0;

do {

console.log(i);

i++;

} while (i < 5);

Результат выполнения данного кода будет:

  1. 0
  2. 1
  3. 2
  4. 3
  5. 4

Работа с функциями

В JavaScript, функции являются основными конструкциями для организации кода и повторного использования его частей. Функции могут быть определены один раз и вызваны множество раз в различных частях программы.

Определение функции состоит из ее имени, списка параметров (если они нужны) и тела функции. Внутри тела функции описывается логика ее работы.

Для вызова функции используется ключевое слово «function» и имя функции со списком параметров в круглых скобках. Например, функция, которая складывает два числа, может быть определена следующим образом:

function sum(a, b) {

return a + b;

}

А чтобы ее вызвать, необходимо написать:

sum(2, 5);

Как результат выполнения функции будет возвращено число 7.

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

function hello(name) {

return "Привет, " + name + "!";

}

А чтобы ее вызвать и вывести на экран приветствие для определенного имени, необходимо написать:

alert(hello("Петя"));

Как результат выполнения функции будет выведено сообщение «Привет, Петя!».

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

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

Создание функции

Функция — это основная конструкция в JavaScript, которая позволяет выполнять повторяющиеся действия в коде. Она позволяет определить блок кода, который может быть вызван в любой момент с любыми параметрами.

Для создания функции используется ключевое слово function, за которым идет имя функции и параметры, если они есть, в круглых скобках. Тело функции заключается в фигурные скобки и содержит код, который будет выполняться при вызове функции.

Например, следующая функция принимает два аргумента и возвращает их сумму:

function sum(a, b) {

return a + b;

}

Для вызова функции нужно указать ее имя и передать значения аргументов в круглых скобках:

var x = sum(3, 4);

// x будет равен 7

Функции в JavaScript могут быть очень полезными для организации повторяющегося кода и более эффективной разработки. Не бойтесь экспериментировать и создавать свои собственные функции!

Передача параметров в функцию

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

Каждая функция в JavaScript может принимать определенное количество параметров. Для того чтобы задать параметры для функции, необходимо указать их в скобках после имени функции. Например:

function myFunction(param1, param2) {

//действия, выполняемые при вызове функции

}

Каждый параметр, указанный в скобках, разделяется запятой. В самой функции параметры могут использоваться для выполнения необходимых действий.

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

myFunction("значение1", 2);

В данном примере в первый параметр будет передана строка «значение1», а во второй параметр – число 2.

Количество передаваемых параметров может быть любым и зависит от требуемой функциональности. Также возможна передача параметров с помощью массивов и объектов, что существенно расширяет возможности функций в JavaScript.

Возврат значения из функции

Функции являются одним из основных элементов в языке программирования JavaScript, которые используются для повторного использования кода и упрощения программирования. Эти функции могут использоваться для вычисления значений, манипуляции данными и много другого.

В JavaScript функции могут быть определены с помощью ключевого слова “function”. Одним из наиболее важных аспектов функций является возможность возврата значения. Возврат значения из функции может быть выполнен при помощи ключевого слова “return”.

Когда функция вызывается, все операторы, находящиеся после ключевого слова “return” не выполняются, а значение, указанное после этого оператора, передается в качестве результата выполнения функции.

Например, следующий код возвращает сумму двух аргументов в функции:

function myFunction(a, b) {

return a + b;

}

myFunction(3, 4); // 7

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

FAQ

Какая основная сложность в решении задач на JavaScript для начинающих?

Основная сложность заключается в том, что начинающие программисты еще не сформировали привычку думать алгоритмически. Перед тем, как приступать к решению задач, необходимо разбить задачу на мелкие этапы и продумать каждый этап. Также необходимо освоить базовый синтаксис языка.

Можно ли решать задачи на JavaScript без знания английского языка?

Да, можно. Однако, большинство материалов для изучения JavaScript находится на английском языке, поэтому знание основного английского языка облегчит процесс изучения. В любом случае, когда вы столкнетесь с непонятным термином, всегда можно воспользоваться поиском в интернете.

Как решать задачи на JavaScript, если мне никогда не приходилось программировать раньше?

Рекомендуется начать изучать базовый синтаксис языка, а после этого переходить к изучению алгоритмического мышления и структур данных. Для начала можно решать простые задачи, которые будут помогать вам улучшать навыки и развивать логическое мышление. Важно помнить, что практика — ключ к успеху в программировании.

Какие основные инструменты нужны для решения задач на JavaScript?

Основные инструменты для решения задач на JavaScript — это текстовый редактор, в котором вы будете писать код, и браузер для проверки работоспособности кода. Для начала можно воспользоваться стандартными инструментами, которые есть на компьютере, а после этого изучить различные IDE и фреймворки, которые помогают ускорить и упростить процесс разработки.

Как часто нужно решать задачи на JavaScript, чтобы стать хорошим программистом?

Чтобы стать хорошим программистом, нужно постоянно совершенствовать свои навыки и учиться новому. Решение задач на JavaScript — это отличный способ накапливать опыт и развивать логическое мышление. Рекомендуется заниматься программированием и решать задачи на JavaScript постоянно, чтобы постепенно достигнуть высокого уровня владения языком.

Ссылка на основную публикацию
Adblock
detector