我的代码有点问题。然而,当我试图突破内循环时,编译和运行效果很好,
System.out.println("Type which category you want to add to.");
System.out.println("Homework, Classwork, Labs, Test, Quizzes, Midterm, Final");
当我只想打印一次时,上面的代码会打印两次到终端。
我感觉这是一个简单的错误,我的方括号对齐方式,但我很难弄清楚如何做到这一点。任何帮助将不胜感激!
import java.util.Scanner;
public class GetGrade {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
final int MAX = 15;
int[] homework = new int[MAX];
int[] classwork = new int[MAX];
int[] lab = new int[MAX];
int[] test = new int[MAX];
int[] quizzes = new int[MAX];
int[] midterm = new int[MAX];
int[] fin = new int[MAX];
int hwCount, clCount, labCount, testCount, quizCount, midCount, finCount;
double hwTotal, clTotal, labTotal, testTotal, quizTotal, midTotal, finTotal;
double grade = 0;
String selection = "";
System.out.println();
System.out.println("Welcome to GetGrade!");
System.out.println();
while (true) {
System.out.println("Type which category you want to add to.");
System.out.println("Homework, Classwork, Labs, Test, Quizzes, Midterm, Final");
selection = input.nextLine();
if (selection.equals("homework")) {
System.out.print("What percentange of your grade is homework? > ");
double hwPercent = input.nextDouble();
System.out.println("Now begin typing your grades. When you are finished, type -1.");
for (int i = 0; i < homework.length; i++) {
homework[i] = input.nextInt();
hwTotal = homework[i] * hwPercent;
grade += hwTotal;
if (homework[i] == -1) break;
}
}
}
}
}
答案 0 :(得分:1)
它看起来同样微不足道:
对input.nextInt()的调用;在你的内部循环中不包括换行符。
所以你打破了内部循环,接收下一行只包含换行符 - input.nextLine()中的字符;这是&#34; -1 \ n&#34;的剩余输入。行并再次进行主循环,因为它不匹配&#34;作业&#34;。
答案 1 :(得分:0)
尝试将while循环中的条件变量设置为实际的布尔值而不是true。
此外,当你调用&#34; break&#34;时,你只是打破了for循环。如果此时将布尔变量重新指定为false,则可以完全退出while循环。
答案 2 :(得分:0)
在循环结束之前,添加一个&#34;你想继续吗? (Y / N)&#34;功能。
如果用户输入&#34; N&#34;或其他任何事情,执行另一个休息。而那个突破将让你摆脱while循环。
答案 3 :(得分:0)
让代码正常工作的简单方法是更改
selection = input.nextLine();
到
selection = input.next();
next()
只读取字符串值(这是您在代码中实际执行的操作),而不是Peter建议的newline
字符。
因此,当您阅读newline
字符时,不会发生额外的迭代迭代。
答案 4 :(得分:0)
当您使用扫描仪从键盘读取一行时,它会读取所有内容,包括用户键入的换行符以提交输入。例如:
Type which category you want to add to.
Homework, Classwork, Labs, Test, Quizzes, Midterm, Final
>
如果您输入&#34;家庭作业&#34;然后输入,实际输入成为&#34;作业\ n&#34;。 input.nextLine()
将扫描输入,直到遇到第一个换行符,&#39; \ n&#39;它将消耗,然后返回到该点的所有内容(即&#34;作业&#34; )。
你的问题是input.nextInt()
不使用换行符,因此当你的while
循环开始另一轮时,输入缓冲区中仍然会有换行符。
Now begin typing your grades. When you are finished, type -1.
> ...
> -1
=> User input is "-1\n"
-------------------------------
// Meanwhile, back in the code...
for (int i=0;i<homework.length;i++) {
homework[i] = input.nextInt(); // <--- This call consumes "-1" but leaves '\n'
hwTotal = homework[i] * hwPercent;
grade += hwTotal;
if (homework[i] == -1) break;
}
下一次调用input.nextLine()
时会消耗该换行符,导致输入缓冲区为空。
while (true) {
System.out.println("Type which category you want to add to.");
System.out.println("Homework, Classwork, Labs, Test, Quizzes, Midterm, Final");
selection = input.nextLine(); // <--- This call consumes the leftover '\n' and returns the empty string
...
因为&#34;&#34;不等于&#34; homework&#34;,while
循环再循环一次,但这次输入缓冲区为空,因此对input.nextLine()
的调用就像你期望的那样
// selection is empty, so this condition fails and the program loops back around
if (selection.equals("homework")) {
...
这个问题有两个简单的解决方案。你可以
Integer.parseInt(input.nextLine())
代替input.nextInt()
input.nextLine()
循环结束时添加对while
的额外调用以使用最终换行符第一个选项可能是最强大的,如果它们没有给你一个有效的整数作为输入,你会得到运行时错误的附加好处。