Задача №6 - Вывести в обратной последовательности только нечетные цифры

Задачи №6 из этого списка:

Условие задачи:

Дано некоторое число длиной от 1 до 5 символов, вывести все его "нечётные" цифры в обратном порядке (аналогично предыдущей задаче), если же таких цифр не найдёт, вывести сообщение "Нечетных цифр не обнаружено!"

Мое решение:

<?php
$a = rand(10000, 99999);
echo $a . '<br>';
global $i;
$i = 0;
while ($a>1){
    $b = $a % 10;
    if ($b % 2 > 0) {
        echo $b . '<br>';
        $i = $i + 1;
    }
    $a = $a / 10;
}
if ($i == 0) {
    echo 'Нечетных цифр не обнаружено!' . '<br>';
}

Key Words for FKN + antitotal forum (CS VSU):

melisa's picture

  1. global $i;

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

  2. $a = rand(10000, 99999);
    Дано некоторое число длиной от 1 до 5 символов
  3. $i = $i + 1;
    $a = $a / 10;

    Используйте сокращённую запись при операции переменной над собой же.

Вот исправленный код:

<?php
$a = rand(1, 99999);
echo $a . '<br>';
while ($a>=1){
    $b = $a % 10;
    if ($b % 2 > 0) {
        echo $b . '<br>';
        $i++;
    }
    $a /= 10;
}
if ($i == 0) {
    echo 'Нечетных цифр не обнаружено!' . '<br>';
}

Ответы:
1. По поводу global:
не целесообразно использовать как в том месте где я его использовать, так и внутри цикла while... но мне не совсем понятно почему... мы же операции с i проводим внутри цикла while, потом выходим из while, заходим в if и там i все равно видно... как так? Где магия?

2. Код поправил... sorry... я буду внимательнее... я буду внимательнее... я буду внимательнее (повторял Олег еще очень-очень долго) ))))))

3. Сокращенную запись начинаю использовать, но т.к. я её только начинаю использовать она мне кажется такой не удобной, такой не информативной... но надо ломать стереотипы )))

melisa's picture

  1. <?php
    $a = rand(1, 99999);
    echo $a . '<br>';
    while ($a>=1){
        $b = $a % 10;
        if ($b % 2 > 0) {
            echo $b . '<br>';
            $i++;
        }
        $a /= 10;
    }
    if ($i == 0) {
        echo 'Нечетных цифр не обнаружено!' . '<br>';
     }

    Вы свсем удалили объявление $i - это намеренно или случайно? Это вызывает ошибку. Я имела ввиду, что нецелесообразно использовать слово global, а объявить надо.

  2. мы же операции с i проводим внутри цикла while, потом выходим из while, заходим в if и там i все равно видно... как так? Где магия?

    Прочитайте про области видимости переменных. Область видимости внутри циклов и операторов не меняется. Где область видимости была бы другая?

Где область видимости была бы другая?

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

Исходя из логики, замечаний и исправлений прошлой задачи поправил код:

<?php
function reversUnevenPrint ($x)
{
    $i = 0;
    while ($x >= 0) {
        $b = $x % 10;
        if ($b % 2 > 0) {
            echo $b . '<br>';
            $i++;
        }
        $x /= 10;
        $x = (int)$x;
        if ($x == 0) {
            break;
        }
    }
    if ($i == 0) {
        echo 'Нечетных цифр не обнаружено!' . '<br>';
    }
}
$a = rand(1, 99999);
echo $a . '<br>';
reversUnevenPrint($a);
melisa's picture

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

Нет. Область видимости связана с понятем функции. Но не с циклами или телами операторов. Область видимости внутри функции отличается от глобальной.

Это значит, что всё, что Вы объявили внутри функции доступно только внутри функции. Всё, что Вы объявили вне функции, в ней не доступно.
Всё, что объявлено глобально, видно и в цикле, и в теле оператора if.

Это по умолчанию. Исключения есть, например, передача переменных по ссылке или обращение к глобальным переменным.

melisa's picture

но обратите внимание снова на неочевидность:

    $x = (int)$x;
    if ($x == 0) {
        break;
    }

Уже писала об этом здесь.