$op) exit("Вы ошиблись в расстановке скобок."); $i++; } while ($cl !== substr_count($expr, ')')); } else exit("Вы ошиблись в расстановке скобок."); } // Функция вычисляет зн-е простого выр-я, без скобок. function calculate($arr) { $arr[1] = str_replace(array('+-','-+'), array('-', '-'), $arr[1]); $arr[1] = str_replace('--', '+', $arr[1]); while (preg_match("#/|\*#", $arr[1])) $arr[1] = preg_replace_callback("#((-|\+)?[\d\.]+)(\*|/)((-|\+)?[\d\.]+)#", "operation", $arr[1], 1); while (preg_match("#\d(-|\+)\d#", $arr[1])) $arr[1] = preg_replace_callback("#((-|\+)?[\d\.]+)(-|\+)(-?[\d\.]+)#", "operation", $arr[1], 1); return $arr[1]; } // Выполняет действия над двумя числами. function operation($arr) { $a = (float)$arr[1]; $b = (float)$arr[4]; switch ($arr[3]) { case '+': $res = $a + $b; break; case '-': $res = $a - $b; break; case '*': $res = $a * $b; break; case '/': $res = ($b != 0) ? $a / $b: exit("Ошибка деления на ноль."); break; } return $res > 0 ? '+'.$res : $res; } ?>