【问题标题】:Writing a WHILE loop in Java to compute the largest value in a sequence that prevents no user input在 Java 中编写一个 WHILE 循环来计算序列中的最大值,以防止没有用户输入
【发布时间】:2019-11-27 16:15:31
【问题描述】:

我正在尝试通过阅读 Cay Horstmann 的 Big Java、Late Objects 来学习(自学)Java。我正在使用 repl.it 来编写我的代码(如果你想查看它,它是公开的)

第 4 章循环的自检题是: 当用户在第 4.7.5 节(标题为最大值和最小值)的算法中没有提供任何输入并且 WHILE 循环因此而终止程序时,您如何克服这个问题?

他们基本上要求重写代码以解决这个问题。

4.7.5节的信息你需要解决这个问题:要计算一个序列中的最大值,保留一个变量来存储你遇到的最大元素,当你找到一个更大的元素时更新它。 (此算法要求至少有一个输入。)

double largest = in.nextDouble();

while (in.hasNextDouble())
{
 double input = in.nextDouble();
 if (input > largest)
 {
 largest = input;
 }
}

这就是这本书建议作为这个问题的答案(但我不同意): 一种解决方案是在循环中进行所有输入,并引入一个布尔变量来检查是否是第一次进入循环。

    double input = 0; 
    boolean first = true; 

    while (in.hasNextDouble()) 
    {   
     double previous = input;   
     input = in.nextDouble();   
     if (first) { first = false; }    
     else if (input == previous)    { System.out.println("Duplicate input"); } 
    } 

我没有完全理解第一句话。我不同意将其作为问题的解决方案,因为(据我所知)它测试之前是否输入过输入,而不是测试是否提供了任何类型的用户输入..

我尝试将这两段代码合并在一起,但似乎无法正常工作。或者更具体:弄清楚如何构建它。我需要什么变量/循环?我按什么顺序写这个? 我在 Visio 中制作了第一段代码的流程图,但不知道如何继续。

这是我目前写的:

import java.util.Scanner;

class Main {
  public static void main(String[] args) 
  {
    Scanner input = new Scanner(System.in);
    System.out.println("Enter the number: ");

    double largest = 0;

    while (input.hasNextDouble())
    {
      double value = input.nextDouble();
      if (value > largest) 
       {
         largest = value;
         System.out.println("The largest input till now is: " + largest);
       }
    }

有人可以吗:

  1. 问我哪些问题可以帮助我解决这个问题? IE。告诉我我需要什么工具(WHILE、FOR 等)
  2. 提供一个文本解决方案,我希望可以在代码中进行转换
  3. 或者给我写代码(我还没有学过数组,所以请不要解决)

提前致谢,

【问题讨论】:

  • 你是说如果用户没有在“输入号码:”行上提供输入?
  • 是的,据我所知,这就是他们想要的。无需任何用户输入即可工作的循环(计算/存储最大输入)。如果您愿意,我可以将书中问题的屏幕截图(+ 提供的答案)发送给您(如果 StackOverflow 接受这个??)
  • 您的代码存在以下问题 - 您将无法区分 0 是合法最大值和仅表示缺少输入的情况。
  • 我已将其更改为:import java.util.Scanner;类 Main { 双最大 = input.nextDouble(); while (input.hasNextDouble()) { double value = input.nextDouble();如果(价值 > 最大){ 最大 = 价值; System.out.println("目前最大的输入是:" + 最大);这是否解决了您指出 PM 77-1 的问题?

标签: java for-loop while-loop


【解决方案1】:

所以我在这方面做了一些工作,我认为我使用 do while 循环找到了与您正在寻找的东西相近的东西。

此代码首先接受用户输入,然后将其值与上一个输入进行比较,并返回“输入更高的值”、“找到重复的数字”,或者将最后输入的数字设置为当前数字。

我希望这可以帮助您将代码放到您想要的位置!我还是新手,所以如果这没有完全优化,我深表歉意。

另外,我还没有添加退出循环的方法,因此您可能希望在每次迭代中添加检查以查看用户是否愿意继续。

public static void main(String[] args) {

    double userInput = 0;
    double prevNum = 0; 
    boolean hasValue = false;
    boolean exitCode = false;

    do {        
        Scanner sc = new Scanner(System.in);
        System.out.println("Please enter a number: ");
        userInput = sc.nextDouble();

        do {
            if (userInput<prevNum) {
                System.out.println("Please enter a number higher than " + prevNum);
                hasValue=true;
            }
            else if (userInput==prevNum) {
                System.out.println("Duplicate input detected.");
                hasValue=true;
            }
            else {
                prevNum = userInput;
                hasValue = true;
            }
        }
        while(hasValue==false);

        System.out.println(prevNum);
        System.out.println(userInput);

    }
    while(exitCode==false);
}

【讨论】:

    【解决方案2】:

    如果您想计算输入的数字是否是从一开始输入的最大数字,但如果它是第一次迭代则声明为最大数字,然后执行此操作:

    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        boolean flag = true;
        double largest = 0;
        System.out.println("Enter the number: ");
        while (input.hasNextDouble()){
            double value = input.nextDouble();
            if (flag) {
                flag = false;
                largest = value;
            }    
            else if (value > largest) largest = value;
         System.out.println("The largest input till now is: " + largest);
         System.out.println("Enter a new number: ");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-06-21
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 2013-02-27
      • 2011-12-29
      • 1970-01-01
      • 2013-10-25
      • 2020-11-09
      相关资源
      最近更新 更多