Учебные задачи PHP. Задача 5

Дано некоторое число длиной от 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>";
}
?>

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

melisa's picture

  1. везде неверные отступы для закрывающей фигурной скобки
  2. Наличие этой строчки в теле функции делает ее вывод два раза (пока не понял, почему)

    Потому что Вы дважды вызываете функцию. Проверяйте себя. Побудьте как бы сами бездумным интерпретатором, который запускает Ваш код. "Печатайте" значения на листочек, когда встречаете echo. Так всё станет понятнее)

  3. А если, по логике процесса, поставить эту строку после вызова функции, то выходит ошибка PHP Notice: Undefined variable: number in index.php on line 14 =

    Тут всё интереснее. Прочитайте про область видимости функции и напишите сюда ответ: Почему $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>";

Убрал лишний вызов функции:

outputNumberInReverseOrder(3567);

Исправил код задачи, где выходило значение два раза.

<?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>";
}
?>

Исправил код задачи, который выдавал ошибку:

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;    
}
$output = outputNumberInReverseOrder(3567);
echo implode($output), ' = <br>';

foreach ($output as $value) {
	echo $value. '<br>';
}
?>
melisa's picture

  1. Про область видимости прочитал. Ранее тоже читал. Спасибо за ссылку

    Хорошо, Вы поняли, почему переменная $number была не определена в строке 14? Напишите в двух словах.

  2. echo implode($output), ' = <br>';

    Отлично)))) Вы получаете в результате массив и его же печатаете, как будто он был дан))

    У тебя никогда не будет ошибки, если заменить условие на то, что ты получил ;)

    Так не пойдёт) Если уж выводите на экран изначальное число, то выводите ИМЕННО ЕГО.
    Это важная ошибка с точки зрения алгоритмизации.

  3. Код неверно отрабатывает, если передать функции значения 0, 1 или 10. Поправьте.

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

melisa's picture

В первом случае функция оказывает побочный эффект в виде печати на экран.

Я понимаю, Вам это ближе, потому что с Вашей точки зрения сейчас это скорее "основной эффект" - основная задача :) НО задача любой функции - возвращать значение (чтобы в дальнейшем его где-то использовать). Вывод на экран нужен нам только для наглядности, для самопроверки.

Хорошая новость: в реальном приложении Вы быстро разберётесь в этом вопросе, т.к. оно просто работает по-другому.
Сейчас, в учебных задачах, это не критично.

Тут всё интереснее. Прочитайте про область видимости функции и напишите сюда ответ: Почему $number в данном случае undefined(не определена)?

Потому что она является локальной переменной. Основной код является глобальным пространством. В этом пространстве глобальная переменная $number не объявлена, поэтому выходит сообщение:

Undefined variable: number in index.php on line 14 =

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's picture

всё верно

<?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's picture

  1. $remOfDiv_arr

    переделайте на camelCase

  2. function outNumbInRevOrd

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

  3. Если передать в функцию 0, получите ошибку
    E_NOTICE : type 8 -- Undefined variable: remOfDiv_arr -- at line 8
vedro-compota's picture

Я рассчитывал на то, что, если происходит вызов функции, то локальная переменная будет "видна" в глобальном пространстве, т.е. в основном коде.

вызов обычной функции может либо вернуть значение (надо присвоить другому значению которое уже есть в вашем пространстве) либо изменить какое-то значение по ссылке, либо и то и то одновременно, но в общем случае функция не может добавить никакое имя (переменную) в область пространства.

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

Если передать в функцию 0, получите ошибку

А условие задачи предусматривает один сам по себе "0" ?

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

переделайте на camelCase

нет смысла сокращать слова в названиях.

Переделал код:

<?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>';
}
?>

<?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>';
}
?>