• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pętla DO WHILE i problem z warunkiem :/

Object Storage Arubacloud
0 głosów
242 wizyt
pytanie zadane 31 maja 2017 w PHP przez Amiga4ever Użytkownik (570 p.)
Napisałem prosty kod na zasadzie losowania (coś jak lotto) i nie mogę zmusić do działania warunku połączonego z wielokrotnym "and". Pętla kończy działania jak tylko 1 liczba z 5 jest taka sama zamiast 5 z 5.

 

<?php

$c = rand(1,50);
$w = rand(1,50);
$e = rand(1,50);
$r = rand(1,50);
$t = rand(1,50);

losuj($c,$w,$e,$r,$t);

function losuj($c,$w,$e,$r,$t)
{

$ile=1;

$c1 = rand(1,50);
$w1 = rand(1,50);
$e1 = rand(1,50);
$r1 = rand(1,50);
$t1 = rand(1,50);

do
{
$c1 = rand(1,50);
$w1 = rand(1,50);
$e1 = rand(1,50);
$r1 = rand(1,50);
$t1 = rand(1,50);
$ile++;
}
while(($c!=$c1)&&($w!=$w1)&&($e!=$e1)&&($r!=$r1)&&($t!=$t1));

echo "</br>";
echo $ile;
echo "</br>";
echo "koniec";
echo "</br>";
echo $c."=".$c1;
echo "</br>";
echo $w."=".$w1;
echo "</br>";
echo $e."=".$e1;
echo "</br>";
echo $r."=".$r1;
echo "</br>";
echo $t."=".$t1;
echo "</br>";
}
?>

 

Warunek wydaje sie jak najbardziej poprawny więc czemu nie trybi?

1 odpowiedź

+1 głos
odpowiedź 1 czerwca 2017 przez OfftheCode Gaduła (4,050 p.)
Spójrz na warunek w pętli do{}whil(). Brzmi on:
Jeśli c i c1 nie są równe AND w i w1 nie sa równe AND e i e1 nie są równe itd. ...
Jeżeli więc chociaż jedna para będzie będzie się zgadzać dajmy na to w i w1 to:
c i c1 dają true, gdyż sprawdzasz czy się różnią, natomiast w i w1 dają false gdyż sprawdzasz czy się różnią. W tej chwili cały warunek zwróci false gdyż operatory logiczny to AND.
Rozwiązanie jakie powinieneś zastosowac to operator logiczny OR w warunku pętli dzięki czemu tylko w przypadku gdy, żaden z tych warunków się nie spełni pętla nie wykona się ponownie.
Mam nadzieję, że wytłumaczyłem w miarę zrozumiale chociaż jest dosyć późno więc jeśli czegoś nie rozumiesz to śmiało pisz :D
komentarz 1 czerwca 2017 przez Amiga4ever Użytkownik (570 p.)
edycja 1 czerwca 2017 przez Amiga4ever
No tak teraz załapalem. To inaczej działa niż if gdy stosując operator "and" wszystko na raz musi być spełnione dlatego pomyślałem o tym samym.Tylko teraz zawsze po 3297 próbach znajduje te same liczby. Jak to jest możliwe?
komentarz 1 czerwca 2017 przez OfftheCode Gaduła (4,050 p.)
Hmmmmm szczerze mówiąc nie jestem specem od PHP, ale przy tak dużej ilości jaka jest wykonywana być może jakaś zmienna się przepełnia czy coś w tym stylu trzeba zajrzeć do dokumentacji php, albo poszukać w necie jak znajdę chwile to postaram się odszukać źródło.
komentarz 1 czerwca 2017 przez Amiga4ever Użytkownik (570 p.)
Też o tym myślałem,  że zmienna $i w tym przypadku nie mieści więcej,  ale w php nie da się zadeklarować konkretnej. Ustalana jest automatycznie.
1
komentarz 1 czerwca 2017 przez Amiga4ever Użytkownik (570 p.)
Już rozwiązałem problem. Zrobiłem to na zasadzie tablic i wreszcie działa. Trafienie 5 liczb z puli 50 w grze euromilion wynosi jak 1 do 2 milionów. :)

<?php

$lotto1 = array();

for($i=1;$i<51;$i++)
{
array_push($lotto1, $i);
}

shuffle($lotto1);

$c = $lotto1[0];
$w = $lotto1[1];
$e = $lotto1[2];
$r = $lotto1[3];
$t = $lotto1[4];

losuj($c,$w,$e,$r,$t);

function losuj($c,$w,$e,$r,$t)
{

$lotto = array();

array_push($lotto, $c);
array_push($lotto, $w);
array_push($lotto, $e);
array_push($lotto, $r);
array_push($lotto, $t);

$ile=1;

$lotto2 = array();

for($a=1;$a<51;$a++)
{
array_push($lotto2, $a);
}

shuffle($lotto2);

$c1 = $lotto2[0];
$w1 = $lotto2[1];
$e1 = $lotto2[2];
$r1 = $lotto2[3];
$t1 = $lotto2[4];

do
{
shuffle($lotto2);
$c1 = $lotto2[0];
$w1 = $lotto2[1];
$e1 = $lotto2[2];
$r1 = $lotto2[3];
$t1 = $lotto2[4];
$ile++;
}

while ((!in_array($c1, $lotto))||(!in_array($w1, $lotto))||(!in_array($e1, $lotto))||(!in_array($r1, $lotto))||(!in_array($t1, $lotto)));

echo "</br>";
echo $ile;
echo "</br>";
echo "koniec";
echo "</br>";
echo $c."=".$c1;
echo "</br>";
echo $w."=".$w1;
echo "</br>";
echo $e."=".$e1;
echo "</br>";
echo $r."=".$r1;
echo "</br>";
echo $t."=".$t1;
echo "</br>";
}
?>
komentarz 1 czerwca 2017 przez OfftheCode Gaduła (4,050 p.)
Brawo Ty :D!
komentarz 1 czerwca 2017 przez Amiga4ever Użytkownik (570 p.)
Jeszcze raz dzięki za pomoc z warunkiem.
komentarz 1 czerwca 2017 przez OfftheCode Gaduła (4,050 p.)
Nie ma sprawy, po to jest forum :D

Podobne pytania

+1 głos
1 odpowiedź 163 wizyt
pytanie zadane 22 stycznia 2022 w PHP przez kubekszklany Gaduła (3,190 p.)
0 głosów
1 odpowiedź 790 wizyt
+1 głos
2 odpowiedzi 263 wizyt
pytanie zadane 22 maja 2023 w C i C++ przez Igor4567 Nowicjusz (170 p.)

92,581 zapytań

141,433 odpowiedzi

319,666 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...