有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

关于用Java编程单线计算器的问题

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

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

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

Scanner userInput = new Scanner(System.in);
String tempString = userInput.nextLine();
String calcString[] = tempString.split("");

这里,我将用户的输入1+2+3作为一个字符串,然后存储在tempString中。然后我将其拆分,并将其放入calcString数组中

这很好,当打印出^{的所有元素时,我得到“1+2+3”

for (i = 0; i <= calcString.length; i += 2) {
    calcIntegers[i] = Integer.parseInt(calcString[i]);
}

然后,通过将calcString[]的整数部分放入整数数组,将其转换为实际整数

这给了我“10203”,其中零是运算符最终应该出现的位置

if (calcString[1].equals("+") && calcString[3].equals("+")) {
    int retVal = calcIntegers[0] + calcIntegers[2] + calcIntegers[4];
    System.out.print(retVal);
}

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

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

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


共 (3) 个答案

  1. # 1 楼答案

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

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

    Pattern.matches("[+-[*/]]",operation )
    

    其中,操作计算字符串中的字符串值

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

    比如

    如果用户输入

    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中提到的位置之间只存在整数

    记住

    1. 您应该考虑用户连续输入多个操作的情况
    2. 您需要一个基于BODMAS(括号、除法、乘法、加减法)或您喜欢的其他数学规则的优先级处理算法
    3. 记住要指定程序只处理+、-、*和/。而不是电源、根等功能
    4. 根据预期的输入范围,注意使用的数据结构。Javaint将处理+/-2147483647范围内的值
  2. # 2 楼答案

    您正在从用户处获取输入,它也可以是两位数。 所以

    for (i = 0; i <= calcString.length; i += 2) {
        calcIntegers[i] = Integer.parseInt(calcString[i]);
    }
    

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

  3. # 3 楼答案

    创建用于保存表达式的字符串:

    String expr = "1 + 2 / 3 * 4"; //or something else
    

    使用String方法。拆分():

    String tokens = expr.split(" ");
    

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

    java中的“堆栈”可以用ArrayList表示,您可以添加()将项目推送到堆栈上,然后使用list。get(list.size()-1);列表移除(list.size()-1)作为弹出窗口