Учебные задачи PHP. Задача 1 (случайные числа, возврат значений, массивы)

Задача № 1. Вывести на экран N случайных чисел (каждое с новой строки) из диапазона [-21, 35]

Здравствуйте.
Выкладываю решение задачи на рассмотрение. Решил переменной N присвоить значение 10.
Хотел бы решение задачи сделать через функцию, но пока задумок на эту тему нет.

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

while ($iter <= $n)
{
	$value = rand( $min , $max ); // присваиваем переменной $value случайное число из заданного диапазона
	echo "Текущее число: $value <br>";	// выводим полученное число
	$iter += 1; // счетчик
}
?>





vedro-compota's picture

ссылку на список задач добавляйте (тут и в следующих задачках)

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

Добавил ссылку в условие задачи.

vedro-compota's picture

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

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

Решил. Но перед этим столкнулся с тем, что,
если в строке с циклом for (...) поставить в конце ";",
то будет выводить только одну строку с ответом. Интересно, почему?
П.С. Понятно, что по синтаксически эта запись не верна,
но интересно, что код не выдает ошибку, а выполняет его частично.

НЕВЕРНЫЙ вариант:

<?php 
$min = -21; // мин число заданного диапазона
$max = 35; // макс число заданного диапазона
$n = 10; // число итераций цикла
for ($iter = 0; $iter < $n; $iter ++);
//while ($iter <= $n)
{
    $value = rand( $min , $max ); // присваиваем переменной $value случайное число из заданного диапазона
    echo "Текущее число: $value <br>";    // выводим полученное число
}
?>

ВЕРНЫЙ вариант.

<?php 
$min = -21; // мин число заданного диапазона
$max = 35; // макс число заданного диапазона
$n = 10; // число итераций цикла
for ($iter = 0; $iter < $n; $iter ++)
//while ($iter <= $n)
{
    $value = rand( $min , $max ); // присваиваем переменной $value случайное число из заданного диапазона
    echo "Текущее число: $value <br>";    // выводим полученное число
}
?>
vedro-compota's picture

Хотел бы решение задачи сделать через функцию, но пока задумок на эту тему нет.

Изучите эту заметку: http://fkn.ktu10.com/?q=node/10809 Если будет непонятно уточните что именно неясно.

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

Здравствуйте. Просмотрел заметку по ссылке о том как сделать задачу через функцию. Сделал вот так:

<?php 
function rand_om($n)
{
$min = -21; // мин число заданного диапазона
$max = 35; // макс число заданного диапазона
//$n = 10; // число итераций цикла
for ($iter = 0; $iter < $n; $iter ++)
{
    $value = rand( $min , $max ); // присваиваем переменной $value случайное число из заданного диапазона
    echo "Текущее число: $value <br>"; // выводим полученное число
}}
rand_om(10);
?>

Единственное, в заметке сказано, что не очень хорошо, что вывод значений делается изнутри функции. Как сделать вывод значений снаружи функции мне пока непонятно. Натолкните на мысль, пожалуйста.

Подумал, и, вроде, вот, получилось:

<?php 
function rand_om($n)
{
$min = -21; // мин число заданного диапазона
$max = 35; // макс число заданного диапазона
//$n = 10; // число итераций цикла
for ($iter = 0; $iter < $n; $iter ++)
{
    $value = rand( $min , $max ); // присваиваем переменной $value случайное число из заданного диапазона
    echo "Текущее число: $value <br>";    // выводим полученное число
}
return $value;
}
rand_om(10);
?>

Хотя нет, вывод значения идет также изнутри функции.

vedro-compota's picture

  1. Тело функции хочет чтобы его отодвинули на ТАБ
  2. вывод значений делается изнутри функции. Как сделать вывод значений снаружи функции мне пока непонятно. Натолкните на мысль, пожалуйста.

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

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

vedro-compota's picture

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

  • Чтобы вернуть массив из тела функции вам надо его сначала там заполнить (случайными значениями)
  • После того как вы получили массив снаружи (вызвав), его можно обойти, выводя в каждом витке очередной элемент.

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

<?php 
/**
 * array_fill_rand($limit, $min=false, $max=false)
 * Функция генерирует массив заполненный случайными числами из заданного диапазона
 * @param int limit - количество элементов массива
 * @param int min - минимальное значение элемента массива (необязательное знач)
 * @param int max - максимальное значение (необязательное знач)
 * @return array
 */
function array_fill_rand($n)
{
	$min = -21; // мин число заданного диапазона
	$max = 35; // макс число заданного диапазона
	//$n = 10; // число итераций цикла и выводимых чисел из массива
	$n = (int)$n;
	$array = array();
	{
		for ($i = 0; $i < $n; $i ++)
		{
			$array[$i] = rand($min, $max);
		}
	}
	return $array;
}
echo '<pre>';
//$rand_array = array_fill_rand(10);
print_r (array_fill_rand(10));
?>

Отредактировал решение задачи. Теперь проще код.

<pre> <?php 
function rand_om($n , $min, $max)
{
    $n = (int)$n;
    $array = array();
        for ($i = 0; $i < $n; $i ++)
        {
            $array[$i] = rand($min, $max);
        }
    return $array;
}
print_r (rand_om(10  , -21 , 35));
?>

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

<pre> <?php 
function rand_om ( $max,  $min, $n )
{
    $n = (int)$n;
    $array = array();
        for ($i = 0; $i < $n; $i ++)
        {
            $array[$i] = rand ($min, $max);
        }
    return $array;
}
print_r (rand_om( 2 , -5 , 7 ));
?>

Решил поискать в этом массиве максим и миним значение. Обнаружил то, что снаружи функции не могу вызвать этот результат. Как понял, из-за того, что после вызова функции и вывода результата ее работы - все данные обнуляются.
Поэтому внес вывод миним и макс знач массива в тело функции с задумкой того, что при вызове функции, будет и вывод макс и мин значений массива.
Или можно как-то сделать вывод этих значений, если вызов их будет извне функции?

<pre> <?php 
function rand_om ($n, $min, $max)
{
    $n = (int)$n;
    $array = array();
        for ($i = 0; $i < $n; $i ++)
        {
            $array[$i] = rand ($min, $max);
        }
    $a = min ($array);
    $b = max ($array);
	$c = array_sum ($array);
	$d = array_product ($array);
	
	
    echo 'Мин знач массива = '. $a. '.<br>';
    echo ' Макс знач массива = '. $b. '.<br>';
	echo ' Сумма знач массива = '. $c. '.<br>';
	echo ' Произв знач массива = '. $d. '.<p>';
    return $array;
}
print_r (rand_om( 3 , -5 , 7 ));
?>

Интересно, что, при вызове функции, если поменять местами аргументы, т.е. задать значениям $min=5, $max = - 7, то программа будет работать корректно. Будет верный вывод мин и макс значений массива.

<pre> <?php 
function rand_om ($n, $min, $max)
{
    $n = (int)$n;
    $array = array();
        for ($i = 0; $i < $n; $i ++)
        {
            $array[$i] = rand ($min, $max);
        }
	$a = min ($array);
	$b = max ($array);
    echo 'Мин знач массива = '. $a. '<br>';
	echo ' Макс знач массива = '. $b. '<p>';
	return $array;
}
print_r (rand_om( 3 , 5 , -7 ));
?>
vedro-compota's picture

print_r (rand_om( 2 , -5 , 7 ));

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

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

Здравствуйте. Насчет функции print_r, в книге у Хольцнера написано на стр. 84:

Для более простого вывода всех элементов массива
(в том числе со строковыми или непоследовательными числовыми индексами)
предусмотрена функция printr

Я и руководствовался этой теорией. А какой функцией, по-вашему, лучше возвращать массив? Echo ?

vedro-compota's picture

сказанное у Хольцнера не противоречит сказанному выше.

А какой функцией, по-вашему, лучше возвращать массив? Echo ?

не возвращать, а выводить элементы на экран (надеюсь, это просто опечатка))
Да, с помощью echo.

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

а для чего его обходить снаружи, если я достигаю конечной цели в виде вывода значений массива на экран?

vedro-compota's picture

а для чего его обходить снаружи, если я достигаю конечной цели в виде вывода значений массива на экран?

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

Вы можете сказать, что сделали даже больше - не только массивы, но и индексы, но это бессмысленный спор. Научились использовать print_r? Это хорошо - но тут учебные задачи, а не реальное производство, поэтому любые переделки - на вашу пользу. Как только закончите учиться сможете делать как угодно, точнее: так как посчитаете лучшим, изучив все возможные способы.

Поясню: с помощью print_r вы, например, не сможете вывести каждый 2-ой элемент массива и много чего ещё.

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

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

vedro-compota's picture

Теперь надо думать как обойти массив снаружи и вывести содержимое массива на экран с помощью функции echo.
Правильно мыслю?

Да, все так, используйте для обхода цикл foreach - он позволяет последовательно получить доступ к каждому ключу и/или элемент массива.
echo выводит строки или то, что к ним приводится, массив автоматически к строке привести нельзя, поэтому вам нужно выводить его элементы по-отдельности.

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

Посмотрите, правильно ли с точки зрения синтаксиса оформил вывоз функции и вывод элементов на экран выполнил?

<?php 
function rand_om ($n, $min, $max)
{
    $n = (int)$n;
    $array = array();
        for ($i = 0; $i < $n; $i ++)
        {
            $array[$i] = rand ($min, $max);
        }
    return $array;
}
//print_r (rand_om( 3 , -5 , 7 ));
foreach ((rand_om( 3 , -5 , 7 )) as $value)
	{ 
echo "Значение: $value <br>"; 
} 
?>
vedro-compota's picture

если код не упал - то по синтаксису правильно)) но я бы все же завел переменную для аккуратности:

$arr =  rand_om(3 , -5 , 7);
foreach ($arr as $value) { 
   echo "Значение: $value <br>";
}

+ отформатировано у вас все неправильно, напр. мы не ставим пробелы внутри скобок, также не все отступы правильны (см. рекомендации). Код должен оформляться аккуратно.

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

Решил модифицировать код задачи (без использования функции). Есть сложности.
Наполняю массив циклом for.
Обхожу массив циклом foreach и пытаюсь вывести элементы массива на экран, но интерпретатор выдает ошибку, что с аргументом цикла foreach что-то не так.
В чем моя ошибка?

<?php 
$min = -10;
$max = 20;
$n = 5;
//$array = array();
for ($i = 0; $i < $n; $i ++)
{
	$array = rand ($min, $max);
}
foreach ($array as $value)
{ 
	echo "Значение: ", $value ,"<br>"; 
} 
?>
vedro-compota's picture

В чем моя ошибка?

вы работаете с переменной не как с массивом, каждый раз меняя ещё значение на новое:

$array = rand($min, $max);

Если вы хотите добавить очередной элемент со стандартным ключом, то нужно писать так:

$array[] = rand($min, $max);

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

// покажем что на месте ключа может быть любое значение, сводящееся к числу или строке
$arr[2] = 'fsdfs';
$c = 22;
$arr[$c] = 11;
$c = 'fsdfs';;
$arr[$c] = 'e5645t54';
интерпретатор выдает ошибку, что с аргументом цикла foreach что-то не так.

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

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

del

Здравствуйте. А функция "var_dump" тоже функция отладки или ...? Какие у нее возможности и функции?

vedro-compota's picture

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

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

vedro-compota's picture

echo 'Мин знач массива = '. $a. '<br>';
    echo ' Макс знач массива = '. $b. '<p>';

Функция не должна в идеале оказывать побочного эффекта.

Или можно как-то сделать вывод этих значений, если вызов их будет извне функции?

скажу, что:

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

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

vedro-compota's picture

столкнулся с тем, что,
если в строке с циклом for (...) поставить в конце ";",
то будет выводить только одну строку с ответом. Интересно, почему?
П.С. Понятно, что по синтаксически эта запись не верна,
но интересно, что код не выдает ошибку, а выполняет его частично.

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

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

<?php 
function randomFunction($number, $min, $max)
{
	for ($i = 0; $i < $number; $i ++) {
		$randomNumbers[$i] = rand($min, $max);
	}
    return $randomNumbers;
}
$arr = randomFunction(3, -5, 7);
foreach ($arr as $value) { 
	echo "Значение: $value <br>"; 
} 
?>
melisa's picture

принято