Задачи по php

Задача №1 из этого списка.

Вывести на экран N случайных чисел (каждое с новой строки) из диапазона [-21, 35]
ПРИМЕЧАНИЕ: подразумевается, что вы должны организовать цикл, который выполнится N раз и при этом в каждом своём витке выведет на экран случайное число.

Решение:

define('N', 7);

/**
 * Это функция, которая выводит на экран N случайных чисел
 *
 * @param int $n  количество выводимых на экран чисел
 */
function myFunction($n)
{
    $min = -21;
    $max = 35;
    $result = '';
    for ($i = 0; $i < $n; $i++) {
        $result .= rand($min, $max) . '<br>';
    }
    return $result;
}

echo myFunction(N);

Задача №2 из этого списка.

Вывести на экран сумму N случайных чисел.

Решение:

define('N', 7);

function displaySumOfRandomNumbers($n)
{
    $min = -21;
    $max = 35;
    $result = 0;
    for ($i = 0; $i < $n; $i++) {
        $result += rand($min, $max);
    }
    return $result;
}

echo displaySumOfRandomNumbers(N);

Задача №3 из этого списка.

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

-1
20 больше -1
-5 меньше 20
-6 меньше -5
и т.д.

Решение:

define('N', 7);

function displayAndCompareRandomNumbers($n)
{
    $min = -21;
    $max = 35;
    $arr = [];
    $result = '';
    for ($i = 0; $i < $n; $i++) {
        $currentNum = rand($min, $max);
        $arr[] = $currentNum;
        $result .= $currentNum;
        if ($i > 0) {
            $prevNum = $arr[$i - 1];
            if ($currentNum > $prevNum)
                $result .= ' больше ' . $prevNum;
            elseif ($currentNum < $prevNum)
                $result .= ' меньше ' . $prevNum;
            else
                $result .= ' равно ' . $prevNum;
        }
        $result .= '<br>';
    }
    return $result;
}

echo displayAndCompareRandomNumbers(N);

Задача №4 из этого списка.

Вывести на экран n-ное число Фибоначчи.

Решение:

define('N', 7);

function fibonacci($n)
{
    $a = 0; // это первое число Фибоначчи
    $b = 1; // это второе число Фибоначчи
    if (!is_int($n) || $n <= 0) {
        return 'Значение N должно быть целым положительным числом!';
    }
    if ($n == 1) {
        return $a;
    }
    if ($n == 2) {
        return $b;
    }
    for ($i = 2; $i < $n; $i++) {
        $nextFib = $a + $b;
        $a = $b; 
        $b = $nextFib;
    }
    return $nextFib;
}

echo 'Число Фибоначчи с порядковым номером ' . N . ':<br>' . fibonacci(N);

Задача №5 из этого списка.

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

3567=
7
6
5
3

Подсказка: используйте цикл while и операцию получения остатка.

Решение:

function reverseNumber($n)
{
    $result = '';
    while ($n > 0) {
        $result .= $n % 10 . '<br>';
        $n = intdiv($n, 10);
    }
    return $result;
}
 
$randomNum = rand(1, 99999);
echo "Случайное число: $randomNum <br>" . reverseNumber($randomNum);

Задача №6 из этого списка.

Дано некоторое число длиной от 1 до 5 символов, вывести все его "нечётные" цифры в обратном порядке (аналогично предыдущей задаче), если же таких цифр не найдёт, вывести сообщение "Нечетных цифр не обнаружено!"

Решение:

function showOddNumbers($n)
{
    $flag = false;
    $result = '';
    while ($n > 0) {
        $num = $n % 10;
        $n = intdiv($n, 10);
        // если число нечётное
        if (($num % 2) != 0) {
            $result .= $num . '<br>';
            $flag = true;
        }
    } 
    if (!$flag) {
        $result = 'Нечетных цифр не обнаружено!<br>';
    }
    return $result;
}

$randomNum = rand(1, 99999);
echo "Случайное число: $randomNum <br>" . showOddNumbers($randomNum);

Задача №7 из этого списка.

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

Решение:

define('N', 7);

function fillArray($n)
{
    $arr = [];
    for ($i = 0; $i < $n; $i++) {
        $arr[] = rand(0, 99);
    }
    return $arr;
}

function showArray($arr)
{
    foreach ($arr as $value) {
        echo $value . '<br>';
    }
}

$arrRandomNumber = fillArray(N);
showArray($arrRandomNumber);

Задача №8 из этого списка.

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

Решение:

define('M', 4);
define('N', 7);

function fillDoubleArray($m, $n)
{
   $arr = [];
   for ($i = 0; $i < $m; $i++) {
      for ($j = 0; $j < $n; $j++) {
         $arr[$i][$j] = rand(0, 99);
      }
   }
   return $arr;
}

function showDoubleArray($arr)
{
    foreach ($arr as $value1) {
        foreach ($value1 as $value2) {
            echo $value2 . ' ';
        }
        echo '<br>';
    }
}

$doubleArray = fillDoubleArray(M, N);
showDoubleArray($doubleArray);

Задача №9 из этого списка.

Задайте случайным образом массив из N элементов. Выведите его на экран "ёлочкой". Вот начало такого вывода:

1
2 3
4 5 6
7 8 9 10
11 12 ......

Второй вариант - сделайте то же самое, но не используйте массив: у вас есть переменная N, выведете на экран, все числа до N, по тому же принципе что и выше, например, если N=9, то получим:

1
2 3
4 5 6
7 8 9

Решение, вариант 1:

define('N', 20);

function fillArray($n)
{
    $arr = [];
    for ($i = 0; $i < $n; $i++) {
        $arr[] = rand(0, 99);
    }
    return $arr;
}

function showFirArray($arr)
{
    $k = 2; 
    for ($i = 0; $i < count($arr); $i++) {
        echo $arr[$i] . ' ';
        // вычислим, после каких по счёту элементов массива
        // нужно делать перенос строки
        if ($i == ($k * ($k - 1) / 2 - 1)) {
            $k++;
            echo '<br>';
        }
    }
}

$firArray = fillArray(N);
showFirArray($firArray);

Решение, вариант 2:

define('N', 9);

function displayFirArray($n)
{
    $k = 2;
    for ($i = 1; $i <= $n; $i++) {
        echo $i . ' ';
        // вычислим, после каких по счёту элементов массива
        // нужно делать перенос строки
        if ($i == $k * ($k - 1) / 2) {
            $k++;
            echo '<br>';
        }
    }
}

displayFirArray(N);

Задача №10 из этого списка.

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

Решение:

define('N', 9);

function fillArray($n)
{
    $arr = [];
    for ($i = 0; $i < $n; $i++) {
        $arr[] = rand(0, 99);
    }
    return $arr;
}

function showArr($arr)
{
    foreach ($arr as $value) {
        echo $value . ' ';
    }
    echo '<br>';
}

$arrMax = fillArray(N);
showArr($arrMax);
echo 'Максимальный элемент массива: ' . max($arrMax);

Задача №11 из этого списка.

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

Решение:

define('N', 20);

function fillArray($n)
{
    $arr = [];
    for ($i = 0; $i < $n; $i++) {
        $arr[] = rand(0, 99);
    }
    return $arr;
}

function showArr($arr)
{
    foreach ($arr as $value) {
        echo $value . ' ';
    }
    echo '<br>';
}

$arrMin = fillArray(N);
showArr($arrMin);
echo 'Минимальный элемент массива: ' . min($arrMin);

Задача №12 из этого списка.

Даны два массива по 20 элементов каждый (заполните случайными числами, так чтобы среди элементов массива при очередном запуске программы могли встретиться и отрицательные и положительные числа).
Сравните каждый 3-ий элемент 1-ого массива с каждый 2-ым элементов 2-ого массива - сравнение проводите пока не закончится та выборка, которая короче.
Например пусть мы имеем два массива (запишу лишь начальные элементы):
1 | 2 | -10 | 5 | 0 | 12 | 2 | 8 ....
0 | 3 | 4 | 9 | 7 | 5 | -8 | 3.....
для них программа должна вывести:

-10 меньше 3
12 больше 9

- других сравнений не последует, так как новых из "каждых третьих элементов" в 1-ом массиве больше нет.

Решение:

function fillArray20elem()
{
    $arr = [];
    for ($i = 0; $i < 20; $i++) {
        $arr[] = rand(-99, 99);
    }
    return $arr;
}

function showArr($arr)
{
    foreach ($arr as $value) {
        echo $value . ' ';
    }
    echo '<br>';
}

function compareElementsOfArrays($arr1, $step1, $arr2, $step2)
{
    $result = '';
    for ($i = $step1 - 1; $i < count($arr1); $i += $step1) {
        $numberFromCurrentArray = $arr1[$i];
        // вычислим, с каким по счёту элементом второго массива
        // сравнивать текущий элемент из первого массива
        $j = $step2 / $step1 * ($i + 1) - 1;

        if (isset($arr2[$j])) {
            $numberFromSecondArray = $arr2[$j];

            if ($numberFromCurrentArray > $numberFromSecondArray)
                $sign = ' больше ';
            elseif ($numberFromCurrentArray < $numberFromSecondArray)
                $sign = ' меньше ';
            else
                $sign = ' равно ';

            $result .= $numberFromCurrentArray . $sign . $numberFromSecondArray . '<br>';
        } else {
            $result .= 'Закончились элементы для сравнения во втором массиве<br>';
            break;
        }
    }
    return $result;
}

$arr1 = fillArray20elem();
$step1 = 3; // каждый 3-ий элемент из первого массива $arr1
$arr2 = fillArray20elem();
$step2 = 2; // каждый 2-ой элемент из второго массива $arr2

showArr($arr1);
showArr($arr2);
echo compareElementsOfArrays($arr1, $step1, $arr2, $step2);

Задача №13 из этого списка.

Создайте функцию, которая принимает на вход массив случайных чисел из диапазона [5..12]. Обходит этот массив и делает для каждого элемента следующее (пусть она оказывает побочный эффект прямо в своём теле):
Если это число равно 5 -- то выведете на экран строку "пять", если 6 -- то строку "шесть", если 7 то число "7", иначе -- строку "какое-то другое число".
Используйте для решения задачи оператор switch(link is external) (или см. книгу Стивена Хольцнера стр. 60).

Решение:

define('N', 7);

function fillArrayFromRange512($n)
{
    $arr = [];
    for ($i = 0; $i < $n; $i++) {
        $arr[] = rand(5, 12);
    }
    return $arr;
}

function showArr($arr)
{
    foreach ($arr as $value) {
        echo $value . ' ';
    }
    echo '<br>';
}

function displayElemsAsStringsOfArray($arr)
{
    foreach ($arr as $value) {
        switch ($value) {
            case 5:
                echo "пять";
                break;
            case 6:
                echo "шесть";
                break;
            case 7:
                echo "семь";
                break;
            default:
                echo "какое-то другое число";
                break;
        }
        echo '<br>';
    }
}

$arr512 = fillArrayFromRange512(N);
showArr($arr512);
displayElemsAsStringsOfArray($arr512);

Задача №14 из этого списка.

Есть два массива "a" и "b". На вход вашей программе подаётся массив "a" случайных чисел (10 элементов) из диапазона от 1 до 20. Задача: вывести на экран все числа, которые не содержатся в массиве "b"

$b = [12, 5, 17, 6, 4];

Решите эту задачу двумя способами:
1. Без использования in_array()
2. С использованием in_array() (что проще.

Решение:

function fillArrayFromRange120($n)
{
    $arr = [];
    for ($i = 0; $i < $n; $i++) {
        $arr[] = rand(1, 20);
    }
    return $arr;
}

function showDiffArr($arr)
{
    if ($arr) {
        foreach ($arr as $value) {
            echo $value . ' ';
        }
    } else {
        echo 'Нет элементов';
    }
    echo '<br>';
}

// Решение, первый вариант (без использования in_array()):
function displayElemsOfFirstArray1($arr1, $arr2)
{
    $arrUnique = array_unique($arr1);
    $arrDiff = array_diff($arrUnique, $arr2);
    return $arrDiff;
}

// Решение, второй вариант (с использованием in_array()):
function displayElemsOfFirstArray2($arr1, $arr2)
{
    $arrUnique = array_unique($arr1);
    $arrDiff = [];
    foreach ($arrUnique as $value) {
        if (!in_array($value, $arr2)) {
            $arrDiff[] = $value;
        }
    }
    return $arrDiff;
}

// Решение, третий вариант (совсем без использования модных функций):
function displayElemsOfFirstArray3($arr1, $arr2)
{
    $arrUnique = array_unique($arr1);
    $arrDiff = [];
    foreach ($arrUnique as $value1) {
        $flag = false;
        foreach ($arr2 as $value2) {
            // если текущему значению первого массива соответствует
            // какое-нибудь значение из второго массива
            if ($value1 == $value2) {
                $flag = true;
                break;
            }
        }
        if ($flag == false) {
            $arrDiff[] = $value1;
        }
    }
    return $arrDiff;
}

$a = fillArrayFromRange120(10);
$b = [12, 5, 17, 6, 4];

$arrDiff1 = displayElemsOfFirstArray1($a, $b);
$arrDiff2 = displayElemsOfFirstArray2($a, $b);
$arrDiff3 = displayElemsOfFirstArray3($a, $b);

echo 'Исходный массив: ';
showDiffArr($a);
echo 'Вычитаемый массив: ' . implode(' ', $b) . '<br>';
// Убедимся, что все варианты решений дают одинаковый результат:
showDiffArr($arrDiff1);
showDiffArr($arrDiff2);
showDiffArr($arrDiff3);

1. Нужно ли к каждой функции писать комментарий в формате PHPDoc? Или можно вовсе обойтись без комментария? Или оптимально сделать краткий комментарий типа "// Это функция, которая выводит на экран N случайных чисел"
2. Если функция одна, можно ли её для простоты называть "myFunction", или всё же лучше придумать для неё какое-то говорящее название?

vedro-compota's picture

засчитано

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