Задача №7. --Заполнение массива случайными числами

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


function arr_n($N)
{
$mas[] = $N;

    for($i = 0; $i < $N; $i++) {
	   $mas[$i] = rand(-100, 100);//заполняем случайными значениями.
    }

        for($j = 0; $j < $N; $j++) {
	       echo $mas[$j], "<br>";//выводим массив случайных значений.
        }
}

$N = 7;
arr_n($N);


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

<?php
    $N = 7;
    $mas[] = $N;
    print_r($mas);

выведет

Array
(
    [0] => 7
)

Можно построить массив нужной длины функцией array_pad:

<?php
$N = 7;
$mas = array_pad([], $N, 0);
print_r($mas);

Результат:

Array
(
    [0] => 0
    [1] => 0
    [2] => 0
    [3] => 0
    [4] => 0
    [5] => 0
    [6] => 0
)

А потом можно использовать цикл foreach.

sid's picture

Использовал функцию array_pad.

<?php
function arr_n($N)
{
$mas = array_pad([], $N, 0);

    for($i = 0; $i < count($mas); $i++) {
       $mas[$i] = rand(-1000, 1000);
    }

    for($i = 0; $i < count($mas); $i++) {
           echo $mas[$i], "<br>";
    }
}

$N = 7;
arr_n($N);
?>

sid's picture

Можно так.

<?php
function arr_n($N)
{
$mas = array_pad([], $N, 0);

    for($i = 0; $i < count($mas); $i++) {
       $mas[$i] = rand(-1000, 1000);
    }

    foreach($mas as $i) {
               echo $i, "<br>";
    }
}

$N = 7;
arr_n($N);
?>
vedro-compota's picture

    for($i = 0; $i < count($mas); $i++) {
       $mas[$i] = rand(-1000, 1000);
    }
 
        foreach($mas as $i) {
                echo $i, "<br>";
        }

-- здесь и на пост выше for и foreach должны быть на одном уровне, а у вас на разных.

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

sid's picture

Исправил.

Можно использовать foreach и в первом цикле. Тогда нам потребуется передача по ссылке. & нужен, чтобы переменная \$a указывала на элемент массива, а не была его копией.

<?php
function arr_n($N)
{
    $mas = array_pad([], $N, 0);
 
    foreach($mas as &$i) {
        $i = rand(-1000, 1000);
    }
 
    foreach($mas as $i) {
        echo $i, "<br>";
    }
}
 
$N = 7;
arr_n($N);
?>
vedro-compota's picture

Отмечу, что нужно помнить и об эффектах которые возникают при передаче переменной в foreach по ссылке: http://fkn.ktu10.com/?q=node/8802

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

sid's picture

Как это можно отследить, или нужно просто отказаться от использования ссылки?

vedro-compota's picture

Как это можно отследить, или нужно просто отказаться от использования ссылки?

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

Варианты:

  • вот тут написано, что можно использовать
    unset($value)

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

  • Второй вариант -- использовать не передачу по ссылке, а обращение по ключу, то есть писать не так:
    foreach($mas as &$i) {
    	$i = rand(-1000, 1000);
    }
    
    foreach($mas as $i) {
    	echo $i, "<br>";
    }
    

    а так:

    foreach($mas as $key => $i) {
    	$mas[$key] = rand(-1000, 1000); // обращение по текущему ключу
    }
    
    foreach($mas as $i) {
    	echo $i, "<br>";
    }

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

Здесь можно было бы просто не использовать \$i во втором цикле.

<?php
function arr_n($N)
{
    $mas = array_pad([], $N, 0);
  
    foreach($mas as &$i) {
        $i = rand(-1000, 1000);
    }
  
    foreach($mas as $j) {
        echo $j, "\n";
    }
}
  
$N = 7;
arr_n($N);
?>

Но лучше использовать unset:

<?php
function arr_n($N)
{
    $mas = array_pad([], $N, 0);
  
    foreach($mas as &$i) {
        $i = rand(-1000, 1000);
    }
    unset($i);
    foreach($mas as $i) {
        echo $i, "\n";
    }
}
  
$N = 7;
arr_n($N);
?>