【问题标题】:Stopping a repeating Println in a while loop, BlueJ在while循环中停止重复的Println,BlueJ
【发布时间】:2015-10-31 03:13:54
【问题描述】:

下面是我到目前为止的代码,它是我计算机科学课的计算器。我遇到的问题是在程序的第二次运行时 System.out.print("Would you like to perform a calculation? (y/n)");运行两次而不是一次。我已经提交了该项目,但我想知道它为什么会这样做,以及如何在我未来的程序中修复它。我将在下面发布其余代码。

感谢您的所有帮助,我将我获得的“A”归功于你们所有人。谢谢!

/**
* A calculator with multiple functions.
* @author () 
* @version (version 2.1)
*/
import java.io.*;
import java.util.Scanner;
public class Calc
{
  public static void main(String args[])
  {
    Scanner reader = new Scanner(System.in);
    String cont = "", funct = "";
    double fnum = 0, snum = 0, answer = 0;

    while(true)
    {
        System.out.print("Would you like to perform a calculation? (y/n) ");
        cont = reader.nextLine();
        if (cont.equalsIgnoreCase("y"))
        {
            System.out.println("What function would you like to do?");
            System.out.println("+?");
            System.out.println("-?");
            System.out.println("*?");
            System.out.println("/?");
            funct = reader.nextLine();
            if (funct.equals("+"))
            {
                System.out.println("Simple addition calculator");
                System.out.println("Enter first num: ");
                fnum = reader.nextDouble();
                System.out.println("Enter second num: ");
                snum = reader.nextDouble();
                answer = fnum + snum;
                System.out.println("Answer: " + answer);
                System.out.println(" ");
            }
            if (funct.equals("-"))
            {
                 System.out.println("Simple subtraction calculator");
                System.out.println("Enter first num: ");
                fnum = reader.nextDouble();
                System.out.println("Enter second num: ");
                snum = reader.nextDouble();
                answer = fnum - snum;
                System.out.println("Answer: " + answer);
                System.out.println(" ");
            }
            if (funct.equals("*"))
            {
                 System.out.println("Simple multiplication calculator");
                System.out.println("Enter first num: ");
                fnum = reader.nextDouble();
                System.out.println("Enter second num: ");
                snum = reader.nextDouble();
                answer = fnum * snum;
                System.out.println("Answer: " + answer);
                System.out.println(" ");
            }
            if (funct.equals("/"))
            {
                 System.out.println("Simple division calculator");
                System.out.println("Enter first num: ");
                fnum = reader.nextDouble();
                System.out.println("Enter second num: ");
                snum = reader.nextDouble();
                answer = fnum / snum;
                System.out.println("Answer: " + answer);
                System.out.println(" ");
            }
        }
        else if (cont.equalsIgnoreCase("n"))
        {
            break;
        }

    }
  }
}

【问题讨论】:

    标签: java bluej


    【解决方案1】:

    在循环内的所有函数条件中,您都在使用 reader.nextDouble()。这只会读取数字(例如“8”)输入而不是用户在数字之后输入的新行(回车)。 减号(-)函数的以下代码将不会打印两次“您要执行计算吗?(y/n)”,因为新行已被读取。这里使用 reader.nextLine() 代替 reader.nextDouble()reader.nextLine() 将读取整行,而不仅仅是数字。

    if (funct.equals("-"))
            {
                System.out.println("Simple subtraction calculator");
                System.out.println("Enter first num: ");
                fnum = Double.parseDouble( reader.nextLine());
                System.out.println("Enter second num: ");
                snum = Double.parseDouble( reader.nextLine());
                answer = fnum - snum;
                System.out.println("Answer: " + answer);
                System.out.println(" ");
            }
    

    【讨论】:

    • 非常感谢!它现在运行完美。所以只是为了澄清 reader.nextDouble();正在读取双精度并让输入过去导致 println 重复,并且 Double.parseDouble(reader.nextLine());读取整行,只让双重通过并摆脱输入?再次感谢!
    • 是 @Kieran reader.nextLine() 读取 while 行,nextDouble() 读取双精度。
    【解决方案2】:

    您需要在调用 nextDouble() 之后和下一个 nextLine() 之前消耗换行符,以防止 nextLine() 消耗换行符。否则 funct = reader.nextLine(); 会将换行符作为输入,不再等待用户输入,从而导致重复。

    if (funct.equals("/"))
                {
                    System.out.println("Simple division calculator");
                    System.out.println("Enter first num: ");
                    fnum = reader.nextDouble();
                    System.out.println("Enter second num: ");
                    snum = reader.nextDouble(); // consume the new line character
                    reader.nextLine();
                    answer = fnum / snum;
                    System.out.println("Answer: " + answer);
                    System.out.println(" ");
                }
    

    【讨论】:

      【解决方案3】:

      尝试添加此 reader.nextLine();在 while 循环结束之前,如下所述。这将清除屏幕缓冲区。

      else if (cont.equalsIgnoreCase("n")) { break; } reader.nextLine(); } 希望这会有所帮助,

      【讨论】:

      • 你能解释一下清除屏幕缓冲区吗?这会有所帮助。
      【解决方案4】:

      基本上,当您使用reader.nextLine() 方法时,缓冲区中仍然有一个换行符,在调用nextLine() 时会拾取该换行符。因此,它使用换行符进行了额外的运行。如果即使是第一次使用换行符作为输入运行程序,它也会在不执行任何操作的情况下循环。因此,您只需在进入 while 循环之前清除缓冲区即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-16
        • 2019-01-17
        • 1970-01-01
        • 1970-01-01
        • 2012-08-10
        • 1970-01-01
        • 1970-01-01
        • 2014-10-02
        相关资源
        最近更新 更多