我不太了解do {} while结构

时间:2016-08-10 19:01:38

标签: java do-while repeat

我正在努力学习Java,我在高中学习Pascal并且有repeat until..;指令。

我想解决一个我应该继续输入数字的练习,直到倒数第二个+倒数第二个数字等于我输入的最后一个数字。(a[i-2]+a[i-1] = a[i]);我没有数组这样做但是没有真的很重要。

在Pascal中它很容易,因为重复直到更容易使用 对于前者,它将是

repeat  
...   
until ((a[i-2]+a[i-1] = a[i]) and (n=3)); 

n是我输入的值的数量

我无法弄清楚如何用Java引入它,到目前为止我做到了这一点但是如果我输入2 2 4它就无法工作。它应该停止但它不断要求数字

    int pen = 0, ant = 0, s = 0, n = 1;
    int ult = input.nextInt();
    s = s + ult;
    do {
        do {
            ant = pen;
            pen = ult;
            ult = input.nextInt();
            n++;
            s = s + ult;
        } while (ant + pen != ult);
        System.out.println(n);
    } while ((n == 3) || (n < 4));

ult是我输入的最后一个数字,s是输入数字的总和。

有人可以告诉我如何设置条件,以便在输入值2 2 4时它会停止吗?

5 个答案:

答案 0 :(得分:4)

Do-While循环首先在循环中运行代码。它最后评估逻辑,然后如果它是真的,它会重复循环中的代码,依此类推,直到逻辑为假。

解决这类棘手问题的方法是拿出一张纸并记录每个变量的作用。像调试器一样逐步执行每一行,并在程序进行过程中记录每个变量中存储的内容。

这是最好的方法。你会发现你将更深入地了解你的程序是如何工作的。

答案 1 :(得分:1)

Java并不比Pascal更神奇,问题可能是你已经从编程中获得了很长的一段时间:)。无论如何,自从我用Java编写任何内容以来已经有一段时间了,但是我在代码中发现的问题只是在你输入三个整数后n等于三,所以外循环继续。

int pen = 0, ant = 0, ult = 0, n = 0;

do {
    ant = pen;
    pen = ult;
    ult = input.nextInt();
} while (++n < 3 || ant + pen != ult );

assert n >= 3;
assert ant + pen == ult;

请注意,自从Pascal以来,所有内容都被归零,而不是一个索引。

答案 2 :(得分:1)

Pascal使用以下形式:

repeat
  doStuff();
until (boleanValue);

Java基本相同,除了一个重点:

do 
  doStuff();
while (~boleanValue);

重要的区别在于booleanValue之前的“〜”。 Pascal repeat ... until一直运行,直到布尔值为true。在Java中,do ... while一直运行,直到布尔值为false。从Pascal转换为Java时,您需要将布尔值切换为另一种方式。

答案 3 :(得分:1)

while循环和do - while循环之间的主要区别在于 while循环执行急切检查,其中 do-while循环执行惰性条件检查

while表达式在循环顶部进行评估

语法:

while (expression) {
     statement(s)
}

enter image description here

(取自http://www.w3resource.com/c-programming/c-while-loop.php

示例:

public class WhileDemo{

    public static void main(String args[]) {
        boolean isSunday = false;
        while(isSunday) {
            System.out.println("Yayy.. Its Sunday!!");
        }
    }

}

输出(控制台上没有打印任何内容)

原因:由于isSunday为false,因此循环体未执行

do-while表达式在循环的底部进行评估。因此,do块中的语句总是至少执行一次。

语法:

do {
     statement(s)
} while (expression);

enter image description here

(取自http://www.w3resource.com/c-programming/c-do-while-loop.php

示例:

public class DoWhileDemo{

    public static void main(String args[]) {
        boolean isSunday = false;
        do {
            System.out.println("Yayy.. Its Sunday!!");
        } while(isSunday);
    }

}

输出: Yayy ..它的星期天!!

原因:首先执行do的正文,然后打印 Yayy ..星期日!! 然后条件while(isSunday);评估结果为false,因为isSundayfalse且循环终止

答案 4 :(得分:0)

你只是遗漏了一件事。您对Pascal代码的解释几乎是正确的,但如果没有一些修改就无法工作。

在Java中,使用短路逻辑运算符进行检查。

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html

未经测试:

int n = 0;
int a[] = new a[3];
do {
   n++;
   a[0] = a[1];
   a[1] = a[2];
   a[2] = input.nextInt();
} while ((n < 3) || (a[0]+a[1] != a[2])); 
System.out.println(a[2]);