Как объединить два числа в стек в Javascript - PullRequest
0 голосов
/ 19 сентября 2019

Так что я бы хотел объединить два числа, если это правда.Например, если пользователь щелкнул по кнопке с номером «2» и кнопке с номером «3», он должен быть сохранен внутри стека как [«23»] вместо [«2», «3»].Будь то 23 или только 2, каждый раз, когда вы нажимаете на оператора («+», «-», «*», «/», «=»), вы должны нажать на 2-й номер.Это для калькулятора в Javascript.

Пример: Пользователь нажимает 23, +, 7 и затем =.Это должно быть сохранено как ["23", "+", "7", "="] в стеке, надеюсь, вы получите точку.

ОБНОВЛЕНО

var stack = new Array();
for (let i = 0; i < length; i++)
                {
                    buttons[i].addEventListener("click", handle);
                }

        var prevop = '';

        function handle(event)
        { 
            const value = event.target.value;
            var myFirstInput =+ value;

Я застрял здесь.

            if(prevop == '+' || prevop == '-' || prevop == '*' ||prevop == '/')
            {
                var mySecondInput =+ value;
                var input = "" + myFirstInput + myFirstInput;
                stack.push(input);
            }

            if (prevop == '=') {
                document.getElementById("textfield").value = "";
            }

            prevop = value;

            switch(value)
            {   
                case "+":
                    console.log("+ was clicked");
                    document.getElementById("textfield").value += value;
                    break;
                case "-":
                    console.log("- was clicked");
                    document.getElementById("textfield").value += value;
                    break;
                case "*":
                    console.log("* was clicked");
                    document.getElementById("textfield").value += value;
                    break;
                case "/":
                    console.log("/ was clicked");
                    document.getElementById("textfield").value += value;
                    break;
                case "=":
                    var tmp = eval(document.getElementById("textfield").value);
                    document.getElementById("textfield").value += value + tmp;
                    break;
                default:
                    console.log("%s was clicked", value);
                    document.getElementById("textfield").value += value;
            }
        }

Ответы [ 3 ]

2 голосов
/ 19 сентября 2019

Немного сложно ответить без кода, но, как я понимаю, ваша проблема заключается в том, что я предлагаю:

Пока знак + вашего калькулятора не щелкнул, вы можете объединить свои "числа строк"со знаком + (НЕ со знаком + вашего калькулятора).

Пример для первого элемента вашего массива:

"2" + "3" // "23" when 2 and 3 are clicked

Таким образом вы можете продолжать добавлять строки к первому элементувашего массива.

Затем, когда нажимается знак + вашего калькулятора или любой другой знак вычисления, вы добавляете "+" (или знак, по которому щелкнули) как строку в вашем массиве;с индексом 1. При этом 2 первых элемента вашего массива будут ["23", "+"]

. У вас может быть логика, которая проверяет, что элемент с индексом 1 вашего массива не соответствует "+" или "-"или или "/".Если это не было выбрано, вы можете продолжить добавление чисел в индекс 0. То же самое для индекса 2, если в индексе 3 не равно =.Это то, что я понимаю, ты хочешь сделать.Имеет ли это смысл?

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

function mathEval(mathString) { // this hack evaluates your math function and immediately returns a result.
  return new Function('return ' + mathString)();
}

console.log(mathEval("23+7")); // 30. You can trigger the eval when the = sign is clicked
1 голос
/ 19 сентября 2019

Я реализовал минимальный «калькулятор», который будет выполнять манипуляции со стеком, как вы описали.

https://jsbin.com/maberic/5/edit?html,js,output

window.onload = function() {
    var stack = [];
    var inputField = document.querySelector('#textfield');
    var buttons = [];
    var buttonsContainer = document.querySelector('#buttons');
    var actions = {
        'add': '+',
        'sub': '-',
        'mul': '*',
        'div': '/' // you can use custom symbols e.g. "÷" U+00F7 Division Sign Unicode Character
    };
    var buttonsHandler = function(event) {
        var button = event.target;
        var action = button.getAttribute('action');
        switch (action) {
            case 'input':
                var value = button.getAttribute('value');
                if (stack.length <= 0 || isNaN(parseInt(stack[stack.length - 1], 10))) {
                    // if empty stack or last is sign we can just push
                    stack.push(value)
                } else {
                    // else we need to concat last *number*
                    stack[stack.length - 1] += '' + value; // make sure we have a string
                }
                inputField.value += value;
                break;
            case 'action':
                var op = button.getAttribute('op');
                switch (op) {
                    case 'bs':
                        // implement here backspace logic
                        // e.g. remove last char from number or remove operator entirely
                        break;
                    case 'eq':
                        // implement here logic for "=" button
                        // avoid using eval: https://medium.com/mail-online/eval-is-evil-but-not-why-you-may-think-25961f9b01bb
                        break;
                    case 'cl':
                        stack = [];
                        inputField.value = '';
                        break;
                    default:
                        stack.push(actions[op]);
                        inputField.value += actions[op];
                        break;
                }
                break;
            default:
                break;
        }
        // here you can apply "post" actions for your stack
    };
    /* Buttons "generator" */
    [ {type: 'input', value: 1 },
      {type: 'input', value: 2 },
      {type: 'input', value: 3 },
      {type: 'linebreak' },
      {type: 'input', value: 4 },
      {type: 'input', value: 5 },
      {type: 'input', value: 6 },
      {type: 'linebreak' },
      {type: 'input', value: 7 },
      {type: 'input', value: 8 },
      {type: 'input', value: 9 },
      {type: 'linebreak' },
      {type: 'dummy' },
      {type: 'input', value: 0 },
      {type: 'dummy' },
      {type: 'linebreak' },
      {type: 'action', sign: actions.add, action: 'add'},
      {type: 'action', sign: actions.sub, action: 'sub'},
      {type: 'linebreak' },
      {type: 'action', sign: actions.mul, action: 'mul'},
      {type: 'action', sign: actions.div, action: 'div'},
      {type: 'linebreak' },
      {type: 'action', sign: '=', action: 'eq'},
      {type: 'linebreak' },
      {type: 'action', sign: '< Backspace', action: 'bs'},
      {type: 'action', sign: 'Clear', action: 'cl'} ]
    .forEach(function(elem) {
        switch(elem.type) {
            case 'input':
                var button = document.createElement('button');
                button.innerText = elem.value.toString();
                button.setAttribute('action', 'input');
                button.setAttribute('value', elem.value);
                button.onclick = buttonsHandler;
                buttonsContainer.append(button);
                buttons.push(button);
                break;
            case 'dummy':
                var dummy = document.createElement('button');
                dummy.innerText = '_';
                buttonsContainer.append(dummy);
                break;
            case 'action':
                var action = document.createElement('button');
                action.innerText = elem.sign.toString();
                action.setAttribute('action', 'action');
                action.setAttribute('op', elem.action);
                action.onclick = buttonsHandler;
                buttonsContainer.append(action);
                buttons.push(button);
                break;
            case 'linebreak':
                var br = document.createElement('br');
                buttonsContainer.append(br);
                break;
            default:
                break;
      }
    });
    /* end */
}
<!DOCTYPE html>
<html>
<head>
    <meta name="description" content="Simple calc template">
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width"/>
    <title>Example</title>
</head>
<body>
    <input id="textfield" type="text" readonly="readonly"/>
    <br/>
    <div id="buttons"></div>
</body>
</html>

Кроме того, я бы рекомендовал вам не использовать eval: https://medium.com/@epoberezkin/eval-is-evil-but-not-why-you-may-think-25961f9b01bb

Вы можете работать со своим стеком.Но нужно помнить о умножении, делении и т. Д. О порядке действий.

0 голосов
/ 19 сентября 2019

Вы можете проверить, является ли значение ключа числовым, и на основании этого вы можете сделать выбор:

let fooArray = ["2", "3", "+", "7", "=" ]

function testFunction(keyVal) {
    let someArray = [];
    fooArray.forEach((f, i) => {
        if (i != 0) {
            let toBeInserted = fooArray[i - 1];
            if ( isNumeric(f) && isNumeric(toBeInserted)) {
                someArray.push(`${toBeInserted}${f}`);
            } else {
                someArray.push(f);
            }
        } else {
            someArray.push(f);
        }
    });

    return someArray;
}

function isNumeric(n) {
    return !isNaN(parseFloat(n)) && isFinite(n);
}

console.log(testFunction(fooArray));
...