Задача №12. Даны два массива по 20 элементов каждый. Сравните каждый 3-ий элемент 1-го массива с каждый 2-ым элементом 2 массива

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

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

function createRandomArray() { //функция создания массива из 20 чисел
	for($a = 1; $a <= 20; $a++) {
		$randomArray[$a] = rand(-99, 99);
	}
	return $randomArray;
}
function compareArrays($finalArrayA, $finalArrayB) { //функция сравнения двух массивов
	foreach($finalArrayA as $key => $elem1) { 
		$elem2 = $finalArrayB[$key];
		if($elem1 > $elem2) {
			echo "$elem1 больше $elem2<br>";
		}
		elseif($elem1 < $elem2) {
			echo "$elem1 меньше $elem2<br>";
		}
		else {
			echo "$elem1 равно $elem2<br>";
		}
	}
}
$arrayA = createRandomArray();
$arrayB = createRandomArray();
foreach($arrayA as $key => $elem1) { //Выделяет каждый третий элемент из одного массива и каждый второй элемент из второго - в отдельные массивы
	$elem2 = $arrayB[$key];
	if($key % 3 == 0) {
		$finalArrayA[] = $elem1;
	}
	if($key % 2 == 0) {
		$finalArrayB[] = $elem2;
	}
}
echo compareArrays($finalArrayA, $finalArrayB);

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

melisa's picture

  1. Область видимости и именование.
    Как мы обсуждали ранее, область видимости внутри функции
    отличается от области видимости снаружи.

    Не следует называть локальные переменные именами, совпадающими
    с глобальными - это может ввести в заблуждение того, кто будет читать Ваш код.

    Конкретно: рассмотрим функцию compareArrays().

    function compareArrays($finalArrayA, $finalArrayB) { 
        foreach($finalArrayA as $key => $elem1) { 
            $elem2 = $finalArrayB[$key];
            if($elem1 > $elem2) {
                echo "$elem1 больше $elem2<br>";
            }
            elseif($elem1 < $elem2) {
                echo "$elem1 меньше $elem2<br>";
            }
            else {
                echo "$elem1 равно $elem2<br>";
            }
        }
    }

    Эта функция сравнивает какие-то абстрактные 2 массива. Почему тогда
    аргументы функции Вы назвали $finalArrayA и $finalArrayB?
    Функции всё равно, final они или не final. Лучше назвать их $firstArray и $secondArray.

  2. Что делает Ваша функция?
    Она и так выводит на экран значения, а Вы вызываете её с оператором echo:
    echo compareArrays($finalArrayA, $finalArrayB);

    Это лишнее.

  3. Альтернативное решение.
    Решение рабочее, но предоставьте другой вариант решения с перебором
    обоих массивов в одном цикле.
    Если возникнут затруднения, воспользуйтесь примечанием к этой задаче.
Sver4ok's picture

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

function createRandomArray() { //функция создания массива из 20 чисел
	for($a = 1; $a < 20; $a++) {
		$randomArray[$a] = rand(-99, 99);
	}
	return $randomArray;
}
function compareArrays($firstArray, $secondArray, $keyOfFirstArray, $bKeyOfSecondArray) { //функция сравнения двух массивов
	while($keyOfFirstArray < 20) { //цикл работает через каждый третий ключ в первом массиве
		$elemA = $firstArray[$keyOfFirstArray];
		$elemB = $secondArray[$bKeyOfSecondArray];
		if($elemA > $elemB) {
			echo "$elemA больше $elemB<br>";
		}
		elseif($elemA < $elemB) {
			echo "$elemA меньше $elemB<br>";
		}
		else {
			echo "$elemA равно $elemB<br>";
		}
		$keyOfFirstArray += 3; //каждый третий ключ массива
		$bKeyOfSecondArray += 2; //каждый второй ключ массива
	}
}
$firstArray = createRandomArray();
$secondArray = createRandomArray();
compareArrays($firstArray, $secondArray, 3, 2);
melisa's picture

  1. while($keyOfFirstArray < 20) { //цикл работает через каждый третий ключ в первом массиве

    в первом массиве может быть сколько угодно элементов. Это неверное условие.

  2. compareArrays($firstArray, $secondArray, 3, 2);

    нет смысла передавать 3 и 2 в качестве параметров.
    Во-первых, они не могут быть изменены по условию (если это произойдёт, условие задачи не будет выполнено).
    Во-вторых, эти параметры не влияют на логику функции, а значит, бессмысленны. Для чего можно было бы ввести параметры здесь? Например, чтобы универсализировать задачу, выполняемую функцией. Тогда условие звучало бы так:

    Даны два массива ...
    Сравните каждый n-ий элемент 1-ого массива с каждый m-ым элементов 2-ого массива - сравнение проводите пока не закончится та выборка, которая короче.

    На Ваш выбор: удалите лишние аргументы из функции или усовершенствуйте код.

Sver4ok's picture

А можно кстати для красоты добавлять пробелы, чтобы был оператор на одной вертикали? Особенно это в ООП заметил что как-то симпатичнее выглядит. Ну тип:

$abcdeft = 2+2;
$ab      = 3+3;
<?php
/* Даны два массива по 20 элементов каждый (заполните случайными числами, так чтобы среди элементов массива 
 * при очередном запуске программы могли встретиться и отрицательные и положительные числа).
Сравните каждый 3-ий элемент 1-ого массива с каждый 2-ым элементов 2-ого массива - сравнение проводите пока не закончится та выборка, которая короче. */

function createRandomArray($amount) { //функция создания массива из 20 чисел
	for($a = 1; $a <= $amount; $a++) {
		$randomArray[$a] = rand(-99, 99);
	}
	return $randomArray;
}

function compareArrays($firstArray, $secondArray) { //функция сравнения двух массивов
	$keyOfFirstArray   = 3;
	$KeyOfSecondArray  = 2;
	while($keyOfFirstArray <= 20) { //цикл работает через каждый третий ключ в первом массиве
		$elemA = $firstArray[$keyOfFirstArray];
		$elemB = $secondArray[$KeyOfSecondArray];
		if($elemA > $elemB) {
			echo "$elemA больше $elemB<br>";
		}
		elseif($elemA < $elemB) {
			echo "$elemA меньше $elemB<br>";
		}
		else {
			echo "$elemA равно $elemB<br>";
		}
		$keyOfFirstArray   += 3; //каждый третий ключ массива
		$KeyOfSecondArray  += 2; //каждый второй ключ массива
	}
}

$firstArray  = createRandomArray(20);
$secondArray = createRandomArray(20);
compareArrays($firstArray, $secondArray);
melisa's picture

  1. А можно кстати для красоты добавлять пробелы, чтобы был оператор на одной вертикали? Особенно это в ООП заметил что как-то симпатичнее выглядит. Ну тип:
    $abcdeft = 2+2;
    $ab      = 3+3;

    Нет, так нельзя, верните как было.

  2. while($keyOfFirstArray < 20) { //цикл работает через каждый третий ключ в первом массиве

    в первом массиве может быть сколько угодно элементов. Это неверное условие.

    Это тоже для Вас. Наверное, не заметили. Всё-таки исправьте.

  3. function createRandomArray($amount) { //функция создания массива из 20 чисел
        for($a = 1; $a <= $amount; $a++) {
            $randomArray[$a] = rand(-99, 99);
        }
        return $randomArray;
    }

    А вот в первой функции теперь творится неразбериха.
    Теперь коментарий не соответствует тому, что делаем функция, если передать в неё 0, то будет выведена ошибка о неизвестной переменной, да и в данном контексте предыдущая логика этой функции вполне была нормальной - жёстко создавался массив из 20 элементов. Второй вариант тоже подходит, но лучше верните как было. Ну или исправьте, чтобы то, что есть было без ошибок.

    Все эти ошибки по невнимательности, в них нет чего-то такого, что Вы не знаете. Просто ещё раз просматривайте свой код после того, как написали. А после этого запускайте со всевозможными вариантами параметров. Важно уметь протестировать свой код.

Sver4ok's picture

в первом массиве может быть сколько угодно элементов. Это неверное условие.

Но первый и второй массив жёстко задан в 20 чисел.

while($keyOfFirstArray < 20)

Тута не массив, а переменная. Типа я перевёл как (КлючПервогоМассива), у меня плоховат английский пока что. Она увеличивается на +3 в цикле, то бишь берёт каждый третий ключ из первого массива. А Кину пока что отредактированный код первого варианта:

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

function createRandomArray() //функция создания массива из 20 чисел
{
	for($a = 1; $a <= 20; $a++) {
		$randomArray[$a] = rand(-99, 99);
	}
	
	return $randomArray;
}

function compareArrays($firstArray, $secondArray) //функция сравнения двух массивов
{
	$keyOfFirstArray = 3;
    $keyOfSecondArray = 2;
    
	while($keyOfFirstArray < 20) { //цикл работает через каждый третий ключ в первом массиве
		$elemA = $firstArray[$keyOfFirstArray];
		$elemB = $secondArray[$keyOfSecondArray];
		
		if($elemA > $elemB) {
			echo "$elemA больше $elemB<br>";
		}
		elseif($elemA < $elemB) {
			echo "$elemA меньше $elemB<br>";
		}
		else {
			echo "$elemA равно $elemB<br>";
		}
		$keyOfFirstArray += 3; //каждый третий ключ массива
		$keyOfSecondArray += 2; //каждый второй ключ массива
	}
}

$firstArray = createRandomArray();
$secondArray = createRandomArray();
compareArrays($firstArray, $secondArray);
melisa's picture

Но первый и второй массив жёстко задан в 20 чисел.

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

Это снова камень в огород Вашего понимания области видимости.

Sver4ok's picture

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

function createRandomArray() //функция создания массива из 20 чисел
{
	for($a = 1; $a <= 20; $a++) {
		$randomArray[$a] = rand(-99, 99);
	}
	
	return $randomArray;
}

function compareArrays($firstArray, $secondArray) //функция сравнения двух массивов
{
	$keyOfFirstArray = 3;
    $keyOfSecondArray = 2;
    $amountElements = count($firstArray); //подсчитает сколько элементов в массиве
    
	while($keyOfFirstArray <= $amountElements) { //цикл работает через каждый третий ключ в первом массиве
		$elemA = $firstArray[$keyOfFirstArray];
		$elemB = $secondArray[$keyOfSecondArray];
		
		if($elemA > $elemB) {
			echo "$elemA больше $elemB<br>";
		}
		elseif($elemA < $elemB) {
			echo "$elemA меньше $elemB<br>";
		}
		else {
			echo "$elemA равно $elemB<br>";
		}
		$keyOfFirstArray += 3; //каждый третий ключ массива
		$keyOfSecondArray += 2; //каждый второй ключ массива
	}
}

$firstArray = createRandomArray();
$secondArray = createRandomArray();
compareArrays($firstArray, $secondArray);
melisa's picture

да, только функцию count() лучше прописать прямо в условии:

while($keyOfFirstArray <= count($firstArray)) {
melisa's picture

принято