提问人:Jonathan Baxevanidis 提问时间:5/26/2021 最后编辑:HoomanJonathan Baxevanidis 更新时间:6/19/2021 访问量:967
如何使用扫描仪从一行逐字读取用户输入?
How to read User input word by word from one line with scanner?
问:
我正在尝试学习 java,更具体地说是扫描仪。因此,我尝试创建一个简单的程序,该程序将学生代码 Course1 course1Degree、course2、course2Degree 等作为输入,直到用户输入单词 end。当用户输入结束时,是时候为另一个学生输入相同的信息了。更详细的输入如下所示:
061125 Programming1 6,1 DB1 7,0 Math1 5,5 end[enter]
071234 DB2 5,5 Java 7,3 end[enter]
012343 end[enter]
用户输入结束后,应显示当前学生的平均分数。
当用户输入学生的代码时,程序结束。0000[enter]
我的问题是,为了计算每个学生的平均分数,我永远无法读取我尝试过的正确输入。此外,它似乎不明白何时输入 [end],并且在第一次输入后,当输入 0000 时我做了什么,程序不会停止。这就是我到现在为止所拥有的。
package test;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
readline();
}
static void readline(){
Scanner scanner = new Scanner(System.in).useDelimiter("\\s");
String course = "";
String code = "";
float mark = 0;
System.out.println("Enter student details: ");
while(!course.equals("end")){
code = scanner.nextLine();
if (code.equals("0000")) {
System.exit(0);
} else {
course = scanner.next();
float sum = 0;
while (!scanner.equals("end")){
mark += scanner.nextFloat();
sum += mark;
System.out.println("sum: " + sum);
}
}
}
System.out.println("Final creds: " + " id: "+ code + " course: " + course + " mark: " + mark);
}
}
答:
这是您问题的答案:
import java.util.Scanner;
public class Test {
static String course;
static double mark;
static int id;
static int times = 1;
static double avgmark;
static void readline(){
System.out.println("Enter student details in the format: [Final creds] [ID] [Course]");
while(true){
Scanner scanner = new Scanner(System.in);
String userInput = scanner.nextLine();
if (userInput.equals("y")){
times++;
System.out.println("Type in your next mark:");
Double nextMark = scanner.nextDouble();
mark += nextMark;
System.out.println("Would you like to add another mark? [y/n]");
continue;
} else if (userInput.equals("n")){
break;
} else if (userInput.matches("^(\\S+(?:\\h+\\S+)*)$")) {
String[] parts = userInput.split(" ");
mark = Integer.parseInt(parts[0]);
id = Integer.parseInt(parts[1]);
course = parts[2];
System.out.println("Would you like to add another mark? [y/n]");
continue;
}
}
avgmark = mark/times;
avgmark *= 100;
avgmark = Math.round(avgmark);
avgmark /= 100;
System.out.println("\nStudent Information: \nID: #"+ id + "\nCourse: " + course + " \nTotal Marks: " + mark +"\nAvg. Mark: "+avgmark + "%");
}
public static void main(String[] args) {
readline();
}
}
输出:
其工作原理如下:
为了使用 Scanner 扫描输入行,您需要使用正则表达式(或 REGular EXpression)。我使用正则表达式匹配器 更多信息 这里 和 这里!检查 userInput 的格式是否正确后,将其与函数拆分。这会将整个输入(EX: 568 Pro 123)变成一个数组...[568,专业版,123]。一旦 userInput 是一个 Array,你就可以用变量来分配它了......这行代码会将“Pro”分配给变量“name”。从那里,您可以将其与您分配的其他变量一起使用。 这行代码将“568”分配给变量“gamescore”。Integer.parseInt() 是一个将 String 转换为数字的命令,因此 String 'parts[0]' 将转换为可以分配给“双精度变量”的数字。^(\\S+(?:\\h+\\S+)*)$
.split(" ")
String[] parts = userInput.split(" ");
String name = parts[1]
double gamescore = Integer.parseInt(parts[0]);
评论
scanner.equals("end")
course.equals("end")
6.1
6,1