我目前正在修读基础编程课程。老师拒绝查看我的代码并试图猜出我问的问题,然后回答那个(不正确的)问题。这个的基础是,它应该采用一个等式,如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"
有谁知道为什么会这样?我觉得我错过了一些令人痛苦的事情。
编辑:非常感谢您的快速回复。她从未教过我们拆分方法。再次感谢!答案 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);
这将为您提供从输入开始到第一个空格之前的字符的子字符串。