fork download
  1. <?php
  2.  
  3.  
  4. /*Написать программу, имитирующую работу обычного кнопочного калькулятора. Калькулятору на вход даётся строка, содержащая целые числа и знаки "+", "-", "*", "=". По знаку "=" калькулятор выводит ответ.
  5.  
  6. Поядок действий не соблюдается (как и в обычном калькуляторе), т.е. 2+2*2= выведет 8.
  7. */
  8.  
  9. $exampleError_1 = "17+34d=";
  10. $exampleError_2 = "7**134=";
  11. $exampleError_3 = "346-23";
  12. $exampleError_4 = "+346-2=";
  13. $exampleError_5 = "7++134=";
  14. $exampleError_6 = "=987*13=";
  15. $exampleError_7 = "65437=3654=";
  16. $exampleError_8 = "6437=364-95=";
  17.  
  18. $example_0 = "17+1981=";//1998
  19. $example_1 = "678-34=";//644
  20. $example_2 = "43*9=";//387
  21. $example_3 = "30*7=";//210
  22. $example_4 = "90000-220=";//89780
  23. $example_5 = "24-33=";//-9
  24. $example_6 = "1+2+3*10-5+6-7+8*2=";//124
  25.  
  26. $example_10 = "2+2*2=";//8
  27. $example_11 = "243+6743-78*2=";//13816
  28.  
  29. //функция-калькулятор
  30. function calc ($example)
  31. {//начинает ф-цию
  32. $number = 0; //Текущее число, которое набирает пользователь
  33. $result = 0; //Результат предыдущих действий
  34. $op = ""; //Предыдущая операция (+,-,*)
  35. $inputLength = mb_strlen($example);//длина строки
  36. $correctExample = 1;//флаг сбрасывется, если в записи примера ошибка
  37. $notSign = 0;//флаг сбрасывется, если символ является арифметическим знаком
  38. for ($i = 0; $i < $inputLength; $i++)
  39. {//начинает for
  40. $char = mb_substr($example, $i, 1);//mb_substr возвращает часть строки $example, начиная с $i-го символа, длина возвращаемой субстроки 1 символ
  41. if ($char == "*" || $char == "+" || $char == "-" || $char == "=")
  42. {//начинает if
  43. $correctExample = $notSign * $correctExample;//если подряд 2 арифметических знака или если пример начинается с арифметического знака, то пример неправильный
  44. $notSign = 0;
  45. if ($op == "*") $result = $result * $number; //если умножение
  46. elseif ($op == "+") $result = $result + $number;//если сложение
  47. elseif ($op == "-") $result = $result - $number; //если вычитание
  48. elseif ($op == "") $result = $number; //если первое число в прмере
  49. else $correctExample = 0; //если "=" внутри примера
  50. $op = $char;//обновляем арифметический оператор
  51. $number = 0;//сбрасываем текущее число
  52. }//заканчивает if
  53. elseif (is_numeric($char))//is_numeric проверяет, является ли $char числом (в том числе строкой из цифр)
  54. {//начинает elseif
  55. $number = ($number * 10) + intval($char);//intval преобразует строку из цифр в число
  56. $notSign = 1;//символ не является арифметическим знаком
  57. }//заканчивает elseif
  58. else
  59. $correctExample = 0;//если символ не является арифметическим знаком или цифрой, то пример неправильный
  60. }//заканчивает for
  61. if (($correctExample != 0) && ($op == "="))//если последний знак не "=", то пример неправильный
  62. echo "Отвтет: {$example}{$result}\n";
  63. else
  64. echo "Неправильный пример: {$example}\n";
  65. }//заканчивает ф-цию
  66.  
  67. calc ($example_0);//1998
  68. calc ($example_1);//644
  69. calc ($example_2);//387
  70. calc ($example_3);//210
  71. calc ($example_4);//89780
  72. calc ($example_5);//-9
  73. calc ($example_6);//124
  74.  
  75. calc ($example_10);//8
  76. calc ($example_11);//13816
  77.  
  78. calc ($exampleError_1);
  79. calc ($exampleError_2);
  80. calc ($exampleError_3);
  81. calc ($exampleError_4);
  82. calc ($exampleError_5);
  83. calc ($exampleError_6);
  84. calc ($exampleError_7);
  85. calc ($exampleError_8);
  86.  
  87. ?>
Success #stdin #stdout 0.02s 25940KB
stdin
25<<2
stdout
Отвтет: 17+1981=1998
Отвтет: 678-34=644
Отвтет: 43*9=387
Отвтет: 30*7=210
Отвтет: 90000-220=89780
Отвтет: 24-33=-9
Отвтет: 1+2+3*10-5+6-7+8*2=124
Отвтет: 2+2*2=8
Отвтет: 243+6743-78*2=13816
Неправильный пример: 17+34d=
Неправильный пример: 7**134=
Неправильный пример: 346-23
Неправильный пример: +346-2=
Неправильный пример: 7++134=
Неправильный пример: =987*13=
Неправильный пример: 65437=3654=
Неправильный пример: 6437=364-95=