Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Создание переменных (https://javascript.ru/forum/dom-window/55731-sozdanie-peremennykh.html)

antonizbraniy 12.05.2015 04:35

Создание переменных
 
Здравствуйте. У меня возникла такая проблема:

Мне нужно что бы у меня было допустим четыре инпута (в первый вводиться: "x", во второй - "5"). Ниже будет третий инпут с кнопочкой. В третьем инпуте я ручками наберу к примеру: "x^2". Тогда при нажатии "ok" в четвертом инпуте появиться ответ: 25.
То есть при нажатии: "ok" программа должна подхватывать введенную мною формулу, в которую входят только что созданные мною переменные. В моей программе конечно же будет многое количестко их (инпуты будет создавать пользователь), но это уже самой собой пойдет. Мне нужно понять как сделать примитивный такой пример с четырьмя инпутами. А именно, как создавать такие переменные и подхватывать их для решения.

laimas 12.05.2015 04:55

А почему x^2=25 ?

antonizbraniy 12.05.2015 05:16

5^2 = 25

laimas 12.05.2015 05:22

5^2 = 7
ибо ^ это логическая операция XOR (исключающее ИЛИ)

0101
0010
-----
0111

antonizbraniy 12.05.2015 05:29

Ладно... в третьем инпуте я наберу: Math.pow(x,2)
Вы хотели, что бы я так исправил?

laimas 12.05.2015 05:40

Да я вообще-то ничего не хочу, но уж коли речь идет не об арифметике в школе, а об операциях языка программирования, то в JS возведение в степень Math.pow(x,2).
А если такой калькулятор да еще что хотят то и вводят, значит нужны соглашения, если вместо Math.pow(x,2) можно записать некий синоним операции.
А если так запишут Math.pow(x,2) / 3 + 12 * 50 ?

antonizbraniy 12.05.2015 05:46

608,33333333333333333

laimas 12.05.2015 05:50

Ну на калькуляторе не проблема посчитать, вопрос не в этом. На кого рассчитан этот калькулятор, и знают ли его использующие об объекте Math?
Если да, то eval().

antonizbraniy 12.05.2015 05:57

Скорее всего знают, точнее должны знать) Но всё же как это относиться к механики создания переменных и их использованию?

laimas 12.05.2015 06:02

А каких переменных, если речь идет только об одной - х?
Ну так и присваивайте ей, уже объявленной, введенное значение. Да и вообще какой смысл в них, если можно написать сразу Math.pow(5,2)?

antonizbraniy 12.05.2015 06:12

Суть в том, что у меня стоит задание создать конструктор.
Вот я сделал в пейнте что я пытаюсь объяснить: http://prntscr.com/748ur1
Будут инпуты для названий переменных и правее инпут для значений этих переменных.
Последние два инпута: для названия переменной и формулы, которая использует ранее веденные\созданные переменные. Нажатие на кнопку "OK" и вывод результата в последний инпут.
Суть такого канструтора должна быть в том, что пользователь сам задает\создает переменные и вводит нужную формулу. То есть там может быть и дискриминант, площади, объемы. Вот чего мне нужно добиться в финальном варианте.

laimas 12.05.2015 07:00

Ну а зачем тогда операцию приравнивать тоже некой переменной?
Тут не столько проблема в создании переменной, ее можно объявить и так:
<input onkeyup="window[this.value]=5;alert(a)" /> вводим в поле a, получаем 5
а в том, как строго по парам разбить элементы формы, то есть, например, четные это переменные, а нечетные это их значения, за минусом трех элементов - формулы, кнопки и поля результата.

antonizbraniy 12.05.2015 07:17

В принципе согласен. Последнее не обязательно приравнивать. Хотя, тот же дискриминант используется в последующих формулах для x1, x2. Но это уже другие дебри. Сейчас главное понять как создавать переменные и особенно как считывать введенные формулы. Вот это у меня в голове не укладывается.

antonizbraniy 12.05.2015 07:18

Вот так я пока понял как создавать инпуты. Даже могу их считать. Для вычисления дискриминанта. Но этот дискриминант должен считывать с инпута, я не должен знать его заранее (

<form>
<div id="inputi">
<div><input name="my_input"><input type="button" value="+" onclick="add_input(this.parentNode)"><input id="suma" value="0"></div>
</div>
<input id="ravno" value="0"><input type="button" value="ok" id="oki" onClick="ok()">
</form>
<script language="javascript">
function ok()
{
var l = new Array();
var summa = parseInt(document.getElementById("suma").value)+1;
var lol;
for (var i = 0; i<summa; i++)
{
l[i]=document.getElementsByName("my_input").item(i).va lue;
}
lol = Math.pow(l[2],2)-4*l[1]*l[3];
document.getElementById("ravno").value=lol;
}
// Теперь эта функция будет принимать указатель на объект, после которого нужно осуществить вставку
function add_input(obj)
{
var new_input=document.createElement('div');
new_input.innerHTML='<br>'+document.getElementById ('inputi').getElementsByTagName('div').length+'<br ><input name="my_input">';
// Дописываем рядом с input-ом кнопку, она будет добовлять элемент именно под input, рядом с которым она находится
new_input.innerHTML=new_input.innerHTML+'<input type="button" value="+" onclick="add_input(this.parentNode)">';
// И еще одна кнопочка для его удаления.
new_input.innerHTML=new_input.innerHTML+'<input type="button" value="-" onclick="del_input(this.parentNode)">';
//Ищем присутствует ли следующий узел в структуре DOM-а
if (obj.nextSibling)
// если да - то создаем после него
document.getElementById('inputi').insertBefore(new _input,obj.nextSibling)
//если такого не нашлось то просто добавляем в конец
else document.getElementById('inputi').appendChild(new_ input);
}
// А эта функция будет принимать указатель на объект, который нужно удалить
function del_input(obj)
{
document.getElementById('inputi').removeChild(obj)
}
</script>

laimas 12.05.2015 07:59

Math.pow(l[2],2)-4*l[1]*l[3] - а откуда вы знаете, что именно возведение в степень и дальнейшие операции, и именно с l[2], l[1] ... ?

antonizbraniy 12.05.2015 08:09

Не со всем понял вопрос. Ну... ведь числа заносятся поочередно. Потому и знаю, что l[1] - "a"; l[2] - "b"; l[3] - "c"; Так или иначе всё ровно она работает неправильно. Ведь я формулу дискриминанта указал в коде, а мне надо в лишнем инпуте.

laimas 12.05.2015 08:27

Выставляя код, форматируйте его, заключая в ВВ-тег, иначе читать его трудно. Но что-то не видно, чтобы был разбор строки описывающей операции, после чего можно было бы смело выполнять:

lol = Math.pow(l[2],2)-4*l[1]*l[3];

Ну даже если и "угадали", то почему переменные (и где они помещаются в массив, и где им присваиваются значения?) в выражении следуют именно в порядке l[2], l[1], l[3], или тоже угадали?

antonizbraniy 12.05.2015 08:50

В порядке они идут так, потому что по формуле b^2-4*a*c; a находиться в l[1], b в l[2], c в l[3]. Тут нечего было угадывать. Порядок соблюдается, потому что ещё в цикле эти значения ввелись по порядку.

laimas 12.05.2015 09:04

Оригинально, В порядке они идут так, потому что по формуле b^2-4*a*c;

А вы откуда знаете, что формулу ввели именно такую, а не просто c + b * a, при этом порядок объявления переменных был указан как a, b, c?

kostyanet 13.05.2015 23:21

Есть готовые лайбы токенизаторы-калькуляторы, найдите и не мучайтесь.

kostyanet 13.05.2015 23:21

Для простых случаев достаточно простой замены и eval


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