显示多条线,这些线可以在运行时使用一台扫描仪同时保存和接受输入

Displaying Multiple Lines that can hold and accept inputs at the same time while at runtime with one scanner

提问人:iMadeThisToAsk 提问时间:9/9/2018 最后编辑:Nicholas KiMadeThisToAsk 更新时间:4/26/2023 访问量:90

问:

我正在使用 do while 循环

public class Program {

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    float grades;
    int subj,i = 1;
    System.out.printf(" Enter how many subjects: ");
    subj = input.nextInt();
   do {
     System.out.printf("\nEnter Grade [%d]: ", i);
     i++;
   }while(i <= subj);
    grades = input.nextInt();

   } 
}

输出

    Enter how many subjects: 5

Enter Grade [1]: can't go back here 
Enter Grade [2]: can't go back here
Enter Grade [3]: can't go back here
Enter Grade [4]: can't go back here
Enter Grade [5]: I'm automatically here right after I run the project

新人不是借口,所以我做了一个研究,但其中大多数都是一种方式。

我想在运行时显示可以同时保存和接受输入的多行,这就像将行转换为可以在运行时编辑或更改的字段一样。

编辑[1]:IDE是NetBeans 8.2

编辑[2]:我已经有一个工作程序(这是一种方式),它只是浮现在我的脑海中,我有点想升级它。

java.util.scanner

评论

0赞 Hovercraft Full Of Eels 9/9/2018
你找不到解决方案的原因是没有解决方案,至少没有使用标准扫描仪的解决方案。您可以使用第三方扫描仪或 GUI 库(如 Swing 或更新的 JavaFX)来解决此问题。
2赞 Elliott Frisch 9/9/2018
创建 TUI(文本用户界面)的“标准”方法是使用一个名为 curses 的库:stackoverflow.com/a/20452886/2970947
0赞 Hovercraft Full Of Eels 9/9/2018
是的,@ElliottFrisch提供了一个关于适合您的第三方控制台库之一的链接。1+ 到答案
0赞 iMadeThisToAsk 9/9/2018
感谢你们俩。
0赞 RaffleBuffle 9/9/2018
您真的希望能够返回并编辑以前的条目,还是只想捕获每个科目的成绩?如果你想编辑条目,你需要一个TUI,并且为此提供了一些很棒的链接。如果你只想捕获每个科目的成绩,你需要把它放在do/while循环中,并将输入存储在一个数组中。input.nextInt()

答:

0赞 Fishy 3/29/2019 #1

问题不在于它跳过读取,而在于它在循环过程中没有读取。如果要在每次循环运行时从输入中读取,则需要将下一个输入放入循环中。最重要的是,如果您只有一个包含成绩的浮点数,则每当收到新成绩时,该变量都会被覆盖。这可以通过添加一个浮点数组来代替标准浮点数来解决。代码如下所示:

public class Program {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int subj,i = 0;
        System.out.printf(" Enter how many subjects: ");
        subj = input.nextInt();
        float[] grades = new float[subj];
        do {
            System.out.printf("\nEnter Grade [%d]: ", i+1);
            grades[i] = input.nextInt();
            i++;
        }while(i < subj);
    } 
}

(对此进行了一些其他编辑)

所以,这是它现在所做的,一行一行。该方法的前 2 行只是实例化要在方法中使用的变量。 设置为 0,以便更轻松地编辑数组。接下来的两个是获取您输入的受试者数量。相当标准。下一行,一个设置是为任意数量的主题创建一个新的浮点数组。然后,循环运行。在循环中,第一行是打印,与主题编号而不是数组的索引相对应。之后的行将输入的成绩放在数组中的索引处,之后的行递增。之后,循环检查是检查索引是否小于主题数。这是可行的,因为从 0 开始,当它为 5 时,它只是在列表中插入了第 4 个元素,这是最后一个元素。igradesi+1iiii

注意:数组从 0 开始,所以这就是实例化为 0 的原因,以及更改其他检查实例的原因。他们正在补偿这种变化。ii

0赞 Senozoid 4/26/2023 #2
do {
     System.out.printf("\nEnter Grade [%d]: ", i);
     i++;
   }while(i <= subj);

您没有扫描循环内的任何输入。您只显示一个文本并递增 .
当你最终要求在循环外输入时,你已经打印了所有要求用户提供成绩的行,并且 的值已经超过了科目的数量。
ii