0

我正在从事创建一种计算器变体的项目。基本上,我将所有用户点击(可能是数字和运算符,如+,-)存储在一个数组中,并在用户点击“=”时将该数组交给另一个函数。我为此使用javascript。以下是我的代码:

  var arr=[]; //array of every input from the user interface stored
var i=0; //number of input clicks from the user
var opPos=[]; //position of the operator as given by the user
var operAnd=[];//operands as given by the user
var disp='';

function clearval() {

// This function clears all the values stored in related array when C or CE is pressed

    document.getElementById("op").value=0;
    arr=[];
    i=0;
    opPos=[];
    operAnd=[];
    disp='';
}


//This Function get the value and supplies the array to calculating function

function getval(inp){

    if(inp!="=")

    {
    arr[i]=inp;
    disp=disp+inp;//for display in the screen of the output screen
    document.getElementById("op").value=disp;

        if (typeof inp!="number"){
        opPos.push(i);
        operAnd.push(inp);
        }
    i++;
    }

    else
    {
    var newInput=assembler(arr,opPos,operAnd);
    clearval();
    getval(parseFloat(newInput,10));
    }

}


//<!------This Function calculates based on array, operator position and operands------!>



function assembler(num_array,opPos,operAnd){

var num='';
var numCollect=[];
var posCount=0;
for(var j=0;j<num_array.length;j++){
if (j==opPos[posCount]) {
    numCollect.push(parseFloat(num,10));
    num='';
    j++;
    posCount++;
}
else if (j>posCount) {

}
num=num+num_array[j];

}
num=parseFloat(num,10);
numCollect.push(num);
//document.getElementById("op").value= numCollect;
var newInput=calculator(numCollect,operAnd);
return newInput;
}



function calculator(target_num,operAnd) {

//    Not the nice solution but straightforward nonetheless
var result='';
for (var l=0;l<operAnd.length;l++) {
    result=result+target_num[l]+operAnd[l];
}
result=result+target_num[l];
document.getElementById("op").value=result + '=' + eval(result) ;
return eval(result);
}

我有 html 有这样的按钮:

<button class="num" onclick="getval(0)">0</button>
<button class="num" onclick="getval(1)">1</button>
<button class="num" onclick="getval(2)" >2</button>
<button class="num" onclick="getval(3)" >3</button>
......................... and so on

对于基本数学,此代码工作正常,不是问题。但是,这是我的问题,我很难考虑如何实现这一点。例如,我有一个像这样的关注按钮。

<button class='extra' onclick="Regression()"> Find Regression </button>

现在,我将拥有回归函数,它会要求用户输入回归类型(1-线性、2-二次等……这只是一个示例)。

function regression(){

clearval();
document.getElementById("op").value=" Enter the degree of regression:";

这基本上是要求用户输入数字并单击“=”进入程序。现在你可以看到我的困境了。任何用户输入都将首先由 getval() 处理,当用户单击“=”时,它将把数组传递给另一个函数,这不是我在这种情况下想要的。需要明确的是,对于这种情况,我会有很多,比如 std。dev 或类似这样的某种函数,我希望键盘表现得像普通键盘一样,并将值传递给另一个函数,而不像应该做的那样做普通的计算器工作。

我这样想吗?有什么建议么?

4

2 回答 2

2

我认为您可以通过添加另一个名为 的函数来解决此问题,该函数passval()将包含与将输入解析为浮点数等方面相同的逻辑getval(),但不会将值推送到操作数堆栈或调用该assembler函数. 它只是将按下的按钮作为一个不错的浮点值返回给.extra调用它的函数。

然后,作为.extra函数中逻辑的一部分,如Regression(),您最初会将onclick所有按钮的函数从交换getval()passval()。当回归或其他特殊功能完成时,将按钮交换回其默认行为。

于 2013-06-24T13:52:10.840 回答
1

好吧,这就是我会做的(如果我理解错了):

将您的按钮布局更改为:

<input type="button" class="num" value="0" /> 删除onclick事件

总是input type="button"<button>.

创建一个函数将事件绑定到按钮:

function bindButtonEvent(func) {
    var buttons; // Here some way to get the button in a collection from the DOM tree
    for (var i = 0; i < buttons.length; i++) { 
        buttons[i].onclick = function() { func(buttons[i]); } 
    }
}

有了这个,您将获得更改click所有按钮事件的功能。这将使您的引擎更加灵活。

您将不得不getval稍微更改您的函数以自行获取值:

function getval(el){
    var inp = el.value;

    if(inp!="=")

所以在计算器加载时,您设置点击功能:

bindButtonEvent(getval())

当你想调用一个自定义行为函数时,你再次调用绑定:

function regression() {
    bindButtonEvent(function(el) {
        value = el.value;
        // Do things

        // When done, take bindings back.
        bindButtonEvent(getval());
    });

    clearval();
    document.getElementById("op").value=" Enter the degree of regression:";
}

注意:这是一个想法。我没有测试代码。如果您对此感兴趣并且在实施时遇到错误,请告诉我,我们会修复它们。

于 2013-06-24T14:12:18.093 回答