所以我的老师给了我一个要做的任务(将在下面显示),我试图这样做,但是我想不出来,这里的任务是:
考虑以下程序,允许从键盘输入8 + 33 + 1,345 + 137之类的字符串输入,然后扫描程序对象使用加号(和任何相邻的空格)作为分隔符并生成总和这些数字(1523)。
import java.io.*;
import java.util.*;
public class Tester
{
public static void main(String args[])
{
Scanner kb = new Scanner(System.in);
System.out.print("Enter something like 8 + 33 + 1,345 +137 : ");
String s = kb.nextLine( ); //Best to store in a String and then create a new Scanner
//object; otherwise, it can get stuck waiting for input.
Scanner sc = new Scanner(s);
//Set delimiters to a plus sign surrounded by any amount of white space...or...
// a minus sign surrounded by any amount of white space.
sc.useDelimiter("\\s*\\+\\s*");
int sum = 0;
while(sc.hasNextInt( ))
{
sum = sum + sc.nextInt( );
}
System.out.println("Sum is: " + sum);
}
}
现在修改程序以允许加号或减号
^^^这是分配^^^
这是我的源代码:
//I can't get it to work if I use subtraction and addition at the same time but they work separately
import java.util.Scanner;
public class AddEmUp {
public static void main(String[] args) {
//Here we create a String
Scanner kb = new Scanner(System.in);
System.out.print("Enter something like 8 + 33 + 1345 - 137 : ");
String s = kb.nextLine();
//Now we convert the String to a scanner because we will be using Scanner methods
Scanner sc = new Scanner(s);
//Creates sum
int sum = 0;
//Does it's magic if it is addition
if (s.contains("+")) {
sc.useDelimiter("\\s*\\+\\s*");
while (sc.hasNextInt()) {
sum = sum + sc.nextInt();
}
}
//Does it's magic if it is subtraction
if (s.contains("-")) {
sc.useDelimiter("\\s*\\-\\s*");
while (sc.hasNextInt()) {
sum = sc.nextInt();
sum = sum - sc.nextInt();
}
}
//Prints the magic
System.out.println("Sum is: " + sum);
}
}
有人可以帮我解决问题(我的源代码中的第一条评论)???
答案 0 :(得分:0)
我会帮助你以一种与你迄今为止学到的东西相符的方式回答这个问题。由于您尚未了解数组并且正在使用带有分隔符模式的Scanner
,因此我们必须解决此约束。
首先,出于学校作业的目的,我们可以安全地假设您的输入将遵循特定模式,类似于:(number)(operator)(number)(operator)(number)...
等等;此外,您可能不担心输入检查(确保没有字母/符号/等)或负数,因此我们将忽略这些情况。由于您只处理+
和-
,因此您的分隔符分别为"\\s*\\+\\s*"
和"\\s*\\-\\s*"
。由于这些值不会改变(它们是常量),并且(在实际程序中)将在不同的地方多次使用,我们通常将它们存储在它们自己的final
变量中:
final String PLUS = "\\s*\\+\\s*"; // by convention, constants in java are named with all caps
final String MINUS = "\\s*\\-\\s*";
现在,让我们看看您的示例输入:8 + 33 + 1345 - 137
。你如何解释混合运营商?
int sum = 0;
Scanner sc = new Scanner(s); // s = "8 + 33 + 1345 - 137"
//What now?
你仍然可以通过一个循环来关闭它,但它需要一些中间步骤。
// start with +
sc.useDelimiter(PLUS);
while(sc.hasNext()){
String temp = sc.next();
}
// first pass, temp = "8"
// first pass, temp = "3"
// first pass, temp = "1345 - 137" (!!!)
在上面的示例中,temp
首先是"8"
(请注意它在这里String
),然后在下一个传递中"33"
,然后{ {1}}第三次传球。您通常会使用"1345 - 137"
将Integer.parseInt()
变为String
,如下所示:
int
但是,此代码在第三遍中断,因为// start with +
sc.useDelimiter(PLUS);
while(sc.hasNext()){
String temp = sc.next();
sum += Integer.parseInt(temp);
}
// first pass, temp = "8"
// first pass, temp = "3"
// first pass, temp = "1345 - 137", code breaks at Integer.parseInt(temp)
显然不是整数值。这是将"1345 - 137"
中的值存储起来的地方;您可以使用嵌套循环来评估表达式的减法部分!您是在正确的轨道上检查输入中的temp
和+
,这是一个更适合使用它的地方:
-
您注意到我没有检查输入在循环开始之前是否包含// start with +
sc.useDelimiter(PLUS);
while(sc.hasNext()){
String temp = sc.next();
// check if there are - signs in temp
if(temp.contains("-")){
// if there are, evaluate the subtraction expression
// for this example, temp = "1345 - 137"
Scanner sc2 = new Scanner(temp);
sc2.useDelimiter(MINUS);
int diff = sc2.nextInt(); // diff = 1345
while(sc2.hasNext()){
diff -= sc2.nextInt(); // diff = 1345 - 137 = 1208
}
sum += diff; // adds the result to the sum
} else {
sum += Integer.parseInt(temp); // there is no - sign, so skip ahead and just add to the sum
}
}
符号;这是因为我假设即使您输入类似+
的内容,当调用1 - 5 - 9
时,扫描程序仍将至少返回整个字符串,这仍然会进入内循环,并且仍将评估表达式。我很久没有使用sc.next()
,所以如果这个假设不正确,你就必须解决这个问题。