2012-01-26 1 views
0

Я пытаюсь получить программу, чтобы повторить, пока переменная $ head и $ tails больше, чем 0. Я не могу понять, что я делаю неправильно. Цикл while всегда прерывается после одной итерации.Итерация ломается до того, как я хочу ее

<?php 
echo "<table border=\"1\">"; 
echo "<tr><td>Person</td><td>Heads</td><td>Tails</td><td>Total</td></tr>"; 



for ($person=1; $person < 11; $person++){ 
echo "<tr><td>Person $person </td>"; 
$both = 0; 
$heads = 0; 
$tails = 0; 
$total = 0; 
while ($both < 1){ 
    do { 
     $total++; 
     $random = rand(1,2); 
     if ($random == 1){ 
      $heads++; 
     } else{ 
      $tails++; 
     } 
    } while (($tails < 0) && ($heads < 0)); 
    $both = 1; 

} 
echo "<td>$heads</td><td>$tails</td><td>$total</td>"; 
echo "</tr>"; 

} 

echo "</table>"; 

?> 

ответ

2

В этой строке

} while (($tails < 0) && ($heads < 0)); 

это кажется, что ни $tails, ни $heads никогда не будет строго меньше 0, так что всегда будет ложным. Попробуйте <= 0 для обоих.

Кроме того, логично, вы хотите снова зацикливаться, если либо этих условий является истинным, не так ли? Поэтому используйте || вместо &&.

Результат:

} while (($tails <= 0) || ($heads <= 0)); 

Кроме того, я немного любопытно о петле while ($both < 1). По-видимому, перед циклом вы назначаете $both = 0, и вы назначаете $both = 1 в конце своей итерации. Это гарантирует, что цикл выполняется только один раз, и в этом случае - в чем смысл иметь этот цикл? Возможно, это просто незавершенный код на данный момент?

+0

Работал красиво. Огромное спасибо. Я не уверен, почему я думал, что это оператор &&! – stytown

+0

Для вашего вопроса он присваивает $ both = 1 только после того, как как $ хвосты, так и $ head больше 0. – stytown

+1

@stytown Правильно, но вы не выйдете из этого внутреннего цикла, пока оба '$ хвоста' и' $ head' не будут больше, чем '0', так что вы никогда не будете запускать внешний цикл более одного раза. – Wiseguy

0

Таким образом, вы хотите сохранить переворачивающиеся монеты, пока не получите хотя бы одну головку и хотя бы один хвост? И в то же время следить за тем, сколько раз вы перевернули?

Я бы закодированы так:

$heads = 0; 
$tails = 0; 
$total = 0; 

while(true) { 
    $total ++; 
    $random = rand(0, 1); // 0 for tail, 1 for head 
    if($random) $heads ++; 
    else   $tails ++; 

    if($heads >= 1 && $tails >= 1) break; 
} 

Петля пока будет продолжать работать бесконечно, пока оба $ головы и $ хвосты становятся одним или больше.

+0

На мой взгляд, этот код более читабельен и чище, но Wiseguy действительно исправил проблему в вашем коде. – hobbes3

+2

wont $ random всегда оценивает true в выражении if? – ppp

+0

В этом случае, как он будет знать, какую переменную ($ head или $ tails) добавить? – stytown

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