尝试使用 JavaScript 制作计算器但不知道如何定义大小写
Trying to make a calculator using JavaScript but don't know how to define cases
如何获取 number1 中的数字和 number2 中的数字以及 symbol1 symbol2 中的符号以及如何设置条件,例如第一个输入不应该是运算符,或者如果有多个运算符则出现 return 错误?我是第一次发帖,所以如果看起来不干净请见谅。
这是我的 js:
这是我指定的点击次数:
function clearCalculator()
{
document.querySelector("#result").value = '';
}
function printInteger(inputFromCalculator)
{
document.querySelector("#result").value += inputFromCalculator;
}
function printSymbol(inputFromCalculator)
{
document.querySelector("#result").value += inputFromCalculator;
}
function printFinalOutput()
{
var expression = document.querySelector("#result").value;
expression+="=";
//expression 22+32+22=
if(sanityCheck(expression)==true)
{
divideAndConquer(expression);
}
}
我在这里尝试将整数放入 var number1 和 number2 中,将运算符放入 var symbol1 和 symbol2 中:
function divideAndConquer(expression)
{
var number1;
var number2;
var symbol1;
var symbol2;
var miniExpressionLength;
var partialOutput;
for(var i=0;i<expression.length;i++)
{
if(isNumber(expression[i])==true && number1==null)
{
number1=expression[i];
//logs number1 as single string
}
else
{
if(isNumber(expression[i])==true && number1!=null && symbol1==null)
{
number1 = number1 + expression[i];
}
}
if(symbol1!=null && number1!=null && isNumber(expression[i])==true && number2==null)
{
number2 = expression[i];
}
else
{
if(symbol1!=null && number1!=null && isNumber(expression[i])==true && number2!=null && symbol2==null)
{
number2 = number2 + expression[i];
}
}
if(isSymbol(expression[i])==true && symbol1==null)
{
symbol1=expression[i];
}
else
{
if(isSymbol(expression[i])==true && symbol1!=null)
{
symbol2=expression[i];
}
}if(symbol2!=null)
{
miniExpressionLength = i;
//console.log("length of mini expression ="+i)
break;
}
}
partialOutput = calculate(number1,number2,symbol1);
expression = partialOutput+""+expression.substring(miniExpressionLength,expression.length);
if(symbol1!=null)
{
divideAndConquer(expression);
}
else
{
console.log("expression ="+expression);
return expression;
}
}
这里我指定了一些案例:
function sanityCheck(expression)
{
//case example +2+2
if(isNumber(expression[0])==false)
{
alert("invalid expression");
return false;
}
for(var i=0;i<expression.length;i++)
{
//case example 2++2
if(isSymbol(expression[i])==true && isSymbol(expression[i+1])==true)
{
alert("invalid expression");
return false;
}
}
return true;
}
解析数学表达式不是一项简单的任务,超出了答案的范围。有几个库提供解析。
如果您想出于学习目的这样做,您应该看看:
- 逆波兰表示法
- 抽象语法树
- Shunting-yard算法
这里有一个很好的博客 post 可以帮助您入门:
https://www.freecodecamp.org/news/parsing-math-expressions-with-javascript-7e8f5572276e/
首先,请注意,在“if 语句”中,如果结果已经是布尔值,则无需使用“==”
if(isNumber(expression[0]) == false) {
可以直接使用表达式:
if(!isNumber(expression[0])) {
注意“!” (非门)在句子的开头,
如果结果已经为假,则通过。
我强烈建议您使用 ES6 数组功能。
https://medium.com/poka-techblog/simplify-your-javascript-use-map-reduce-and-filter-bd02c593cc2d
sanityCheck 条件:
- 第一个字符必须是数字
- 之后它必须遵循顺序 Symbol-Number-Symbol-Number...
所以你可以使用这样的正则表达式:
^\d+([+\-\/\*]\d+)+$
(这里自己测试https://regex101.com/)
注意:这仅适用于整数。
function sanityCheck(expression)
{
const sanityExpresion = /^\d+([+\-\/\*]\d+)+$/
return sanityExpresion.test(expression);
}
你可以为 divideAndConquer 函数做这样的事情:
function divideAndConquer(expresion) {
const symbolSeparation = /[+\-\/\*]/
const numberSeparation = /\d/
const numbers = expresion.split(symbolSeparation);
// filter where symbol !== “”
const symbols = expresion.split(numberSeparation).filter(s => s);
// So I get the first number and removed from the array
let result = numbers.shift();
// Here I use an array function
symbols.forEach(operator => {
const topNumber = numbers.shift();
result = eval(result + operator + topNumber);
})
return result;
}
只用eval也是一样的:
function divideAndConquer(expresion) {
return eval(expresion)
}
但我认为您希望在代码中多做一些操作来练习,祝您好运。 XD
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions
如何获取 number1 中的数字和 number2 中的数字以及 symbol1 symbol2 中的符号以及如何设置条件,例如第一个输入不应该是运算符,或者如果有多个运算符则出现 return 错误?我是第一次发帖,所以如果看起来不干净请见谅。
这是我的 js: 这是我指定的点击次数:
function clearCalculator()
{
document.querySelector("#result").value = '';
}
function printInteger(inputFromCalculator)
{
document.querySelector("#result").value += inputFromCalculator;
}
function printSymbol(inputFromCalculator)
{
document.querySelector("#result").value += inputFromCalculator;
}
function printFinalOutput()
{
var expression = document.querySelector("#result").value;
expression+="=";
//expression 22+32+22=
if(sanityCheck(expression)==true)
{
divideAndConquer(expression);
}
}
我在这里尝试将整数放入 var number1 和 number2 中,将运算符放入 var symbol1 和 symbol2 中:
function divideAndConquer(expression)
{
var number1;
var number2;
var symbol1;
var symbol2;
var miniExpressionLength;
var partialOutput;
for(var i=0;i<expression.length;i++)
{
if(isNumber(expression[i])==true && number1==null)
{
number1=expression[i];
//logs number1 as single string
}
else
{
if(isNumber(expression[i])==true && number1!=null && symbol1==null)
{
number1 = number1 + expression[i];
}
}
if(symbol1!=null && number1!=null && isNumber(expression[i])==true && number2==null)
{
number2 = expression[i];
}
else
{
if(symbol1!=null && number1!=null && isNumber(expression[i])==true && number2!=null && symbol2==null)
{
number2 = number2 + expression[i];
}
}
if(isSymbol(expression[i])==true && symbol1==null)
{
symbol1=expression[i];
}
else
{
if(isSymbol(expression[i])==true && symbol1!=null)
{
symbol2=expression[i];
}
}if(symbol2!=null)
{
miniExpressionLength = i;
//console.log("length of mini expression ="+i)
break;
}
}
partialOutput = calculate(number1,number2,symbol1);
expression = partialOutput+""+expression.substring(miniExpressionLength,expression.length);
if(symbol1!=null)
{
divideAndConquer(expression);
}
else
{
console.log("expression ="+expression);
return expression;
}
}
这里我指定了一些案例:
function sanityCheck(expression)
{
//case example +2+2
if(isNumber(expression[0])==false)
{
alert("invalid expression");
return false;
}
for(var i=0;i<expression.length;i++)
{
//case example 2++2
if(isSymbol(expression[i])==true && isSymbol(expression[i+1])==true)
{
alert("invalid expression");
return false;
}
}
return true;
}
解析数学表达式不是一项简单的任务,超出了答案的范围。有几个库提供解析。 如果您想出于学习目的这样做,您应该看看:
- 逆波兰表示法
- 抽象语法树
- Shunting-yard算法
这里有一个很好的博客 post 可以帮助您入门: https://www.freecodecamp.org/news/parsing-math-expressions-with-javascript-7e8f5572276e/
首先,请注意,在“if 语句”中,如果结果已经是布尔值,则无需使用“==”
if(isNumber(expression[0]) == false) {
可以直接使用表达式:
if(!isNumber(expression[0])) {
注意“!” (非门)在句子的开头, 如果结果已经为假,则通过。
我强烈建议您使用 ES6 数组功能。 https://medium.com/poka-techblog/simplify-your-javascript-use-map-reduce-and-filter-bd02c593cc2d
sanityCheck 条件:
- 第一个字符必须是数字
- 之后它必须遵循顺序 Symbol-Number-Symbol-Number...
所以你可以使用这样的正则表达式:
^\d+([+\-\/\*]\d+)+$
(这里自己测试https://regex101.com/)
注意:这仅适用于整数。
function sanityCheck(expression)
{
const sanityExpresion = /^\d+([+\-\/\*]\d+)+$/
return sanityExpresion.test(expression);
}
你可以为 divideAndConquer 函数做这样的事情:
function divideAndConquer(expresion) {
const symbolSeparation = /[+\-\/\*]/
const numberSeparation = /\d/
const numbers = expresion.split(symbolSeparation);
// filter where symbol !== “”
const symbols = expresion.split(numberSeparation).filter(s => s);
// So I get the first number and removed from the array
let result = numbers.shift();
// Here I use an array function
symbols.forEach(operator => {
const topNumber = numbers.shift();
result = eval(result + operator + topNumber);
})
return result;
}
只用eval也是一样的:
function divideAndConquer(expresion) {
return eval(expresion)
}
但我认为您希望在代码中多做一些操作来练习,祝您好运。 XD
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions