Autor Zpráva
janbarasek
Profil
Ahoj,
přemýšlel jsem jak udělat jednoduchou kalkulačku a napadlo mě použití funkce eval.

Vím, že není zrovna bezpečná, ale já jí dosazuji konkrétní řetězce k počítání, takže to až tak moc neřeším a validitu zadaných dat kontroluji regulárním výrazem ještě předtím, než je do funkce vůbec pustím. Nicméně mi nastal jeden problém.

Rád bych ověřil, zda lze daná matematická funkce řešit jako "sudá", tj. jestli předpis f(x) vrací stejnou hodnotu jako f(-x).
Moje řešení:

function suda($q) {
    $qa = str_replace("x", 3, $q);
    eval('$ra = ('.$ga.');');
    $qb = str_replace("x", -3, $q);
    eval('$rb = ('.$qb.');');
    echo $ra.' ('.$qa.'), '.$rb.' ('.$qb.')';
    if (round($ra) == round($rb)) { return true; } else { return false; }
}

Pokud vložím řetězec, na př. "x*x", tak se v ECHU vypíše toto (všimněte se vkládaných příkladů k vyřešení):
 (3*3), 9 (-3*-3)

Funkce Eval pak vrací tuto chybu:
Parse error: syntax error, unexpected ')' in /var/www/logitron/box/function.php(4) : eval()'d code on line 1

Nějak to nechápu. Proč se funkce jednou vyřeší správně a podruhé ne, když má jen jiné čísla? To je PHP opravdu tak magické?
DJ Miky
Profil
Do evalu vkládáš proměnnou $ga místo $qa. Nicméně mnohem bezpečnější než použít eval bude napsat si vlastní vyhodnocování, není to vůbec složité.
janbarasek
Profil
DJ Miky:
proměnnou $ga místo $qa
Díky, lol.. :)

Je to složité, zkoušel jsem to přes rozdělení příkladu do stromu. Chci aby to umělo řešit zanořování závorek, libovolně složité příklady, bralo to ohled na násobení před sčítáním a tak dále...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: