简单的数学英语计算器

时间:2014-02-05 13:12:17

标签: java exception

我目前正在修读基础编程课程。老师拒绝查看我的代码并试图猜出我问的问题,然后回答那个(不正确的)问题。这个的基础是,它应该采用一个等式,如5 * 6,并输出“五次六等于30”,答案只是一个数字。我现在的代码是这样的:

package mainPackage;
import java.util.*;


public class Main 
{
public static void main(String[]args)
{
    Scanner scan = new Scanner(System.in);
    System.out.println("Please enter the equation");
    String input = scan.nextLine();

    String space = " ";

    int firstSpace = 0;
    int secondSpace = 0;

    int numInt1 = 0;
    int numInt2 = 0;

    String a = "0";
    char b = 'a';
    String c = "0";

    firstSpace = input.indexOf(space);


    String sub = input.substring((firstSpace + 1), input.length());

    secondSpace = sub.indexOf(space);

    a = input.substring(firstSpace--);
    b = input.charAt(firstSpace++);
    c = input.substring(secondSpace++);

    numInt1 = Integer.parseInt(a);
    numInt2 = Integer.parseInt(c);


    String num1 = "";
    String op = "";
    String num2 = "";

    switch (numInt1)
    {
        case 0:
        {
            num1 = "Zero";
        }

        case 1:
        {
            num1 = "One";
        }

        case 2:
        {
            num1 = "Two";
        }

        case 3:
        {
            num1 = "Three";
        }

        case 4:
        {
            num1 = "Four";
        }

        case 5:
        {
            num1 = "Five";
        }

        case 6:
        {
            num1 = "Six";
        }

        case 7:
        {
            num1 = "Seven";
        }

        case 8:
        {
            num1 = "Eight";
        }

        case 9:
        {
            num1 = "Nine";
        }
    }

    System.out.println(a);
    System.out.println(b);
    System.out.println(c);

}
}

她告诉我们,在每个数字和操作数之间,她会放一个空格。因此,而不是5/6,它将是5/6,并且我们只需要执行0到9,但仍然必须检测她是否输入两位数字,并打印无效数字。这部分我知道怎么做。当我尝试运行它时会出现问题。行中没有出现错误,但是当我运行它时,我得到了这个:

Exception in thread "main" java.lang.NumberFormatException: For input string: " * 6"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at mainPackage.Main.main(Main.java:44)

这最终成为了这一行:

numInt1 = Integer.parseInt(a);

删除它们时,代码会输出如下内容:

"5
 * 6
 * 6"

有谁知道为什么会这样?我觉得我错过了一些令人痛苦的事情。

编辑:非常感谢您的快速回复。她从未教过我们拆分方法。再次感谢!

4 个答案:

答案 0 :(得分:1)

首先,我认为您应该熟悉调试器。它非常有用,几乎没有办法可以编写大于20行的程序而不需要它;)

现在考虑两件事:substring(beginIndex)返回从该索引开始的子字符串(基于0)到字符串的结尾。 这就是"5 * 6".substring(1)将返回" * 6"的原因(1是字符串“5 * 6”中第一个空格的“位置”/索引,因为它是基于0的)。 这就是为什么你得到一个Exception将表达式解析为Integer值。 另一方面,firstSpace ++或firstSpace--将分别增加和减少firstSpace的值,并将在命令的其余部分之后执行。 实际上:

a = input.substring(firstSpace--);
b = input.charAt(firstSpace++);
c = input.substring(secondSpace++);

等同于:

a = input.substring(firstSpace);
firstSpace = firstSpace - 1;
b = input.charAt(firstSpace);
firstSpace = firstSpace + 1;
c = input.substring(firstSpace);
firstSpace = firstSpace - 1;

你失去了想要实现的目标。 您的问题有几种解决方案。其中一些建议如上。有些人使用更先进的工具,但你也可以在没有其他帮助方法的情况下解决问题(更长和更丑,但仍然有效)。 我的建议是习惯使用调试器,它可以帮助你在这种情况下很快发现问题。

答案 1 :(得分:0)

如果您知道输入是数字,空格,运算符,空格和数字,则表示输入的长度为5个字符。除此之外的任何事情都是错误的。然后,您还可以检查这五个字符是否与给定格式匹配。

通常,在将用户输入传递给期望某个输入的方法之前,应始终验证用户输入。用户可以输入任何内容,这取决于您的程序,以确保输入符合所需的格式。

答案 2 :(得分:0)

可以使用String.split(String regex)函数

完成此操作
String arr[] = input.split("\\s+");// splitting input by space 

numInt1 = Integer.parseInt(arr[0]);//5
numInt2 = Integer.parseInt(arr[2]);//6
char b = arr[1].charAt(0);//*

答案 3 :(得分:0)

你的问题最有可能出现在这些方面。

a = input.substring(firstSpace--);
b = input.charAt(firstSpace++);

我看到有两个问题。首先使用 - 和++实际上是在改变firstSpace的值。看起来b将包含空格而不是算术运算符。您可以通过在其中添加一些System.out.println()消息来帮助自己弄清楚发生了什么,以查看索引变量发生了什么。

其次,带有单个参数的substring方法会创建从给定索引到字符串末尾的子字符串。我想你可能真的想做点什么:

a = input.substring(0, firstSpace-1);

这将为您提供从输入开始到第一个空格之前的字符的子字符串。