Задача №12 - Сравнение 2-ого и 3-его элемента разных массивов

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

Условие задачи:

Даны два массива по 20 элементов каждый (заполните случайными числами, так чтобы среди элементов массива при очередном запуске программы могли встретиться и отрицательные и положительные числа). Сравните каждый 3-ий элемент 1-ого массива с каждый 2-ым элементов 2-ого массива - сравнение проводите пока не закончится та выборка, которая короче.

Мое решение:

Реализация №1:

<?php
function createArray ($n){
    for ($i = 0; $i < $n; $i++){
        $arr[$i] = rand(-15, 15);
    }
    return $arr;
}

$a = createArray(20);
$b = createArray(20);

var_dump($a);
var_dump($b);

echo '<br>';

function companeElementsOfTheArrays($x, $y)
{
    $j = 2;
    for ($i = 3; $i < count($x); $i += 3) {
        if ($x[$i] > $y[$j]) {
            echo $x[$i] . ' больше ' . $y[$j] . '<br>';
        } elseif ($x[$i] < $y[$j]) {
            echo $x[$i] . ' меньше ' . $y[$j] . '<br>';
        } elseif ($x[$i] == $y[$j]) {
            echo $x[$i] . ' равно ' . $y[$j] . '<br>';
        }
        $j += 2;
    }
}
companeElementsOfTheArrays($a, $b);

Реализация №2:

<?php
function createArray ($n){
    for ($i = 0; $i < $n; $i++){
        $arr[$i] = rand(-15, 15);
    }
    return $arr;
}

$a = createArray(20);
$b = createArray(20);

var_dump($a);
var_dump($b);

echo '<br>';

function companeElementsOfTheArrays($x, $y)
{
    for ($i = 3, $j = 2; $i < count($x), $j < count($y); $i += 3, $j += 2) {
        if (array_key_exists($i, $x) & array_key_exists($j, $y)) {
            if ($x[$i] > $y[$j]) {
                echo $x[$i] . ' больше ' . $y[$j] . '<br>';
            } elseif ($x[$i] < $y[$j]) {
                echo $x[$i] . ' меньше ' . $y[$j] . '<br>';
            } elseif ($x[$i] == $y[$j]) {
                echo $x[$i] . ' равно ' . $y[$j] . '<br>';
            }
        } else {
            break;
        }
    }
}
companeElementsOfTheArrays($a, $b);

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

melisa's picture

  1. В обоих случаях сравнение начинается не с 3 и 2 элементов, а с 4 и 3 соответственно.
  2. if (array_key_exists($i, $x) & array_key_exists($j, $y))

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

Реализация №1:
Комментарий: Да, я понял свою ошибку, массивы начинаются же с 0, впредь буду внимательнее:

<?php
function createArray ($n){
    for ($i = 0; $i < $n; $i++){
        $arr[$i] = rand(-15, 15);
    }
    return $arr;
}

$a = createArray(20);
$b = createArray(20);

var_dump($a);
var_dump($b);

echo '<br>';

function companeElementsOfTheArrays($x, $y)
{
    $j = 1;
    for ($i = 2; $i < count($x); $i += 3) {
        if ($x[$i] > $y[$j]) {
            echo $x[$i] . ' больше ' . $y[$j] . '<br>';
        } elseif ($x[$i] < $y[$j]) {
            echo $x[$i] . ' меньше ' . $y[$j] . '<br>';
        } elseif ($x[$i] == $y[$j]) {
            echo $x[$i] . ' равно ' . $y[$j] . '<br>';
        }
        $j += 2;
    }
}
companeElementsOfTheArrays($a, $b);

Реализация №2:

<?php
function createArray ($n){
    for ($i = 0; $i < $n; $i++){
        $arr[$i] = rand(-15, 15);
    }
    return $arr;
}

$a = createArray(20);
$b = createArray(20);

var_dump($a);
var_dump($b);

echo '<br>';

function companeElementsOfTheArrays($x, $y)
{
    for ($i = 2, $j = 1; $i < count($x), $j < count($y); $i += 3, $j += 2) {
        if (array_key_exists($i, $x) && array_key_exists($j, $y)) {
            if ($x[$i] > $y[$j]) {
                echo $x[$i] . ' больше ' . $y[$j] . '<br>';
            } elseif ($x[$i] < $y[$j]) {
                echo $x[$i] . ' меньше ' . $y[$j] . '<br>';
            } elseif ($x[$i] == $y[$j]) {
                echo $x[$i] . ' равно ' . $y[$j] . '<br>';
            }
        } else {
            break;
        }
    }
}
companeElementsOfTheArrays($a, $b);

Комментарий:

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

Почитал... почитал то, что Вы мне скинули, почитал на php.net... не то, чтобы я ничего не понял, но осталось такое ощущение, будто я до чего-то не "догоняю", скажем там не особо приятное ощущение. Понял что оператор & - это побитовый оператор, а оператор && - это логический оператор (что мне собственно и нужно), понял что в php побитовый оператор & имеет более высокий приоритет и исполнения чем логический оператор &&, понял по какому принципу происходит сравнение 0 и 1 в битовой вселенной (если ее можно так назвать)... но для чего это нужно и когда это нужно использовать, и если код настоящий код работает, то почему нельзя оставить & понять не могу... наверно со временем я разберусь, но если Вы мне хотя бы намекнете не вдаваясь в подобности когда актуально применять &, а также порекомендуете литературу на этот счет - буду признателен!

melisa's picture

  1. и если код настоящий код работает, то почему нельзя оставить & понять не могу...

    Тут всё просто. Если Вы "не совсем догоняете", как работает определённый оператор, никогда его не используйте, потому что последствия для Вас непредсказуемы.

  2. Насчёт использования: есть некоторые частные случаи использования в PHP, но чаще это низкоуровневые языка программирования.
melisa's picture

принято