<?php
/*Написать программу, имитирующую работу обычного кнопочного калькулятора. Калькулятору на вход даётся строка, содержащая целые числа и знаки "+", "-", "*", "=". По знаку "=" калькулятор выводит ответ.
Поядок действий не соблюдается (как и в обычном калькуляторе), т.е. 2+2*2= выведет 8.
*/
$exampleError_1 = "17+34d=";
$exampleError_2 = "7**134=";
$exampleError_3 = "346-23";
$exampleError_4 = "+346-2=";
$exampleError_5 = "7++134=";
$exampleError_6 = "=987*13=";
$exampleError_7 = "65437=3654=";
$exampleError_8 = "6437=364-95=";
$example_0 = "17+1981=";//1998
$example_1 = "678-34=";//644
$example_2 = "43*9=";//387
$example_3 = "30*7=";//210
$example_4 = "90000-220=";//89780
$example_5 = "24-33=";//-9
$example_6 = "1+2+3*10-5+6-7+8*2=";//124
$example_10 = "2+2*2=";//8
$example_11 = "243+6743-78*2=";//13816
//функция-калькулятор
function calc ($example)
{//начинает ф-цию
$number = 0; //Текущее число, которое набирает пользователь
$result = 0; //Результат предыдущих действий
$op = ""; //Предыдущая операция (+,-,*)
$inputLength = mb_strlen($example);//длина строки $correctExample = 1;//флаг сбрасывется, если в записи примера ошибка
$notSign = 0;//флаг сбрасывется, если символ является арифметическим знаком
for ($i = 0; $i < $inputLength; $i++)
{//начинает for
$char = mb_substr($example, $i, 1);//mb_substr возвращает часть строки $example, начиная с $i-го символа, длина возвращаемой субстроки 1 символ if ($char == "*" || $char == "+" || $char == "-" || $char == "=")
{//начинает if
$correctExample = $notSign * $correctExample;//если подряд 2 арифметических знака или если пример начинается с арифметического знака, то пример неправильный
$notSign = 0;
if ($op == "*") $result = $result * $number; //если умножение
elseif ($op == "+") $result = $result + $number;//если сложение
elseif ($op == "-") $result = $result - $number; //если вычитание
elseif ($op == "") $result = $number; //если первое число в прмере
else $correctExample = 0; //если "=" внутри примера
$op = $char;//обновляем арифметический оператор
$number = 0;//сбрасываем текущее число
}//заканчивает if
elseif (is_numeric($char))//is_numeric проверяет, является ли $char числом (в том числе строкой из цифр) {//начинает elseif
$number = ($number * 10) + intval($char);//intval преобразует строку из цифр в число $notSign = 1;//символ не является арифметическим знаком
}//заканчивает elseif
else
$correctExample = 0;//если символ не является арифметическим знаком или цифрой, то пример неправильный
}//заканчивает for
if (($correctExample != 0) && ($op == "="))//если последний знак не "=", то пример неправильный
echo "Отвтет: {$example}{$result}\n";
else
echo "Неправильный пример: {$example}\n";
}//заканчивает ф-цию
calc ($example_0);//1998
calc ($example_1);//644
calc ($example_2);//387
calc ($example_3);//210
calc ($example_4);//89780
calc ($example_5);//-9
calc ($example_6);//124
calc ($example_10);//8
calc ($example_11);//13816
calc ($exampleError_1);
calc ($exampleError_2);
calc ($exampleError_3);
calc ($exampleError_4);
calc ($exampleError_5);
calc ($exampleError_6);
calc ($exampleError_7);
calc ($exampleError_8);
?>