【发布时间】:2009-12-14 15:28:52
【问题描述】:
我如何编写一个查询控制循环,它将继续从用户输入 int 值,将每个值添加到值总和中,然后询问用户是否有另一个值要输入,直到用户说没有更多的值价值观
【问题讨论】:
我如何编写一个查询控制循环,它将继续从用户输入 int 值,将每个值添加到值总和中,然后询问用户是否有另一个值要输入,直到用户说没有更多的值价值观
【问题讨论】:
double sum = 0;
while (user.hasMoreInput()) {
double += user.mostRecentInput();
}
根据您的喜好实现 hasMoreInput 和 mostRecentInput 的位置。
【讨论】:
这就是我编写这样一个循环的方式。我不应该为你写作业,但我仍然想展示我最喜欢的这种循环的风格。
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 的范围限制在需要的地方;【讨论】:
您需要处理一些问题。首先,您需要知道如何接收用户的输入。我发现的 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 的结果打印到屏幕上。
我故意省略了大部分代码,因为这听起来确实像家庭作业,但如果你能充分理解所有这些并把它们放在一起,我想你已经学得很好,可以自己完成了。
【讨论】:
这就是我通常的做法。尽可能少的代码:)。
String s;
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
while((s = in.readLine()) != null)
process(s);
【讨论】:
while (process(in.readLine())); ....(不是说我会那样做)
String s; 行,而且很可能我会有一个检查(空字符串)或至少一个正在处理的断言...... :-)
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 中起草一个实现。
【讨论】:
catch 块中编写一些有用的代码。这种应受谴责的吞下异常的做法会导致各种用户的挫败感。我想说这样的代码不应该出现在年历中;包含额外的代码行不会对他们造成伤害。
readLine() 后跟 process(str) 没有空检查。像这样编码的人没有写年历的生意。
prompt(); for (String cmd; (cmd = in.readLine()) != null; ){ process(cmd); prompt(); }
process() 可以处理 null... 甚至需要它来发出 EOF 的信号...好吧,这是不好的做法和误导。