【问题标题】:a query controlled loop in javajava中的查询控制循环
【发布时间】:2009-12-14 15:28:52
【问题描述】:

我如何编写一个查询控制循环,它将继续从用户输入 int 值,将每个值添加到值总和中,然后询问用户是否有另一个值要输入,直到用户说没有更多的值价值观

【问题讨论】:

    标签: java loops


    【解决方案1】:
    double sum = 0;
    while (user.hasMoreInput()) {
        double += user.mostRecentInput();
    }
    

    根据您的喜好实现 hasMoreInputmostRecentInput 的位置。

    【讨论】:

      【解决方案2】:

      这就是我编写这样一个循环的方式。我不应该为你写作业,但我仍然想展示我最喜欢的这种循环的风格。

      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      while (true) {
          System.out.print("> prompt ");
          String str = in.readLine();
          if (str == null) break;
          process(str);
      }
      

      有些人可能不喜欢

      • while (true) - 它看起来像一个无限循环因为它是!它就像用户输入输入的耐心一样无限。
      • 单行if - 有些人更愿意将其设为全括号式 3 行。但我认为这没有任何用处;因此,它并没有变得更具可读性。
      • break 在循环中。这就是break 的用途!这是你从其他无限循环中的逃生口。

      如果您习惯阅读 Java 代码,这是惯用且易读的。优点:

      • 它显示了完全按照它们发生的顺序发生的步骤;
      • 它将str 的范围限制在需要的地方;
      • 终止条件非常明确;
      • 非常简洁。我总是说,更少的行 = 更少的错误。

      【讨论】:

        【解决方案3】:

        您需要处理一些问题。首先,您需要知道如何接收用户的输入。我发现的 Java Developer's Almanac 示例 (http://www.exampledepot.com/egs/java.io/ReadFromStdIn.html) 如下所示:

        try {
                BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
                String str = "";
                while (str != null) {
                    System.out.print("> prompt ");
                    str = in.readLine();
                    process(str);
                }
            } catch (IOException e) {
        }
        

        您可以将“> 提示”替换为更具描述性的内容。您还希望有一种比输入空行更好的方式让用户退出,所以如果他们完成了,可以要求他们输入一个“q”。然后,将 while 循环中的比较更改为类似 !str.toLowerCase().equals("q") 的内容。然后,您需要实现将字符串转换为整数的过程函数。 Integer.parseInt(String) 将返回正确表示整数的字符串的整数值(即“3”或“49”但不是“7e”),否则将抛出 NumberFormatException。因为您不希望您的应用程序因输入错误而出现异常而失败,所以我认为该进程可能只会在非整数字符串的情况下返回 0(即,当您捕获 NumberFormatException 时)。

        最后,您需要在主循环之前初始化一个 sum 变量,并且可以在每次迭代期间添加 process 的结果。然后当循环结束时,您可以使用 System.out.println 将process 的结果打印到屏幕上。

        我故意省略了大部分代码,因为这听起来确实像家庭作业,但如果你能充分理解所有这些并把它们放在一起,我想你已经学得很好,可以自己完成了。

        【讨论】:

        • 空渔获物?至少做一个 printStackTrace!或者根本不抓住......更糟糕的是像上面那样隐藏错误。
        • 正如我上面提到的,这段代码只是从该链接中逐字复制而来。并且 catch 语句没有丢失它的右大括号,它只是没有缩进。
        • 不,你没有。有人在你之后发表了评论,然后在我纠正他时将其删除。
        【解决方案4】:

        这就是我通常的做法。尽可能少的代码:)。

        String s;
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        while((s = in.readLine()) != null)
            process(s);
        

        【讨论】:

        • 不是“尽可能少”,赢了 2 行:while (process(in.readLine())); ....(不是说我会那样做)
        • 好吧,你需要有一个 if (s != null) 内部进程,所以不清楚你的版本是否真的更短。
        • 本来是开玩笑的,但我仍然不需要String s; 行,而且很可能我会有一个检查(空字符串)或至少一个正在处理的断言...... :-)
        【解决方案5】:

        Java Developer's Almanac 始终是您的基本示例的良好来源。

         BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
         String str = "";
         while (str != null) {
             System.out.print("> prompt ");
             str = in.readLine();
             process(str);
         }
        

        编辑:显然有些人认为演示某些技术的要点应该有错误检查。也许我也应该评论代码,并提供一个规范。下一次,我还将开发一些自定义注释来表达前置和后置条件,或者在 Eiffel 中起草一个实现。

        【讨论】:

        • +1:很好的答案,感谢您的链接!但我敦促读者在catch 块中编写一些有用的代码。这种应受谴责的吞下异常的做法会导致各种用户的挫败感。我想说这样的代码不应该出现在年历中;包含额外的代码行不会对他们造成伤害。
        • 不,我收回了。代码太可怕了! readLine() 后跟 process(str) 没有空检查。像这样编码的人没有写年历的生意。
        • 这是一种非常奇怪的 REPL 方式——当你到达 EOF 时,你将处理一个空字符串。更惯用的用法是prompt(); for (String cmd; (cmd = in.readLine()) != null; ){ process(cmd); prompt(); }
        • 乔纳森,我们批评的不是你的代码,而是“年鉴”代码,它理应遵守更高的标准。错误检查可以被认为是可选的,尤其是在演示中;但是允许程序在 EOF 上爆炸是不可接受的。
        • 也许 process() 可以处理 null... 甚至需要它来发出 EOF 的信号...好吧,这是不好的做法和误导。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-18
        • 2018-08-14
        • 1970-01-01
        • 2013-03-11
        • 2015-05-14
        • 2019-03-02
        相关资源
        最近更新 更多