Задача №5 - Число в обратном порядке

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

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

Дано некоторое число длиной от 1 до 5 цифр - вывести его цифры в обратном порядке

Мое решение:

<?php
$a = rand(10000, 99999);
echo $a . '<br>';
while ($a>1){
    $b = $a % 10;
    echo $b . '<br>';
    $a = $a / 10;
}

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

melisa's picture

  1. переменную $b вводить не обязательно, можно выводить на экран результат выражения
  2. Дано некоторое число длиной от 1 до 5 цифр

    - это условие. У Вас только числа длиной 5 цифр

1. Да, я понимаю что переменную b выводить не обязательно, но для наглядности и проверки корректности работы кода я ее выводил

2. Да, согласен... мне надо внимательнее читать условия задачи... исправился, параллельно обернув все в функцию

<?php
function reverse ($n){
    while ($n>1){
        $b = $n % 10;
        echo $b . '<br>';
        $n = $n / 10;
    }
}
reverse(rand(1, 99999));
melisa's picture

не "выводить на экран", а "вводить в использование".
На экран выводить числа, конечно, надо - это написано в задании. Имелось ввиду, что не обязательно присваивать значение переменной, чтобы вывести её на экран, можно написать короче:

while ($n>1){
        echo $n % 10 . '<br>';
        $n = $n / 10;
    }

Но на результат это никак не влияет, это не ошибка.

Кстати, запись

$n = $n / 10;

тоже можно сократить.

А вот насчёт ошибок:
0 и 1 тоже числа, и хотят, чтобы их посчитали)

vedro-compota's picture

0 и 1 тоже числа, и хотят, чтобы их посчитали)

норм)

_____________
матфак вгу и остальная классика =)

Поправил код, вот он:

<?php
function reverse ($n){
    while ($n>=1){
        echo $n % 10 . '<br>';
        $n /= 10;
    }
}
$a = rand(1, 99999);
echo 'Дано число ' . $a . '<br>';
reverse($a);

Не понял вот что:

0 и 1 тоже числа, и хотят, чтобы их посчитали)

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

melisa's picture

Дело в том, что в программировании крайне важно охватывать своим вниманием все возможные значения, которые могут прийти в качестве аргументов в функцию. Потому что попадание неожидаемого значения вызовет ошибку, что в реальной программе означает "падение" скрипта, а значит, сбой программы. Это ошибка в браузере, сбой в подсчёте чьих-то финансов или даже чьего-то пульса. Короче, абсолютно неприемлимо.

0 и 1 в данном случае прийти могут, т.к. они тоже числа от 1 до 5 знаков длиной.

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

Вот код:

<?php
function reverse ($n){
    while ($n >= 0){
        echo $n % 10 . '<br>';
        $n /= 10;
        $n = (int) $n;
        if ($n == 0) {
            break;
        }
    }
}
$a = rand(1, 99999);
echo 'Дано число ' . $a . '<br>';
reverse($a);

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

Попробовал исправиться!

melisa's picture

Решение рабочее. Но не очевидное. Это значит, что программист, который будет поддерживать ваш код, задумается: "А зачем это $n приводится к int? Тут какая-то магия.." И начнёт отлаживать...

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

if ($n == 0) {
   echo $n;
}
while ($n >= 1){
    echo $n % 10 . '<br>';
    $n /= 10; 
}

Вот код:

<?php
function reverse ($n){
    if ($n == 0){
        echo $n . '<br>';
    }
    while ($n >= 0){
        echo $n % 10 . '<br>';
        $n /= 10;
    }
}
$a = rand(1, 99999);
echo 'Дано число ' . $a . '<br>';
reverse($a);

Chrome пишет: 502 Bad Gateway

Рабочий код:

<?php
function reverse ($n){
    if ($n == 0){
        echo $n . '<br>';
    }
    while ($n >= 1){
        echo $n % 10 . '<br>';
        $n /= 10;
    }
}
$a = rand(1, 99999);
echo 'Дано число ' . $a . '<br>';
reverse($a);
melisa's picture

принято