Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用“停止do while循环”;0“;在爪哇_Java - Fatal编程技术网

Java 如何使用“停止do while循环”;0“;在爪哇

Java 如何使用“停止do while循环”;0“;在爪哇,java,Java,我只是想先说我是个初学者,所以我为我(真的)糟糕的代码道歉 我正在创建一个程序,在其中输入一个int,然后使用do while循环打印出平方根。当您输入“0”时,程序将停止 你怎么阻止它 public static void main(String[] args) { Scanner InputNum = new Scanner(System.in); DecimalFormat formatTenths = new DecimalFormat("0.0"); do

我只是想先说我是个初学者,所以我为我(真的)糟糕的代码道歉

我正在创建一个程序,在其中输入一个int,然后使用do while循环打印出平方根。当您输入“0”时,程序将停止

你怎么阻止它

public static void main(String[] args)
{

    Scanner InputNum = new Scanner(System.in);

    DecimalFormat formatTenths = new DecimalFormat("0.0");

    do {
        System.out.println("Please enter an integer.");
        int sqroot = InputNum.nextInt();
        double Finalsqroot = Math.sqrt(sqroot);
        System.out.println("Your Square Root is: " + (formatTenths.format(Finalsqroot)));
    } while (sqroot==0);
    System.out.println("Closing...");


    InputNum.close();

}

}

您需要测试输入的值是否为
0
(我会测试小于或等于零,因为负数的平方根是虚数)。如果是这样,
中断
循环。像

int sqroot = InputNum.nextInt();
if (sqroot <= 0) {
    break;
}
intsqroot=InputNum.nextInt();
如果(sqroot尝试这个

public static void main(String[] args) {

    Scanner InputNum = new Scanner(System.in);

    DecimalFormat formatTenths = new DecimalFormat("0.0");
    int sqroot = 0;
    do {
        System.out.println("Please enter an integer.");
        sqroot = InputNum.nextInt();
        double Finalsqroot = Math.sqrt(sqroot);
        System.out.println("Your Square Root is: " + (formatTenths.format(Finalsqroot)));
    } while (sqroot != 0);
    System.out.println("Closing...");

    InputNum.close();
}

我只是在while之外初始化sqroot并将==更改为!=

这个学术练习可能需要使用do/while循环,但如果您不受限制地使用它,for循环也可以:

public static void main(String[] args)
{

    Scanner InputNum = new Scanner(System.in);

    DecimalFormat formatTenths = new DecimalFormat("0.0");

    System.out.println("Please enter an integer.");
    for(int sqroot = InputNum.nextInt(); sqroot > 0; sqroot = InputNum.nextInt()) {
        double Finalsqroot = Math.sqrt(sqroot);
        System.out.println("Your Square Root is: " + (formatTenths.format(Finalsqroot)));
    }
    System.out.println("Closing...");


    InputNum.close();

}
如问题所示,您的程序有一个固有的缺陷:您请求输入,然后立即尝试使用它(计算平方根),而不确定它是否适合使用

切换到for循环是一种可以克服的方法,因为它鼓励“请求输入”、“检查输入是否可接受”、“使用输入”、“重复”的程序流


如果您被限制使用do/while循环,那么您仍然需要遵循这个流程,Elliott Frish在他的回答中提到了这个流程,建议您添加“检查输入是否可接受”部分,作为输入是否是变量的双重用途测试,这一测试只在块
{…}内部已知
它是在中声明的,在
while
行中应该有一个编译错误-您只需在
do
之前在循环外部声明变量
int sqroot;
;并在循环内部分配给它
sqroot=…
。如果您考虑使用IDE,它会告诉您问题的答案将是相等的如果您大声说出并解释您的更改,效果会更好-为什么上面的操作是正确的?:)包含代码但没有解释的答案实际上不适合堆栈溢出。你能通过解释你对原始代码所做的更改以及为什么更改来改进你的答案吗?我仍在决定是否否决投票。这并不是
for
循环的真正目的。您应该始终使用最能显示您意图的循环类型。你的计算机不是你代码的唯一消费者——未来的开发者也会使用它。一般的经验法则是
循环的
开始处括号之间的代码实际上应该只是一个初始化条件、一个测试和一个递增步骤。你的括号包含的内容太多了。最后,这个解决方案需要重复代码,这很少是一件好事。我认为你不应该教循环括号“包含太多代码”<(;;)
是一个典型的代码高尔夫构造,因为它是c风格语言中最紧凑的无限循环。。根据向下箭头的工具提示,对于没有用处/帮助的答案,应该进行向下投票,而不是因为您不喜欢它们或不愿意给出相同的建议。这个答案在解释方面比其他答案更进一步,提供了补充知识和替代方法。如果那没用/没用,你一定是个很难为之工作的人是的,我可能很难为之工作,而且该代码肯定不会通过我所在组织的代码审查。但你确实征求了一位反对者的意见(最终我没有反对,但我认真考虑过)。我指的是解决方案中的
for
循环有太多的代码,而不是末尾的额外部分;关于“代码重复”的评论,我认为这是关于两次使用readInt的投诉;请使用不重复变量分配或变量测试的任何循环提供解决方案。。如果输入0(需要额外的测试来避免这一点,这将是重复的),Gnk的答案就会崩溃,而Elliot的答案会在每个循环中测试变量两次,再次是“代码重复”。选择你是在教授简洁性还是可读性,因为你不能总是同时拥有你所坚持的三个代码审查标准,你会普遍提倡
inti=getint();虽然(i>0){i=getint();}
over
for(int i=getint();i>0;i=getint();{}
?有趣的是,我发现while的形式更零碎,它的循环控制变量范围松散,循环控制代码与循环体动作混合在一起。也就是说,内部规则就是规则,无论哪种方式都不难遵守。。
for(;;) //same as while(true)
for(;test;) //same as while(test)
for(bool do = true; do; do = test) //same as do..while(test)