Java “爆发”;一个while循环仍然在执行什么?
这个程序的目的是接收正整数,一旦达到sentinel值(-1),程序将返回2个最小的数字。我的程序可以工作,但在某些情况下不行。例如,如果我输入10,15,20,-1,程序将得到10,而不是10和15。这是我的节目: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
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(numberimport 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);
}