Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.09.2017, 21:11
Новичок на форуме
Отправить личное сообщение для Ольга Мартова Посмотреть профиль Найти все сообщения от Ольга Мартова
 
Регистрация: 28.09.2017
Сообщений: 1

Нужна помощь со строковым калькулятором на JS
Я сама новичок и мне дали задание написать строчный калькулятор который будет принимать выражения вида '23 - 7 * 34 + 2 / sin30'.
Прогоняю все через цикл по приоритетным знакам и потом беру число до знака и после, после чего совершаю операцию и заменяю в строке старые числа на результат. Понимаю что реализация не самая дешевая,но мне сказали сделать как могу.
Первая проблема в том что функция получается чувствительна к пробелам и распознает числа от знаков только если пробелы четко все разделяют. От этого возникает вторая проблема — вычисление синусов-косинусов.
Помогите пожалуйста, ибо пока не обладаю такими мозго-ресурсами для решения
Ответить с цитированием
  #2 (permalink)  
Старый 28.09.2017, 21:37
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

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

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

https://developer.mozilla.org/ru/doc...l_Objects/Math
Ответить с цитированием
  #3 (permalink)  
Старый 28.09.2017, 23:28
Аватар для void()
Профессор
Отправить личное сообщение для void() Посмотреть профиль Найти все сообщения от void()
 
Регистрация: 11.08.2017
Сообщений: 208

С 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>

Последний раз редактировалось void(), 28.09.2017 в 23:47.
Ответить с цитированием
  #4 (permalink)  
Старый 28.09.2017, 23:52
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от Ольга Мартова
sin30
Здесь точно не sin(30) ?
Ответить с цитированием
  #5 (permalink)  
Старый 29.09.2017, 10:48
Профессор
Отправить личное сообщение для SV0L0CH Посмотреть профиль Найти все сообщения от SV0L0CH
 
Регистрация: 07.11.2010
Сообщений: 301

function calc(v){
  try{
    with(Math){
      return eval(v.replace(/[\d\.]+/g,  a=>"("+a+")"));
    }
  }catch(e){
    return e.toString();
  }
}
alert(calc(prompt("Чего считать?")));
Ответить с цитированием
  #6 (permalink)  
Старый 29.09.2017, 13:31
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

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

имхо, песочницу лучше соорудить через new Function. Хотя, букв будет больше )
Ответить с цитированием
  #7 (permalink)  
Старый 29.09.2017, 14:13
Профессор
Отправить личное сообщение для SV0L0CH Посмотреть профиль Найти все сообщения от SV0L0CH
 
Регистрация: 07.11.2010
Сообщений: 301

Alexandroppolus,
Как через new Function и без with задействовать всё содержимое Math? Всё в window скопировать что-ли? Или изобрести регулярку которая будет детектить куда подставлять префикс "Math."?
Не громоздковато ли будет?
Ответить с цитированием
  #8 (permalink)  
Старый 29.09.2017, 14:20
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от 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);
Ответить с цитированием
  #9 (permalink)  
Старый 29.09.2017, 14:29
Профессор
Отправить личное сообщение для SV0L0CH Посмотреть профиль Найти все сообщения от SV0L0CH
 
Регистрация: 07.11.2010
Сообщений: 301

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужна помощь по JS и JQuery cema93 Работа 1 16.12.2014 19:41
Нужна помощь по снятию ограничения прога"Размеры" SerfUA jQuery 3 29.07.2014 16:57
Нужна помощь в написании кода на JS windoffreedom Общие вопросы Javascript 5 28.07.2014 16:56
Нужна помощь по слайдеру seoguru Работа 3 28.01.2013 22:02
Кроссдоменный GET запрос. Нужна помощь! notxcain AJAX и COMET 4 07.12.2008 20:55