Scanner
从用户处获取半径,然后计算并输出周长和面积。问题:
在Java中习惯于在
println()
内放置一个函数调用,还是将返回的值放入一个单独的变量中然后显示该变量更好? >我正确编写计算函数static
吗? > 5.5
Circumference:
34.55751918948772
Area:
95.03317777109123
#1 楼
在Java中是否习惯将函数调用放在println()内,还是将返回的值放入一个单独的变量中然后显示该变量更好呢?
我要说的主要是基于意见的。对于这个小应用程序,我认为将函数方法调用放在
println
内是很好的。重要的是日志记录),因为您不希望在删除System.out.println
或日志记录语句时更改程序行为。这是一个玩具程序吗?在
nextInt
上使用Scanner
时,我看不到需要使用输入验证。也许您想避免使用负数,或者向用户抛出异常或向用户显示错误消息,但这也许就可以了。使计算函数静态化?
是的,绝对可以。我看不出为什么它们不应该是静态的。鉴于它们的有用性,最好也将它们也具有
public
。功能要求:您目前不提示任何可能使用户感到困惑。只需一个简单的
System.out.println("Enter radius:");
就可以了。总体而言,您的代码看起来非常完美。一个未成年人nitpick是您在这里超出必要的空间:
System.out.println("Circumference: ");
System.out.println("Area: ");
另一个未成年人nitpick是您的Scanner变量可以命名为
scanner
或input
代替。 (即使sc
是Scanner
的一个非常普通的变量名)#perfectionist-naming。评论
\ $ \ begingroup \ $
谢谢你的挑剔。 ;-)我忘了这显示在单独的行上,所以多余的空间是无用的。
\ $ \ endgroup \ $
– Jamal♦
14年7月16日在21:38
#2 楼
创建一个Circle
对象可能是更惯用的Java。该代码将更流畅地读取(例如,circle.getCircumference()
)。它还为您提供了一个验证半径是否为负值的好地方。import java.util.Scanner;
public class Circle {
private final double radius;
public Circle(double radius) {
if (radius < 0) {
throw new IllegalArgumentException();
}
this.radius = radius;
}
public double getCircumference() {
return 2 * Math.PI * radius;
}
public double getArea() {
return Math.PI * radius * radius;
}
public static void main(String[] args) {
try (Scanner sc = new Scanner(System.in)) {
double radius = sc.nextDouble();
Circle circle = new Circle(radius);
System.out.println("Circumference: ");
System.out.println(circle.getCircumference());
System.out.println("Area: ");
System.out.println(circle.getArea());
}
}
}
还有两个小点:
import java.lang.Math
是不必要的,因为java.lang.*
一直都可用。由于Java 7,try-with-resources为您提供了一种自动关闭像
Scanner
这样的自动关闭对象的方法。代码或我上面的代码都检查是否存在所有要读取的double
。如果输入为垃圾,则将抛出java.util.InputMismatchException
,该q4312079q无法处理。评论
\ $ \ begingroup \ $
啊,所以我没有创建实际的Circle类。我应该以其他方式知道,因为这与C ++中的相同。看来我实际上在使用自由函数。
\ $ \ endgroup \ $
– Jamal♦
2014年7月17日下午0:44
\ $ \ begingroup \ $
我想对于一个受过良好教育和经验的人,由于当时的目的,他们做了他们所做的一切。如果您认为一个人不知道如何做这样的事情,那将是您的错。当需要面向对象和可伸缩时,它将是面向对象的。
\ $ \ endgroup \ $
–通知A
14年7月17日在7:13
#3 楼
我实际上不喜欢将每个标签和结果显示在单独的行上,而是希望将每个值都放在这样的单独行上:<我发现
5.5
Circumference: 34.55751918948772
Area: 95.03317777109123
可以做到这一点,而print()
可以换行。 >我还结合了@Simon关于用户输入提示的建议。 println()
这样,我得到以下输出(使用相同的半径):
System.out.print("Input radius: ");
// ...
System.out.println();
System.out.print("Circumference = ");
System.out.println(circle.getCircumference());
System.out.print("Area = ");
System.out.print(circle.getArea());
评论
\ $ \ begingroup \ $
从“惯例”的角度来看,我将使用:而不是=。
\ $ \ endgroup \ $
–牙刷
2015年10月8日14:11
评论
1.您可以附加一些样本输出吗? 2.为什么限制半径为in?类名Circle表示更通用的名称。@GraniteRobert:不必受到限制;起初我只是想过一个int。我可以更改它,并提供示例输出。
我想知道您是否打算在输出中使用单独的行。我以为我误会了我的JAVA。
@GraniteRobert:我实际上很喜欢它们,但是我没有花时间去寻找如何做。无论如何,我想这是另外一件小事。
Java需要赶上时代并添加Tau常量。 tauday.com/tau-manifesto