打破"一段时间的循环仍在执行什么内部?

时间:2016-06-20 15:37:13

标签: java while-loop

该程序的目的是采用正整数,一旦命中了哨兵值(-1),程序将返回2个最低数字。我的程序有效,但在某些情况下它并不适用。例如,如果我输入10,15,20,-1,程序将导致10而不是10和15.这是我的程序:

public class Small{
public static void main(String [ ] args){
    int number;
    number=IO.readInt();
    int lowest=number; 
    int lowest2=number;

    while (number!=-1){
        number=IO.readInt();
        if(number>0){
        if(number<lowest && number!=-1){
         lowest=number;}
         else{if((number<lowest2||!(number>=lowest2))&& number!=-1){
          lowest2=number;}
        }
    }
    }
IO.outputIntAnswer(lowest);
IO.outputIntAnswer(lowest2);
    }

}

3 个答案:

答案 0 :(得分:0)

您的代码的主要问题是您将最低和最低2设置为您输入的第一个值。如果您输入的所有其他数字都高于第一个数字,则它将永远无法找到任何更低的数字。

以您的示例为例,第一个数字是10,您指定为最低和最低2。输入15时,它不低于10,因此两个变量都不能重置。与20相同。

你的if语句中也有很多冗余的检查。

public class Small {
  public static void main(String [ ] args) {
    int number;
    int lowest = Integer.MAX_VALUE;
    int lowest2 = Integer.MAX_VALUE;

    while (number!=-1) {
      number=IO.readInt();
      if (number > 0) {
        if(number < lowest) {
          lowest=number;
        }
        else if (number < lowest2) {
          lowest2=number;
        }
      }
    }
  }
  IO.outputIntAnswer(lowest);
  IO.outputIntAnswer(lowest2);
}

答案 1 :(得分:0)

问题在于程序的逻辑流程。这是代码正在做的事情:

  1. 只需一个号码,即可存储在lowestlowest2中。

  2. 通过循环阅读更多数字

    2a上。如果数字为正数,请检查lowest

    2A1。如果读入的值低于lowest,请将lowest的值更改为读入值。

    2A2。否则,如果读入的值低于lowest2,请将lowest2的值更改为读入值。只有在lowest未更改时才执行此操作。

    2B。如果读入值为-1,则结束循环。

    2c中。如果读入值为负值但不是-1,请继续,但不要将号码添加到lowestlowest2

  3. 打印lowestlowest2的值。

  4. 如果您看到错误,请参阅2a2。这与while循环之前的设置格式与您的格式相关联:您将lowestlowest2设为第一个值。

    这个代码通常会正常运行,除了一个实例:如果第一个值是您输入的最小正值,所有其他值都大于它,该怎么办?最低2将被设置为该值,并且您要检查是否有任何其他值小于它(它们不是,因为它们都会比它更大)。< / p>

    您编码时的提示:

    1)尝试培养逻辑思维心态。考虑如何为程序创建算法。确保您不会遇到程序无法按照您希望的方式运行的任何情况,例如在这种情况下(这称为逻辑错误)。

    2)当您完成编码后,或在您运行并出现错误后,请手动运行您的程序。逐步执行代码的每一行,并尝试查看代码在何处以及为何不以您希望的方式工作。或者像其他程序员一样让别人看到。有时,即使是最好的眼睛也不会发现自己的错误。

    修改 有多种方法可以解决这个特殊问题。一种方法是做Seeker和Rick所做的事: 1)将两个值都设置为最大可能的整数值,因此输入的所有值都将低于第一个值。 2)在循环开始之前询问前两个输入,并相互检查以设置前两个最低值。

    但是,我相信当你做这样的事情时,有一些事情需要注意。当然,在编码之前应该概述这些内容。 1)如果用户只输入一个或零个有效值,该怎么办?搜索者的方法不起作用,除非他检查第一个/第二个值是负数/ -1。 Rick的方法不会起作用,因为最低/最低2值中的至少一个仍然是最大整数值。 2)如果在-1之前没有输入正值,该怎么办?这类似于数字1,您的ints将为空。

    您当然可以使用搜索者和Rick的算法,但如果您使用它们,则应检查这些条件。

答案 2 :(得分:-1)

import java.util.Scanner;

public class Small {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter Number");
        int lowest = scanner.nextInt();
        System.out.println("Enter Number");
        int lowest2 = scanner.nextInt();
        if (lowest > lowest2) {
            int t = lowest;
            lowest = lowest2;
            lowest2 = t;
        }

        while (true) {
            System.out.println("Enter Number");
            int number = scanner.nextInt();
            if (number == -1)
                break;
            if (number < lowest2 && number < lowest) {
                lowest = number;
            } else if (number < lowest2) {
                lowest2 = number;
            }
        }
        System.out.println("lowest:" + lowest);
        System.out.println("lowest2:" + lowest2);
        scanner.close();
    }
}