Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Нужна помощь со строковым калькулятором на JS (https://javascript.ru/forum/misc/70735-nuzhna-pomoshh-so-strokovym-kalkulyatorom-na-js.html)

Ольга Мартова 28.09.2017 21:11

Нужна помощь со строковым калькулятором на JS
 
Я сама новичок и мне дали задание написать строчный калькулятор который будет принимать выражения вида '23 - 7 * 34 + 2 / sin30'.
Прогоняю все через цикл по приоритетным знакам и потом беру число до знака и после, после чего совершаю операцию и заменяю в строке старые числа на результат. Понимаю что реализация не самая дешевая,но мне сказали сделать как могу.
Первая проблема в том что функция получается чувствительна к пробелам и распознает числа от знаков только если пробелы четко все разделяют. От этого возникает вторая проблема — вычисление синусов-косинусов.
Помогите пожалуйста, ибо пока не обладаю такими мозго-ресурсами для решения:cray:

j0hnik 28.09.2017 21:37

может лучше присмотреться к eval и Math

https://developer.mozilla.org/ru/doc...l_Objects/eval

https://developer.mozilla.org/ru/doc...l_Objects/Math

void() 28.09.2017 23:28

С eval и Math будет все намного проще. Правда подозреваю, что это не то, что вам нужно.

Вот такие примеры решает:
23 - 7 * 34 + 2 / Math.sin(30)


<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<input type="text" id="calc">
	<button onclick="calc()">Решить</button>
	<div id="result"></div>
	<script>
		function calc(){
			var calc = document.getElementById('calc').value;
			var result = document.getElementById('result');
			result.innerHTML = eval(calc);
		}
	</script>
</body>
</html>

Alexandroppolus 28.09.2017 23:52

Цитата:

Сообщение от Ольга Мартова
sin30

Здесь точно не sin(30) ?

SV0L0CH 29.09.2017 10:48

function calc(v){
  try{
    with(Math){
      return eval(v.replace(/[\d\.]+/g,  a=>"("+a+")"));
    }
  }catch(e){
    return e.toString();
  }
}
alert(calc(prompt("Чего считать?")));

Alexandroppolus 29.09.2017 13:31

"with" запрещен в strict mode, да и eval - не фонтан.

имхо, песочницу лучше соорудить через new Function. Хотя, букв будет больше )

SV0L0CH 29.09.2017 14:13

Alexandroppolus,
Как через new Function и без with задействовать всё содержимое Math? Всё в window скопировать что-ли? Или изобрести регулярку которая будет детектить куда подставлять префикс "Math."?
Не громоздковато ли будет?

Alexandroppolus 29.09.2017 14:20

Цитата:

Сообщение от SV0L0CH
Не громоздковато ли будет?

немного громоздковато, но в пределах разумного.

var str = '23 - 7 * 34 + 2 / sin(30)';
var mathKeys = Object.getOwnPropertyNames(Math);
var mathValues = mathKeys.map(function(key) { return Math[key]; });
var result = Function(mathKeys, 'return (' + str + ');').apply(null, mathValues);
alert(result);

SV0L0CH 29.09.2017 14:29

Я и забыл что можно использовать список аргументов в конструкторе Function :-?


Часовой пояс GMT +3, время: 14:17.