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

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

<?php
$number = 20;
for ($i = 0; $i < $number; $i ++) { // заполняем 1-й массив
    $arrInitial[] = rand(-10, 10);
}
for ($i = 0; $i < $number; $i ++) { // заполняем 2-й массив
    $arrSecond[] = rand(-10, 10);
}
for ($i = 3; $i < $number; $i = $i + 3) { // обходим каждый 3-ой элемент массива  и заполняем новый массив $initial
    $initial[] = $arrInitial[$i];
}    
for ($i = 0; $i < count($arrSecond); $i = $i + 2) { // обходим каждый 2-ой элемент массива  и заполняем новый массив  $second  
    $second[] = $arrSecond[$i];
}
 
for ($i = 0; $i < count($initial); $i ++) { // обходим оба массива $initial и $second и делаем сравнение их значений. Кол-во проходов делаем по количеству элементов массива $initial.
    if ($initial[$i] == $second[$i]) {   
		echo "$initial[$i] равно $second[$i] <br>";
	} elseif ($initial[$i] > $second[$i]) {
        echo "$initial[$i] больше $second[$i] <br>";
    } else {
      echo "$initial[$i] меньше $second[$i] <br>";
	} 
}
?>

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

vedro-compota's picture

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

vedro-compota's picture

Вы сдесь перестраивали массивы для сравнения, попробуйте провести сравнение в одном цикле, без построения новых массивов.

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

Выкладываю код как промежуточное решение. Позже выложу код, "запакованный" в функцию.

<pre><?php
$number = 9;

for ($i = 0; $i < $number; $i ++) { // заполняем 1-й массив
    $a[] = rand(-10, 10);
}
print_r($a);

for ($i = 0; $i < $number; $i ++) { // заполняем 2-й массив
    $b[] = rand(-10, 10);
}
print_r($b);

$i = 2;
$j = 1;

while (($i < count($a)) && ($j < count($b))) {
	
	if ($a[$i] == $b[$j]) {   
		echo "$a[$i] равно $b[$j] <br>";
	} elseif ($a[$i] > $b[$j]) {
		echo "$a[$i] больше $b[$j] <br>";
	} else {
		echo "$a[$i] меньше $b[$j] <br>";
	} 
		$i = $i + 3;
		$j = $j + 2;
}

?>

<?php
function generationArray($number) // Создание массива случайных чисел
{	
	for ($i = 0; $i < $number; $i ++) { // заполняем 1-й массив
    	$arr[] = rand(-10, 10);
	}
	return $arr;
}
function comparingArrays($a, $b, $n, $m)
{
	$i = $n - 1; 	// введен поправочный параметр "-1"
	$j = $m - 1;	// введен поправочный параметр "-1"
	$initialArr = $a;
	$secondArr = $b;

	while (($i < count($initialArr)) && ($j < count($secondArr))) {

		if ($initialArr[$i] == $secondArr[$j]) {   
			echo "$initialArr[$i] равно $secondArr[$j] <br>";
		} elseif ($initialArr[$i] > $secondArr[$j]) {
			echo "$initialArr[$i] больше $secondArr[$j] <br>";
		} else {
			echo "$initialArr[$i] меньше $secondArr[$j] <br>";
		} 
		$i = $i + 3;
		$j = $j + 2;
	}
}

$number = 9; // количество элементов массива function generationArray
$n = 3;		// сравнивать каждый $n-ый элемент 1-ого массива
$m = 2;		// сравнивать каждый $m-ый элемент 2-ого массива
$a = generationArray($number);
$b = generationArray($number);
comparingArrays($a, $b, $n, $m);
?>
melisa's picture

  1. function comparingArrays($a, $b, $n, $m)

    нет смысла передавать $n и $m в качестве параметров в функцию, т.к. внутри Вы в любом случае прибавляете 3 и 2

    $i = $i + 3;
    $j = $j + 2;

    Т.е. даже если Вы передадите 8 и 9, сравнение начнётся с 8 и 9 номеров, но каждого 3 и 2, как и было.
    В качестве параметров внутрь функции стоит передавать только то, что повлияет непосредственно на её работу.

  2. $initialArr = $a;
        $secondArr = $b;

    Вы присваиваете новые имена массивам "вручную". Но можно дать эти имена уже аргументам функции, и это произойдёт автоматически.

    function compareArrays($firstArray, $secondArray)

    Почему?
    Локальная область видимости.

melisa's picture

  1. $initialArr = $a;

    inital переводится как начальный/исходный. при порядковом счёте используйте всё-таки first - первый

  2. generationArray - массив поколения. лучше arrayGeneration - генерация массива или хотя бы generateArray - сгенерировать массив.

    comparingArrays - сравнивая массивы; лучше compareArrays - сравнить массивы, ну или arrayСomparing - сравнение массивов

    Конечно, на работоспособность кода это не влияет, но влияет на его читабельность.

    Также, забегая немного вперёд, для выхода на работу программистом придётся подтянуть знания английского. Обычно требуется хотя бы уровень "могу читать документацию на английском" :)

Благодарю за проверку. Сделал исправления в части наименований сущностей и сути кода.

<pre><?php
function generateArray($number) // Создание массива случайных чисел
{   
    for ($i = 0; $i < $number; $i ++) { // заполняем массив
        $arr[] = rand(-10, 10);
    }
    return $arr;
}
function compareArrays($firstArr, $secondArr, $n, $m)
{
    $i = $n;   
    $j = $m;    
 
    while (($i < count($firstArr)) && ($j < count($secondArr))) {
 
        if ($firstArr[$i] == $secondArr[$j]) {   
            echo "$firstArr[$i] равно $secondArr[$j] <br>";
        } elseif ($firstArr[$i] > $secondArr[$j]) {
            echo "$firstArr[$i] больше $secondArr[$j] <br>";
        } else {
            echo "$firstArr[$i] меньше $secondArr[$j] <br>";
        } 
        $i = $i + 3;	// сравнивать каждый 3-ий элемент 1-ого массива
        $j = $j + 2;	// сравнивать каждый 2-ой элемент 2-ого массива
    }
}
 
$number = 9; // количество элементов массива function generateArray
$n = 0;     // начинать обход с $n-ого элемента 1-ого массива
$m = 0;     // начинать обход с $m-ого элемента 2-ого массива
$a = generateArray($number);
$b = generateArray($number);
compareArrays($a, $b, $n, $m);
?>
vedro-compota's picture

Обычно требуется хотя бы уровень "могу читать документацию на английском"

требуется это далеко не всегда и не самое главное) если что- без паники

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

melisa's picture

нет смысла передавать $n и $m в качестве параметров в функцию.

В качестве параметров внутрь функции стоит передавать только то, что повлияет непосредственно на её работу.

$n, $m - в Вашем случае, это внутренняя логика функции.

<pre><?php
function generateArray($number) // Создание массива случайных чисел
{   
    for ($i = 0; $i < $number; $i ++) { // заполняем массив
        $arr[] = rand(-10, 10);
    }
    return $arr;
}
function compareArrays($firstArr, $secondArr)
{
    $i = 2;   // начинать обход массива с 3-го элемента массива
    $j = 1;   // начинать обход массива с 2-го элемента массива
  
    while (($i < count($firstArr)) && ($j < count($secondArr))) {
  
        if ($firstArr[$i] == $secondArr[$j]) {   
            echo "$firstArr[$i] равно $secondArr[$j] <br>";
        } elseif ($firstArr[$i] > $secondArr[$j]) {
            echo "$firstArr[$i] больше $secondArr[$j] <br>";
        } else {
            echo "$firstArr[$i] меньше $secondArr[$j] <br>";
        } 
        $i = $i + 3;    // сравнивать каждый 3-ий элемент 1-ого массива
        $j = $j + 2;    // сравнивать каждый 2-ой элемент 2-ого массива
    }
}
  
$number = 12; // количество элементов массива function generateArray
$a = generateArray($number);
$b = generateArray($number);
compareArrays($a, $b);
?>
melisa's picture

принято