2013-07-17 3 views
1

Может ли цикл do-while иметь несколько условий? Если это так, я не могу понять, почему приведенный ниже код не работает на всех, кроме первого условия.Loop с несколькими условиями

Функции, используемые ...

function gcf($a,$b) { 
$a = abs($a); $b = abs($b); 
if($a < $b) list($b,$a) = Array($a,$b); 
if($b == 0) return $a; 
$r = $a % $b; 
while($r > 0) { 
    $a = $b; 
    $b = $r; 
    $r = $a % $b; 
} 
return $b; 
} 


function factors($n){ 
$factors_array = array(); 
for ($x = 1; $x <= sqrt(abs($n)); $x++) 
{ 
    if ($n % $x == 0) 
    { 
     $z = $n/$x; 
     array_push($factors_array, $x, $z); 
    } 
} 
return $factors_array; 
} 

Код ...

$a = $b; 

do{ 
    $a = mt_rand(8, 100); 
    $a_factors_array = factors($a); 

    $b = mt_rand(8, 100); 
    $b_factors_array = factors($b); 

} while ($a == $b && count($a_factors_array) < 4 && count($b_factors_array) < 4 && gcf($a, $b) == 1); 

echo $a . '<br>'; 
echo $b . '<br>'; 

echo count($a_factors_array) . '<br>'; 
echo count($b_factors_array) . '<br>'; 

echo gcf($a, $b) . '<br>'; 

Я продолжаю получать номера за $ а и $ Ь, которые имеют менее 4 факторов и имеют GCF от 1. Есть идеи?

+0

Whoa whoa whoa. Я думаю, что 'while ($ a == $ b &&' может быть неправильным. Я думаю, что вы имели в виду 'while ($ a == $ b || (otherstuff)),'. В противном случае вы остановитесь после первого прохода, A <> B. –

ответ

2

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

+0

Gahhh !!! Right || вместо &&. Циклы Do-while являются логически отсталыми от регулярных циклов. Спасибо. – gtilflm

+0

Вы можете изменить каждое из условий и использовать '&&'. Например, $ check = $ a! = $ b && (count ($ a_factors_array)> = 4) ...; '. Тогда в цикле напишите' while ($ check === false) '. Поэтому вместо того, чтобы писать' while любая проверка не срабатывает «вы пишете», в то время как не все проверки в порядке ». Это делает ее немного легче читать. И вы можете сделать это без дополнительной переменной: просто поместите все условие в дополнительные круглые скобки и добавьте' === false 'после этого. Но я думаю, что это еще более читаемо для использования дополнительной переменной – GolezTrol

0

Я думаю, что у вас есть, где вы логические значения AND означали ОШ:

do{ 
    $a = mt_rand(8, 100); 
    $a_factors_array = factors($a); 

    $b = mt_rand(8, 100); 
    $b_factors_array = factors($b); 

} while ($a == $b || count($a_factors_array) < 4 || count($b_factors_array) < 4 || gcf($a, $b) == 1); 

С путем, то while останавливается, если $a !== $b, который, вероятно, не то, что вы хотите.

Смежные вопросы