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

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

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

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

<?php

function getEvenNumbersUpTo($num)
{

}

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

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

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

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

<?php

function getEvenNumbersUpTo($num)
{
    $counter = 1;
    $result = '';

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

    return $result;
}

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

Запустим:

print_r(getEvenNumbersUpTo(5));
1234

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

while ($counter !== $num)

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

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

<?php

function getEvenNumbersUpTo($num)
{
    $counter = 1;
    $result = '';

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

    return $result;
}

Запустим:

print_r(getEvenNumbersUpTo(5));
12345

Ура!

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

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

<?php

function getEvenNumbersUpTo($num)
{
    $counter = 1;
    $result = '';

    while ($counter <= $num) {
        if ($counter % 2 === 0){
            $result = $result . $counter;
        }

        $counter += 1;
    }

    return $result;
}

Запустим:

print_r(getEvenNumbersUpTo(5));
24
print_r(getEvenNumbersUpTo(9));
2468

Работает!

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

Задание

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

2,4,6,8,

Задание со звёздочкой

Попробуйте самостоятельно на https://repl.it/ реализовать такое решение, чтобы после последнего числа не было запятой, но была точка:

print_r(getEvenNumbersUpTo(9));
2,4,6,8.

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

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