import java.util.Scanner;
import java.math.*;
public class Question2
{
public static void main(String[] args)
{
double radius;
double area;
Scanner keyboard = new Scanner(System.in);
do
{
System.out.println("Please enter a radius.");
radius = keyboard.nextDouble();
// Calculate area of the circle using PI and radius
area = Math.PI * Math.pow(radius, 2);
// Output area of the circle
System.out.println("The area with a radius of " + radius +" is " + area);
}while(keyboard.hasNext());
}
我可以使用^Z
退出循环。问题是当我想再迭代一些时。当程序到达keyboard.hasNext()
时我按下输入没有任何反应所以当我按下一个数字时。跳过下一个迭代radis= keyboard.nextDouble()
语句,因为该数字在我假设的缓冲区中。我该如何解决这个问题?
答案 0 :(得分:1)
你在这里稍微有些误解。你有一个do {} while();循环,这基本上是做某事,然后检查语句,然后再做一次。
现在,问题是,你正在进入循环,并调用Scanner.nextDouble()
。扫描仪等待,直到它有一些东西要处理(这是它的第一个工作原因时间。),如果它有这个信息(你输入的那一刻)。
它会开始。但之后,扫描仪中没有任何内容,因此Scanner.hasNext()
返回false并退出循环,从而退出程序。
因此,不是检查是否有东西,而是一直循环并从扫描仪中读取。 由于next()方法阻止,我们不需要测试其中是否有任何内容。
这样的事情可以解决问题:
public static void main(String[] args) {
double r;
double a;
String str;
Scanner s = new Scanner(System.in);
while (true) {
System.out.print("please give me a radius: ");
str = s.nextLine();
try {
r = Double.parseDouble(str);
} catch (NumberFormatException ex) {
break;
}
a = Math.PI * r * r;
System.out.printf("area of a circle with a radius of %f is: %f%n", r, a);
}
}
答案 1 :(得分:0)
我看到的第一件事是
while(keyboard.hasNext());
应该是
while(keyboard.hasNextDouble());
我还希望在最有限的范围内定义变量(用于优化,并保持名称空间打开)。接下来,我建议使用带有printf
的格式化输出,而不是使用连接构建String
。你可以取消对Math.pow
的号召。像,
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
do {
System.out.println("Please enter a radius.");
double radius = keyboard.nextDouble();
// Calculate area of the circle using PI and radius
double area = Math.PI * radius * radius;
// Output area of the circle
System.out.printf("With a radius of %f the area is %f.%n", radius,
area);
} while (keyboard.hasNextDouble());
}