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

Задайте случайным образом массив из 20-ти элементов (целых чисел). Найдите минимальное число и напечатайте его.

function numberMinArray($number)
{
	for ($i = 0; $i < $number; $i ++) {
		$arr[] = rand(1, $number);
	}
	$numberMin = min($arr);
	return $numberMin;
}
$number = 20;
$a = numberMinArray($number);
echo "Mинимальное число = $a.";

Без функции

min();
function numberMinInArray($number)
{
    for ($i = 0; $i < $number; $i ++) {
        $arr[] = rand(1, $number);
    }   
    $numberMin =  $arr[0];
    
    foreach ($arr as $v) {
        if ($v < $numberMin) {
            $numberMin = $v;
        }
    }
    return $numberMin;
}
$number = 20;
$a = numberMinInArray($number);
echo "Mинимальное число = $a.";

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

melisa's picture

  • $arr[] = rand(1, $number);

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

    Но это не ошибка, это просто для ознакомления

  • то же, что и здесь

<pre><?php
function generateArrayRandom($n)
{
	for ($i = 0; $i < $n; $i ++) {
		$arrRandom[] = rand(1, 100);
	}
	print_r ($arrRandom); // вывод дампа массива для самопроверки
	return $arrRandom;	
}

function calculatingMinimumValueArray($c)
{
	return min($c);
}

$n = 3;
$genArrRand = generateArrayRandom($n);
$calcMinValArr = calculatingMinimumValueArray($genArrRand);
echo "Mинимальное число массива = $calcMinValArr.";
?>

<pre><?php
function generateArrayRandom($n)
{
    for ($i = 0; $i < $n; $i ++) {
        $arrRandom[] = rand(1, 100);
    }
    print_r ($arrRandom); // вывод дампа массива для самопроверки
    return $arrRandom;  
}
 
$n = 3;
$genArrRand = generateArrayRandom($n);
$arrMinNumber = min($genArrRand);
echo "Mинимальное число массива = $arrMinNumber.";
?>
melisa's picture

хорошо, но покажите корректное решение с 2мя функциями (не стандартной min(), а обеими Вашими)

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

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

<pre><?php
function generateArrayRandom()
{
	$n = 4; // количество элементов в массиве
    for ($i = 0; $i < $n; $i ++) {
        $arrRandom[] = rand(1, 100);
    }
    print_r ($arrRandom); // вывод дампа массива для самопроверки
    return $arrRandom;  
}
 
function calculatingMinimumValueArray($arr)
{
    $arrMin = null;
 
    foreach($arr as $v) {
        if($v < $arrMin or is_null($arrMin)) {
            $arrMin = $v;
		}
	}
    return $arrMin;
}
 
$genArrRand = generateArrayRandom();
$calcMinValArr = calculatingMinimumValueArray($genArrRand);
echo "Mинимальное число массива = $calcMinValArr.";
?>
vedro-compota's picture

$arrMin = null;
.....
$v < $arrMin or is_null($arrMin))

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

А где была взят такой подход? сами придумали?

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

перед циклом arrMin-у обычно дают значение первого элемента массива.

Да. Но если так прописать, то будет ошибка, что не определена переменная. Чтобы это исключить, только сегодня это понял, нужно сделать обход массива и тогда переменная $arr[0] будет определена. Такой код для восприятия сложнее, хотя и это тоже решение.
Решая задачу, я так и сделал, объявил

$arrMin = $arr[0];

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

Первый подход решения задачи. Тоже много, что из этого почерпнул:

function calculatingMinimumValueArray($arr)
{
    // Если в массиве нет элементов
    if(empty($arr))
        return null;
    
    $i = 0;
    
    foreach($arr as $v)
    {
        // Если $i = 0, т.е. это первый элемент - записываем его в любом случае
        if(!$i or $v < $arrMin)
            $arrMin = $v;
 
        $i++;
    }
    
    return $arrMin;
}

Второй подход. Его и использовал:

Если предполагается, что массив состоит только из чисел, то можно так:

function calculatingMinimumValueArray($arr)
{
    $arrMin = null;
 
    foreach($arr as $v)
        if($v < $arrMin or is_null($arrMin))
            $arrMin = $v;
 
    return $arrMin;
}

И были комментарии по моим вопросам:

!$i

можно заменить на

$i == 0

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

$i === 0

для однозначности.

Ещё раз условие:

if(!$i or $v < $arrMin)

На первой итерации в левой части будет true (потому что $i равна 0). А поскольку OR возвращает true, когда либо левая, либо правая, либо обе стороны равны TRUE, то до второй части, которая

$v < $arrMin

, PHP не дойдёт. Незачем смотреть правую сторону, если уже известно, что в левой true, поскольку это значит, что результатом OR всё равно будет true.

Соответственно, при первой итерации PHP игнорирует необъявленную $arrMin, а при второй итерации переменная уже объявлена и PHP ругаться не будет.

melisa's picture

Интересный пример с or. Не видела раньше)

Задача засчитана.