Задача 5: Вывод чисел числа в обратном порядке - Учебные задачи PHP - Обсуждение решения
Primary tabs
Дано некоторое число длиной от 1 до 5 цифр - вывести его цифры в обратном порядке.
<?php
function outputNumberInReverseOrder($number)
{
echo $number, " = <br>";
while ($number > 1) {
$remainderOfDivision = $number % 10;
$numberDividedBy10 = $number / 10;
echo $remainderOfDivision, "<br>";
$number = $numberDividedBy10;
}
}
outputNumberInReverseOrder(3567);
?>Еще вариант решения задачи с использованием массива. Но есть замечание. Наличие этой строчки в теле функции делает ее вывод два раза (пока не понял, почему):
echo $number, " = <br>";
<?php
function outputNumberInReverseOrder($number)
{
echo $number, " = <br>";
while ($number > 1) {
$remainderOfDivision = $number % 10;
$remainderOfDivision_arr[] = $remainderOfDivision;
$numberDividedBy10 = $number / 10;
$number = $numberDividedBy10;
}
return $remainderOfDivision_arr;
}
outputNumberInReverseOrder(3567);
$output = outputNumberInReverseOrder(3567);
foreach ($output as $value) {
echo $value. "<br>";
}
?>А если, по логике процесса, поставить эту строку после вызова функции, то выходит ошибка:
PHP Notice: Undefined variable: number in index.php on line 14 =
<?php
function outputNumberInReverseOrder($number)
{
while ($number > 1) {
$remainderOfDivision = $number % 10;
$remainderOfDivision_arr[] = $remainderOfDivision;
$numberDividedBy10 = $number / 10;
$number = $numberDividedBy10;
}
return $remainderOfDivision_arr;
}
outputNumberInReverseOrder(3567);
$output = outputNumberInReverseOrder(3567);
echo $number, " = <br>";
foreach ($output as $value) {
echo $value. "<br>";
}
?>- Log in to post comments
- 22020 reads
melisa
Wed, 04/17/2019 - 11:05
Permalink
замечания
Потому что Вы дважды вызываете функцию. Проверяйте себя. Побудьте как бы сами бездумным интерпретатором, который запускает Ваш код. "Печатайте" значения на листочек, когда встречаете echo. Так всё станет понятнее)
Тут всё интереснее. Прочитайте про область видимости функции и напишите сюда ответ: Почему $number в данном случае undefined(не определена)?
function outputNumberInReverseOrder($number) { while ($number > 1) { $remainderOfDivision = $number % 10; $remainderOfDivision_arr[] = $remainderOfDivision; $numberDividedBy10 = $number / 10; $number = $numberDividedBy10; } return $remainderOfDivision_arr; } outputNumberInReverseOrder(3567); $output = outputNumberInReverseOrder(3567); echo $number, " = <br>";Laven
Thu, 04/18/2019 - 12:16
Permalink
Исправил код задачи
Убрал лишний вызов функции:
Исправил код задачи, где выходило значение два раза.
<?php function outputNumberInReverseOrder($number) { echo $number, " = <br>"; while ($number > 1) { $remainderOfDivision = $number % 10; $remainderOfDivision_arr[] = $remainderOfDivision; $numberDividedBy10 = $number / 10; $number = $numberDividedBy10; } return $remainderOfDivision_arr; } $output = outputNumberInReverseOrder(3567); foreach ($output as $value) { echo $value. "<br>"; } ?>Laven
Thu, 04/18/2019 - 14:24
Permalink
Исправил код задачи
Исправил код задачи, который выдавал ошибку:
Про область видимости прочитал. Ранее тоже читал. Спасибо за ссылку.
<?php function outputNumberInReverseOrder($number) { while ($number > 1) { $remainderOfDivision = $number % 10; $remainderOfDivision_arr[] = $remainderOfDivision; $numberDividedBy10 = $number / 10; $number = $numberDividedBy10; } return $remainderOfDivision_arr; } $output = outputNumberInReverseOrder(3567); echo implode($output), ' = <br>'; foreach ($output as $value) { echo $value. '<br>'; } ?>melisa
Thu, 04/18/2019 - 15:33
Permalink
Про область видимости
Хорошо, Вы поняли, почему переменная $number была не определена в строке 14? Напишите в двух словах.
Отлично)))) Вы получаете в результате массив и его же печатаете, как будто он был дан))
Так не пойдёт) Если уж выводите на экран изначальное число, то выводите ИМЕННО ЕГО.
Это важная ошибка с точки зрения алгоритмизации.
Laven
Thu, 04/18/2019 - 14:27
Permalink
Мне, с точки зрения
Мне, с точки зрения разработчика, ближе код № 1, т.к. результат достигается простым вызовом функции без дополнительных действий.
Насколько верно мое мнение, прошу проверяющих товарищей прокомментировать.
melisa
Thu, 04/18/2019 - 15:55
Permalink
побочный эффект
В первом случае функция оказывает побочный эффект в виде печати на экран.
Я понимаю, Вам это ближе, потому что с Вашей точки зрения сейчас это скорее "основной эффект" - основная задача :) НО задача любой функции - возвращать значение (чтобы в дальнейшем его где-то использовать). Вывод на экран нужен нам только для наглядности, для самопроверки.
Хорошая новость: в реальном приложении Вы быстро разберётесь в этом вопросе, т.к. оно просто работает по-другому.
Сейчас, в учебных задачах, это не критично.
Laven
Thu, 04/18/2019 - 20:49
Permalink
Область видимости функции
Потому что она является локальной переменной. Основной код является глобальным пространством. В этом пространстве глобальная переменная $number не объявлена, поэтому выходит сообщение:
function outputNumberInReverseOrder($number) { while ($number > 1) { $remainderOfDivision = $number % 10; $remainderOfDivision_arr[] = $remainderOfDivision; $numberDividedBy10 = $number / 10; $number = $numberDividedBy10; } return $remainderOfDivision_arr; } outputNumberInReverseOrder(3567); $output = outputNumberInReverseOrder(3567); echo $number, " = <br>";Я рассчитывал на то, что, если происходит вызов функции, то локальная переменная будет "видна" в глобальном пространстве, т.е. в основном коде.
melisa
Fri, 04/19/2019 - 12:04
Permalink
всё верно
всё верно
Laven
Thu, 04/18/2019 - 21:50
Permalink
Исправил код задачи
<?php function outNumbInRevOrd($num) { while ($num >= 1) { // цикл принимает значение истина, пока число >= 1 $remOfDiv_arr[] = $num % 10; // в массив заносим очередной остаток от деления числа на 10 $num = $num / 10; // делим текущее число на 10 и присваиваем новое значение переменной "$num" } return $remOfDiv_arr; } $num = 1000; // задаем любое число >= 1 $output = outNumbInRevOrd($num); // вызов функции присваиваем переменной $output echo "$num = <br>"; // выводим заданное число foreach ($output as $value) { // обходим массив и выводим это число в обр порядке echo $value. '<br>'; } ?>melisa
Fri, 04/19/2019 - 13:59
Permalink
$remOfDiv_arr переделайте на
переделайте на camelCase
нет смысла сокращать слова в названиях. названия должны нести в себе смысл, который должен быть понятен человеку, который видит Ваш код впервые. а вот в длинном названии нет ничего страшного, если, конечно, оно от этого понятнее
vedro-compota
Thu, 04/18/2019 - 22:01
Permalink
какие имена были - те и останутся
вызов обычной функции может либо вернуть значение (надо присвоить другому значению которое уже есть в вашем пространстве) либо изменить какое-то значение по ссылке, либо и то и то одновременно, но в общем случае функция не может добавить никакое имя (переменную) в область пространства.
_____________
матфак вгу и остальная классика =)
Laven
Fri, 04/19/2019 - 20:41
Permalink
Исправил замечания
А условие задачи предусматривает один сам по себе "0" ?
Переделал код:
<?php function outputNumberInReverseOrder($number) { while ($number >= 1) { // цикл принимает значение истина, пока число >= 1 $remainderOfDivisionArr[] = $number % 10; // в массив заносим очередной остаток от деления числа на 10 $number = $number / 10; // делим текущее число на 10 и присваиваем новое значение переменной "$num" } return $remainderOfDivisionArr; } $number = 1000; // задаем любое число >= 1 $output = outputNumberInReverseOrder($number); // вызов функции присваиваем переменной $output echo "$number = <br>"; // выводим заданное число foreach ($output as $value) { // обходим массив и выводим это число в обр порядке echo $value. '<br>'; } ?>melisa
Tue, 04/23/2019 - 11:37
Permalink
Принято
Согласна, не предусматривает)
Принято
Laven
Sat, 04/20/2019 - 11:06
Permalink
Вариант кода в случае варианта $number = 0
<?php function outputNumberInReverseOrder($number) { $remainderOfDivisionArr = []; while ($number >= 1) { // цикл принимает значение истина, пока число >= 1 if ($number == 0) { // если $number == 0, то ф-ия выведет "0 = " $remainderOfDivisionArr[] = 0; // либо поставить '= null' } else { $remainderOfDivisionArr[] = $number % 10; // в массив заносим очередной остаток от деления числа на 10 $number = $number / 10; // делим текущее число на 10 и присваиваем новое значение переменной "$num" } } return $remainderOfDivisionArr; } $number = 0; // задаем любое число >= 0 $output = outputNumberInReverseOrder($number); // вызов функции присваиваем переменной $output echo "$number = <br>"; // выводим заданное число foreach ($output as $value) { // обходим массив и выводим это число в обр порядке echo $value. '<br>'; } ?>melisa
Tue, 04/23/2019 - 11:43
Permalink
но раз уж Вы этот вариант выложили
но раз уж Вы этот вариант выложили тоже, прокомментирую его.
это условие никогда не будет выполнено, т.к. находится внутри условия
а должна "0 = 0"
} else { $remainderOfDivisionArr[] = $number % 10; // в массив заносим очередной остаток от деления числа на 10 $number = $number / 10; // делим текущее число на 10 и присваиваем новое значение переменной "$num" }проблема с отступами
Laven
Tue, 04/23/2019 - 12:22
Permalink
Исправил код задачи
<?php function outputNumberInReverseOrder($number) { $remainderOfDivisionArr = []; if ($number == 0) { // если $number == 0, то ф-ия выведет "0 = " $remainderOfDivisionArr[] = 0; // либо поставить '= null' } else { while ($number >= 1) {//цикл принимает значение истина, пока число >= 1 $remainderOfDivisionArr[] = $number % 10; // в массив заносим очередной остаток от деления числа на 10 $number = $number / 10; // делим текущее число на 10 и присваиваем новое значение переменной "$num" } } return $remainderOfDivisionArr; } $number = 0; // задаем любое число >= 0 $output = outputNumberInReverseOrder($number); // вызов функции присваиваем переменной $output echo "$number = <br>"; // выводим заданное число foreach ($output as $value) { // обходим массив и выводим это число в обр порядке echo $value. '<br>'; } ?>melisa
Tue, 04/23/2019 - 12:23
Permalink
принято
принято