Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于用Java编写单行计算器的问题_Java - Fatal编程技术网

关于用Java编写单行计算器的问题

关于用Java编写单行计算器的问题,java,Java,我目前是一名早期的CS学生,已经开始在课外开展项目,只是为了获得更多的经验。我想我会尝试设计一个计算器 但是,我没有使用诸如输入数字等提示。我想设计一个可以输入例如1+2+3,然后输出答案的提示 我已经取得了一些进展,但我一直在研究如何使计算器更灵活 Scanner userInput = new Scanner(System.in); String tempString = userInput.nextLine(); String calcString[] = tempString.split

我目前是一名早期的CS学生,已经开始在课外开展项目,只是为了获得更多的经验。我想我会尝试设计一个计算器

但是,我没有使用诸如输入数字等提示。我想设计一个可以输入例如1+2+3,然后输出答案的提示

我已经取得了一些进展,但我一直在研究如何使计算器更灵活

Scanner userInput = new Scanner(System.in);
String tempString = userInput.nextLine();
String calcString[] = tempString.split("");
这里,我将用户的输入1+2+3作为一个字符串,然后存储在tempString中。然后我将其拆分并将其放入calcString数组中

这很好,当打印出calcString[]的所有元素时,我得到1+2+3

这就是我被困的地方。这很好,但显然不是很灵活,因为它不像1/2*3-4那样同时考虑多个操作符

此外,我不知道如何扩展计算器以容纳更长的行。我注意到一种模式,偶数元素包含数字,然后奇数元素包含运算符。但是,我不知道如何实现它,以便它将所有偶数元素转换为它们的整数对应项,所有奇数元素转换为它们的实际运算符,然后将两者结合起来


希望你们能给我一些提示或提示来帮助我!谢谢您的时间,很抱歉问了这么长的问题。

您正在接受用户的输入,它也可以是两位数。 所以

将不适用于2位数字,因为您的修改为i+=2。
检查字符串中每个字符的数字范围的更好方法。您可以使用基于条件的ASCII值。

创建字符串以保存表达式:

String expr = "1 + 2 / 3 * 4"; //or something else
使用字符串方法。拆分:

String tokens = expr.split(" ");
for循环遍历令牌数组,如果遇到数字,则将其添加到堆栈中。如果遇到运算符,堆栈上有两个数字,请将其弹出并对其进行操作,然后推回堆栈。继续循环,直到没有更多的令牌可用。最后,堆栈上只剩下一个数字,这就是答案


java中的堆栈可以用ArrayList表示,您可以添加项目以将其推送到堆栈上,然后可以使用list.getlist.size-1;list.removelist.size-1作为pop。

因为您已将整个输入分离为字符串,所以您应该做的是检查操作在calcString数组中出现的位置

您可以使用此正则表达式检查任何特定字符串是否为操作:

Pattern.matches("[+-[*/]]",operation )
其中,操作是calcString中的字符串值

通过首先检查是否有任何元素符合此检查,使用此检查来分隔值和操作。然后将不符合条件的价值观合并在一起

比如说,

如果用户输入

4*51/6-3

您应该发现calcString[1]、calcString[4]和calcString[6]都是操作

然后,您应该通过合并未被操作分隔的相邻数字来找到需要对其执行操作的值。在上面的示例中,您必须合并calcString[2]和calcString[3]

要合并这些数字,可以使用如下函数:

public int consolidate(int startPosition, int endPosition, ArrayList list)
{       
    int number = list.get(endPosition);
    int power = 10;
    for(int i=endPosition-1; i>=startPosition; i--)
    {
        number = number + (power*(list.get(i)));
        power*=10;
    }   
    return number;      
}
其中startPosition是您遇到列表中第一位数字的位置,或紧跟在操作之后的位置

endPosition是列表中最后一个未遇到其他操作的位置

包含用户输入的ArrayList也必须作为输入传递到此处

在上面的示例中,您可以通过调用以下命令来合并calcString[2]和calcString[3]:

consolidate(2,3,calcString)
请记住验证calcString中提到的位置之间只存在整数

记住

您应该考虑用户连续输入多个操作的情况。 您需要一个优先级处理算法,该算法基于BODMAS括号、除法、乘法、加减法或您喜欢的其他数学规则。 请记住指定您的程序只处理+、-、*和/。而不是电源、根等功能。 根据预期的输入范围,注意使用的数据结构。Java int将处理+/-2147483647范围内的值!
由于您刚刚开始,请尝试以单输入低开始,并不断扩展,直到您学习regexEither或实现,或作弊。使用ScriptEngine.Scanner sc=new ScannerSystem.in;ScriptEngine se=新建ScriptEngineManager.getEngineByNamejs;试试{System.out.printlnse.evalsc.nextLine;}catch ScriptException e{e.printStackTrace;}看看真正的CS方法是:创建一个解析器,将输入字符串分解成一个树,其中节点表示运算符,叶子表示操作数。到目前为止,您使用该数组的方法将使任何合理的增强都很难编码,因为您的代码需要处理这种低级抽象。
Pattern.matches("[+-[*/]]",operation )
public int consolidate(int startPosition, int endPosition, ArrayList list)
{       
    int number = list.get(endPosition);
    int power = 10;
    for(int i=endPosition-1; i>=startPosition; i--)
    {
        number = number + (power*(list.get(i)));
        power*=10;
    }   
    return number;      
}
consolidate(2,3,calcString)