Java “爆发”;一个while循环仍然在执行什么?

Java “爆发”;一个while循环仍然在执行什么?,java,while-loop,Java,While Loop,这个程序的目的是接收正整数,一旦达到sentinel值(-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 lowest

这个程序的目的是接收正整数,一旦达到sentinel值(-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);
    }
公共类小型{
公共静态void main(字符串[]args){
整数;
number=IO.readInt();
int最低=数字;
int lowest2=数字;
while(数字!=-1){
number=IO.readInt();
如果(数字>0){
if(number
import java.util.Scanner;
公共小班{
公共静态void main(字符串[]args){
扫描仪=新的扫描仪(System.in);
System.out.println(“输入编号”);
int lowest=scanner.nextInt();
System.out.println(“输入编号”);
int lowest2=scanner.nextInt();
如果(最低>最低2){
int t=最低;
最低=最低2;
最低2=t;
}
while(true){
System.out.println(“输入编号”);
int number=scanner.nextInt();
如果(数字==-1)
打破
if(编号<最低值2&&编号<最低值){
最低=数量;
}否则如果(数字<最低2){
最低2=数量;
}
}
System.out.println(“最低:”+最低);
System.out.println(“最低2:+最低2”);
scanner.close();
}
}

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

在您的示例中,第一个数字是10,分配给lower和lowerst2。当您输入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);
}
公共类小型{
公共静态void main(字符串[]args){
整数;
int lowest=整数最大值;
int lowest2=整数的最大值;
while(数字!=-1){
number=IO.readInt();
如果(数字>0){
if(数量<最低值){
最低=数量;
}
否则如果(数字<最低2){
最低2=数量;
}
}
}
}
IO.outputIntAnswer(最低);
IO.outputIntAnswer(最低2);
}

问题在于程序的逻辑流。下面是代码的作用:

  • 读入一个数字,同时存储在
    最低位
    最低位2

  • 通过循环阅读更多数字

    2a.如果数字为正数,则对照
    最低值检查

    2a1.如果读入值低于
    最低值
    ,请将
    最低值
    的值更改为读入值

    2a2.否则,如果读入值低于
    lowest2
    ,则将
    lowest2
    的值更改为读入值。仅当
    lowest
    未更改时才执行此操作

    2b.如果读入值为-1,则结束循环

    2c.如果读入值为负数,但不是-1,请继续,但不要将数字添加到
    最低值
    最低值2

  • 打印出
    最低值
    最低值2
    的值

  • 如果您看到错误,它在2a2中。这与以下事实有关:您在
    while
    循环之前的设置与您之前的设置相同:您将
    最低的
    最低的2
    设置为第一个值

    此代码通常会正确运行,但有一个实例除外:如果第一个值是您输入的最小正值,而所有其他值都大于该值,该怎么办?lowest2将设置为该值,您正在检查是否有任何其他值小于该值(他们不是,因为他们都会比这更伟大)

    编写代码时的提示:

    1) 试着培养逻辑思维。仔细思考你想如何为你的程序创建算法。确保你不会遇到任何你的程序没有按你希望的方式运行的情况,比如在这种情况下(这称为逻辑错误)

    2) 当您完成编码时,或在您运行程序并出现错误后,手动运行您的程序。逐行检查代码的每一行,并尝试查看代码未按您希望的方式运行的位置和原因。或者让其他人看到,如程序员同事。有时,即使是最优秀的眼睛也看不到自己的错误

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

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


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

    更好的解决方案是,让一个对象在数字放入列表时自动对数字进行排序,然后在最后检索列表中最低的两个数字……是否有特定的命令来查找这两个lowest号码?对不起,我对javaCo很陌生
    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);
    }