【问题标题】:I don't really understand the do { } while structure我不太了解 do { } while 结构
【发布时间】:2016-08-10 19:01:37
【问题描述】:

我正在努力学习 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,它将停止?

【问题讨论】:

  • 你应该做一些调试。
  • 为什么要在外部 do-while 循环中测试 n 是否等于 3 或 n 是否小于 4?如果n==3 为真,那么n&lt;4 也必须为真。
  • do {} while () 在 Java 中不常用。使用while () {} 可能会更幸运,也许使用break 退出循环。
  • 在 Java 中,您的操作方式几乎与 Pascal 完全相同。您在文中的解释是正确的,只有一点小问题。
  • 首先,从最后一个条件中删除 "(n==3) || "。其次,请记住 do-while 至少执行一次……这是与 while 的主要区别。如果您想停止执行,请在“do-whiles”之一中放置一个“if”条件以及一个返回命令。如果你想继续执行,只需放一个“break”而不是“return”......每个“break”只打破放置的循环并且程序继续,

标签: java do-while repeat


【解决方案1】:

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

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

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

【讨论】:

  • *"解决此类棘手问题的方法是拿出一张纸......" - 或使用调试器。 :)
  • 如果你正在学习,我发现这张纸更好。我们在大学里做过,教授称之为“手处决”。这是一个很好的学习工具。
【解决方案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 以来,所有内容都被零索引而不是一个索引。

【讨论】:

    【解决方案3】:

    Pascal 使用以下形式:

    repeat
      doStuff();
    until (boleanValue);
    

    Java 基本相同,只是有一点很重要:

    do 
      doStuff();
    while (~boleanValue);
    

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

    【讨论】:

      【解决方案4】:

      while 循环和do-while 循环之间的主要区别在于 while 循环执行急切条件检查,而 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为false,所以循环体没有被执行

      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);
          }
      
      }
      

      输出:耶.. 星期天!!

      原因:首先执行 do 的主体,然后打印 Yayy.. Its Sunday!! 然后条件 while(isSunday); 计算为 @987654338 @ 因为isSundayfalse 并且循环终止

      【讨论】:

      • 以后请记得注明来源。
      【解决方案5】:

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

      【讨论】:

      • 输入任意三个整数后终止。但是巧妙地使用数组而不是书呆子的命名变量:)
      • 是的,好吧,我说它未经测试。嗯,我想我使用了&amp;&amp;,而我应该使用||
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多