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

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

<?php 
$min = -21; // мин число заданного диапазона
$max = 35; // макс число заданного диапазона
$n = 7; // число итераций цикла
$value  = 0;
$value_1  = 0;
for ($i = 0; $i < 1; $i ++) // для вывода первой строчки без сравнения
{	
	$value = rand( $min , $max );
	echo "$value  <br>";
}
for ($i = 1; $i < $n; $i ++)
{
    $value = rand( $min , $max );
	if ($value_1 == $value) // если два числа равны, то выйдет слово "равно"
		echo "$value_1  равно  $value <br>";
	else
	{{
		if ($value_1 > $value) // условие для сравнения чисел
			echo "$value_1  больше  $value <br>";
		else
			echo "$value_1  меньше  $value <br>";
	}
		$value_1 = $value;
	}
}
?>

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

vedro-compota's picture

for ($i = 0; $i < 1; $i ++) // для вывода первой строчки без сравнения
{   
    $value = rand( $min , $max );
    echo "$value  <br>";
}

-- этого по условию задачи быть не должно

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

Другого способа я не нашел, чтобы в первой строчке не было сравнения.

vedro-compota's picture

первый ваш цикл вообще не имеет никакого отношения к решению задачи
вы просто в нем выводите случайные значения.

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

Обратите внимание, циклы разные:
1-й:

for ($i = 0; $i < 1; $i ++)

2-й:

for ($i = 1; $i < $n; $i ++)
vedro-compota's picture

Обратите внимание, циклы разные:

а, понял вас, если итерация всего одна - зачем тогда цикл? просто и выводите до основного цикла.

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

vedro-compota's picture

{{

откуда двойные фигурные скобки? уберите их, используйте просто

...else if() {....} else if () {...}

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

Двойные скобки появились, потому что нужно было это действие совершить в случае else:

$value_1 = $value;
vedro-compota's picture

else
    {{
        if ($value_1 > $value) // условие для сравнения чисел
            echo "$value_1  больше  $value <br>";
        else
            echo "$value_1  меньше  $value <br>";
    }
        $value_1 = $value;
    }

абсолютно ничем не отличается от:

else
    {
        if ($value_1 > $value) // условие для сравнения чисел
            echo "$value_1  больше  $value <br>";
        else
            echo "$value_1  меньше  $value <br>";
   
        $value_1 = $value;
    }

-- почему не отличается мы уже говорили.

Также вы опять не следуете стандартам оформления - ветки if должны всегда окружаться фигурными скобками вне зависимости от числа операций в них.

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

Нужно ставить скобки только так?

   else
    {
        if ($value_1 > $value) // условие для сравнения чисел
		{    
			echo "$value_1  больше  $value <br>";
		}
        else
		{
            echo "$value_1  меньше  $value <br>";
		}
        $value_1 = $value;
    }

<?php 
$min = -21; // мин число заданного диапазона
$max = 35; // макс число заданного диапазона
$n = 7; // число итераций цикла
$value  = 0;
$value_1  = 0;

$value = rand( $min , $max );
    echo "$value  <br>";

for ($i = 1; $i < $n; $i ++)
{
    $value = rand( $min , $max );
    if ($value_1 == $value) // если два числа равны, то выйдет слово "равно"
        echo "$value_1  равно  $value <br>";
    else
    {
        if ($value_1 > $value) // условие для сравнения чисел
		{
			echo "$value_1  больше  $value <br>";
		}
        else
		{
			echo "$value_1  меньше  $value <br>";
		}
        $value_1 = $value;
    }
}
?>

Здравствуйте. Насколько целесообразно данную задачу выполнять в виде функции?

<pre><?php
function rand_om ($n, $min, $max)
{
    $n = (int)$n;
   	//$value = array();
	$value_1 = 0;
	$value = rand( $min , $max );
    echo "$value  <br>";
		
		for ($i = 1; $i < $n; $i ++)
        {
            $value = rand ($min, $max);
			if ($value_1 == $value) // если два числа равны, то выйдет слово "равно"
				echo "$value_1  равно  $value <br>";
			else
			{
				if ($value_1 > $value) // условие для сравнения чисел
				{
					echo "$value_1  больше  $value <br>";
				}
				else
				{
					echo "$value_1  меньше  $value <br>";
				}
				$value_1 = $value;
			}
        }	
    //return $value;
}
$a =  rand_om(5, -5, 7);
echo $a;
?>
melisa's picture

  1. $n = (int)$n;

    эта строка лишняя. В php типы приводятся динамически. Прочитайте про это здесь.

  2. //$value = array();

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

  3. $value_1 = 0;

    Такого в условии задачи нет. Все значения должны быть случайными.

  4. $value = rand( $min , $max );

    Вызывается дважды. Один раз лишний.

  5. Ознакомьтесь со стандартами оформления кода PSR. Следование данному стандарту очень важно. Это обязательное правило в разработке для увеличения читаемости вашего кода другими программистами, и наоборот.

    Перепешите задачу с учётом исправлений.

  6. Также ознакомьтесь с общепринятыми правилами именования сущностей и переименуйте функцию и некоторые переменные, названные в snake_case стиле.
  7. ЗАПУСТИТЕ КОД! Убедистесь, что то, что вы видите на экране соответствует тому, что требовалось в задаче.
    Для того вообще вся песня и писалась (с)

Ваш код не выводит 2 число. Это надо исправить

Не пойму, какое число не выводит? У меня выглядит так:
рис

melisa's picture

что тут непонятного?
-2 - первое число
а дальше? откуда 0?

но проблема оказалась интереснее, читайте пост выше.

соглашусь, не увидел.

Переписал код задачи с оператором elseif. Первый раз использовал этот оператор. Что-то не учел и интерпретатор выдает ошибку:

PHP Parse error: syntax error, unexpected 'echo' (T_ECHO) in index.php on line 14

Как я понял, такая ошибка выходит, в том числе, если забыл поставить ";", но все ";" проставлены.
В чем ошибка?

<?php
function rand_om($n, $min, $max)
{
	$value_1 = NULL;       
	for ($i = 0; $i < $n; $i ++) {
		$value = rand($min, $max);
		if ($i = 0) {	
			echo "$value <br>"; 
		} elseif ($value_1 > $value) {
			echo "$value_1 больше $value <br>";
        } elseif ($value_1 < $value) {
			echo "$value_1 меньше $value <br>";
		} else ($value_1 == $value) { 
			echo "$value_1 равно $value <br>";
        }
         $value_1 = $value;
		}
}   
$rand = rand_om(5, -5, 7);
echo $rand;
?>
melisa's picture

для else условия в скобках не указывают. конструкция else сама по себе означает, что никакие из вышеуказанных условий не выполнены.

<?php
function rand_om($n, $min, $max)
{
    $value_1 = NULL;       
    for ($i = 0; $i < $n; $i ++) {
        $value = rand($min, $max);
        if ($i == 0) {   
            echo "$value <br>"; 
        } elseif ($value > $value_1) {
            echo "$value больше $value_1 <br>";
        } elseif ($value < $value_1) {
            echo "$value меньше $value_1 <br>";
        } elseif ($value == $value_1) { 
            echo "$value равно $value_1 <br>";
        }
         $value_1 = $value;
        }
}   
$rand = rand_om(5, -5, 7);
echo $rand;
?>
melisa's picture

  1. } elseif ($value == $value_1) {

    здесь достаточно else без всяких условий. лучше использовать более простой вариант, если он достаточен для получения результата.

  2. $value_1 = $value;
            }

    здесь лишние отступы

  3. $value_1 = NULL;

    что делает эта строка? и для чего?

  4. Вы не исправили именование сущностей: rand_om, value_1

$value_1 = NULL; 

В какой-то момент не шел код. Выводил ошибку, что не определена переменная. Поэтому, этой переменной я присвоил значение NULL.

Остальные замечания буду устранять.

melisa's picture

и всё-таки на это замечание придётся тоже обратить внимание, т.к. оно не просто так.

в данный момент данная строка лишняя, потому что значение $value_1 требуется только во второй итерации цикла, а присвоение производится в первой итерации. значит - объявлять переменную перед циклом не имеет смысла.

<?php
function randomFunction($n, $min, $max)
{
	for ($i = 0; $i < $n; $i ++) {
		$randomNumberCurrent = rand($min, $max);
        if ($i == 0) {   
            echo "$randomNumberCurrent <br>"; 
        } elseif ($randomNumberCurrent > $randomNumberPrevious) {
            echo "$randomNumberCurrent больше $randomNumberPrevious <br>";
        } elseif ($randomNumberCurrent < $randomNumberPrevious) {
            echo "$randomNumberCurrent меньше $randomNumberPrevious <br>";
        } else { 
            echo "$randomNumberCurrent равно $randomNumberPrevious <br>";
        }
         $randomNumberPrevious = $randomNumberCurrent;
        }
}   
$rand = randomFunction(5, -5, 7);
echo $rand;
?>
melisa's picture

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

echo $rand;

эта строка лишняя

<?php
function randomFunction($number, $min, $max)
{
    for ($i = 0; $i < $number; $i ++) {
        $randomNumberCurrent = rand($min, $max);
        if ($i == 0) {   
            echo "$randomNumberCurrent <br>"; 
        } elseif ($randomNumberCurrent > $randomNumberPrevious) {
            echo "$randomNumberCurrent больше $randomNumberPrevious <br>";
        } elseif ($randomNumberCurrent < $randomNumberPrevious) {
            echo "$randomNumberCurrent меньше $randomNumberPrevious <br>";
        } else { 
            echo "$randomNumberCurrent равно $randomNumberPrevious <br>";
        }
         $randomNumberPrevious = $randomNumberCurrent;
        }
}   
randomFunction(5, -5, 7);
?>

Вопросы:
1. Лишние отступы у меня в коде отсутствуют?
2. Наименование сущностей я сделал корректными?

melisa's picture

  • Лишние отступы у меня в коде отсутствуют?

    нет.
    в 15 и 16 строках есть лишние

  • Наименование сущностей я сделал корректными?

    Да, это уже нормально по форме. А по сути, Вы со временем поёмёте, как удобнее именовать сущности. В целом правило такое: имя переменной отвечает на вопрос "Что лежит внутри", имя функции - на вопрос "Что делает эта функция".

<?php
function randomFunction($number, $min, $max)
{
    for ($i = 0; $i < $number; $i ++) {
        $randomNumberCurrent = rand($min, $max);
        if ($i == 0) {   
            echo "$randomNumberCurrent <br>"; 
        } elseif ($randomNumberCurrent > $randomNumberPrevious) {
            echo "$randomNumberCurrent больше $randomNumberPrevious <br>";
        } elseif ($randomNumberCurrent < $randomNumberPrevious) {
            echo "$randomNumberCurrent меньше $randomNumberPrevious <br>";
        } else { 
            echo "$randomNumberCurrent равно $randomNumberPrevious <br>";
        }
		$randomNumberPrevious = $randomNumberCurrent;
	}
}   
randomFunction(5, -5, 7);
?>
melisa's picture

принято