我不太了解 do { } while 结构

I don't really understand the do { } while structure

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

我想解决一个练习,在这个练习中,我应该一直输入数字,直到倒数第二个 + 倒数第二个数字等于我输入的最后一个数字。(a[i-2]+a[i-1] = a[i]); 我在没有数组的情况下做这件事,但事实并非如此真的很重要。

在 Pascal 中会很容易,因为 repeat until 更容易使用 例如,它将是

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 时它会停止?

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

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

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

您的问题只遗漏了一件事。您对 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]);

Java 并不比 Pascal 更神奇,问题可能是您已经从编程中休息了很长时间 :)。不管怎样,我已经有一段时间没在 Java 中写任何东西了,但我在你的代码中发现的问题是在你输入三个整数后 n 等于 3,所以外循环继续。

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 以来,一切都是零索引而不是一索引。

Pascal 使用以下形式:

repeat
  doStuff();
until (boleanValue);

Java基本一样,除了重要的一点:

do 
  doStuff();
while (~boleanValue);

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

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

while: 表达式在循环的顶部求值

语法:

while (expression) {
     statement(s)
}

(取自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为假,循环体没有执行

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

语法:

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

(取自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.. Its Sunday!! 和那么条件 while(isSunday); 的计算结果为 false 因为 isSundayfalse 并且循环终止