Циклы и условия 2

Пример 2: Условие внутри цикла

Задача: написать функцию getEvenNumbersUpTo, которая принимает число и возвращает в виде строки все чётные числа от 1 до этого числа включительно.

Начнём писать функцию:

static String getEvenNumbersUpTo(int num) {

}

Нам нужен цикл для сбора чисел от 1 до num, но не всех чисел, а только чётных.

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

Попробуем для начала решить более простую задачу: пусть функция на самом деле возвращает все числа от 1 до num.

Делаем всё как обычно — счётчик, цикл, обновление счётчика:

static String getEvenNumbersUpTo(int num) {
  var counter = 1;
  var result = "";

  while (counter != $num) {
    result +=counter;
    counter += 1;
  }

  return result;
}

Счётчик counter выполняет сразу две задачи: отслеживает количество повторений и является тем числом, которое нужно вывести на экран.

Запустим:

System.out.print(getEvenNumbersUpTo(5));
1234

Работает, но не до конца: последнее число не вывелось. Видимо, цикл работает, но останавливается на один шаг раньше, чем нам нужно. Завершение цикла зависит от предиката в while, давайте посмотрим на него внимательнее:

while (counter != $num)

«Пока счётчик не равен num». Получается, когда счётчик равен num, цикл уже не исполняется. Но нам нужно чтобы он исполнился ещё один раз, когда счётчик равен num, а потом уже остановился.

Предикат нужно изменить на «пока счётчик меньше или равен num»:

static String getEvenNumbersUpTo(int num) {
  var counter = 1;
  var result = "";

  while (counter <= num) {
    result += counter;
    counter += 1;
  }

  return result;
}

Запустим:

System.out.print(getEvenNumbersUpTo(5));
12345

Ура!

Теперь вернёмся к начальной задаче: возвращать нужно только чётные числа. Иными словами, если число чётное — то добавлять его в результат, в ином случае — ничего не делать.

Значит, нужно условие с if прямо в теле цикла. В том месте, где мы делали добавление числа в строку-результат, нужно добавить условие:

public static String getEvenNumbersUpTo(int num) {
  var counter = 1;
  var result = "";

  while (counter <= num) {
    if (counter % 2 == 0) {
      result += counter;
    }
    counter += 1;
  }

  return result;
}

Запустим:

System.out.print(getEvenNumbersUpTo(5));
24
System.out.print(getEvenNumbersUpTo(9));
2468

Работает!

Несмотря на то, что циклом мы проходим по всем числам от 1 до num, благодаря условию добавление в строку-результат происходит только для чётных. Счётчик же увеличивается в любом случае на каждом шагу.

Задание

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

2,4,6,8,

Нашли ошибку? Есть что добавить? Пулреквесты приветствуютсяhttps://github.com/hexlet-basics

Упражнение доступно только авторизованным пользователям.

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