2012-11-23 72 views
1
import java.util.Scanner; 
public class InteractiveRectangle 
{ 
public static void main(String[] args) 
{ 
    do 
    { 
     int length = readInteger ("For Length "); 
     System.out.println(); 
     int width = readInteger ("For Width "); 
     printRectangleDetails(length,width);// existing code goes here 
    } 
    while (keepGoing()); 

    System.out.println("Goodbye, friend"); 
} 


/** 
* returns the details of the rectangle 
* @param height the height of the rectangle 
* @param width the width of the rectangle 
*/ 
public static void printRectangleDetails (int length, int width) 
{ 
    System.out.println ("This is the length of the rectangle " + length); 

    System.out.println ("This is the width of the rectangle " + width); 

    System.out.println (("This is the perimeter of the rectangle " + (length + width))); 

    System.out.println (("This is the area of the rectangle " + (length * width))); 
} 

/** 
* Read in an integer and return its value 
* @param the prompt to be shown to the user 
*/ 
public static int readInteger(String prompt) 
{ 
    System.out.println (prompt); 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Enter an integer"); 

    while (!scan.hasNextInt()) // while non-integers are present 
    { 
     scan.next(); 
     System.out.println ("Bad input. Enter an integer."); 
    } 
    int input = scan.nextInt(); 
    return input; 
} 

/** 
* Read a positive integer and return its value 
* @param the prompt to be shown to the user 
*/ 
public static int readPositiveInteger(String prompt) 
{ 
    System.out.println (prompt); 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Enter an integer"); 
    boolean positive = false; 

    while (scan.hasNextInt() && positive == false) 
    { 
     int input = scan.nextInt(); 
     if (input > 0) 
     { 
      positive = true; 
      { 
       return input; 
      } 
     } 
     else 
     { 
      System.out.println ("Bad input enter an integer."); 
      positive = false; 
      scan.nextLine(); 

     } 

    } 
    return 0; 
} 

/** 
* Ask the user whether or not to spawn another rectangle 
* and returns the result as a boolean 
*/ 
public static boolean keepGoing()  
{ 
    Scanner scan = new Scanner(System.in); 
    boolean inputRead = false; 
    boolean result = false; 
    System.out.println ("Do you want to process another rectangle?"); 
    scan.next(); 
    String input = scan.next(); 

    if (input == "y") 
    { 
     inputRead = true; 
     result = true; 

    } 
    else if (input == "n") 
    { 
     inputRead = true; 
     result = false; 

    } 
    else 
    { 
     System.out.println("Bad input please try again!"); 
     scan.nextLine(); 
    } 
    return result; 

} 

}方法 - 继续下去

我想要的程序询问用户是否要产生另一个矩形,并继续下去,直到用户回答与“N”这个问题。 Atm运行程序时,矩形只产生一次,所以我认为我的keepGoing方法存在问题。 任何帮助,将不胜感激, 谢谢!

回答

2

是有几个问题: -

  • 首先使用的是==运营商,这将永远是假的比较字符串。使用equals方法: -

    if (input.equals("y")) // or, if (input.equalsIgnoreCase("y")) 
    
  • 其次,你不应该使用scan.next()方法,您使用的方式。你的第一个scan.next应该分配给input,作为你的第二scan.next包含换行符: -

    System.out.println ("Do you want to process another rectangle?"); 
    // scan.next(); // Should not be here. 
    String input = scan.next(); 
    scan.next();  // Change the order 
    

    或者,只是使用scan.nextLine(): -

    System.out.println ("Do you want to process another rectangle?"); 
    String input = scan.nextLine(); 
    
  • 第三,在你的else部分,你可以再次调用您的keepGoing方法,而不是在那里读取输入: -

    else 
    { 
        System.out.println("Bad input please try again!"); 
        return keepGoing(); 
    } 
    
  • 另外,在您的if-else中,不要将布尔值设置为变量,您可以直接从那里返回。

所以,在所有的,你可以改变你if-else if-else到: -

if (input.equals("y")) { 
    return true; 
} 
else if (input.equals("n")) { 
    return false; 
} 
else 
{ 
    System.out.println("Bad input please try again!"); 
    return keepGoing(); 
} 

然后,你不需要那些boolean变量: - inputReadresult。只要删除它们。并从method的末尾删除return声明。现在它将是unreachable code

+0

谢谢,你所说的话是有道理的。但是,有一件事,当它询问我是否想要产生另一个矩形时,我必须先输入'y'然后输入'y',然后才能运行,有什么想法? –

+0

是的,因为你没有在你的输入中存储'first scan.next()'。看到我的第二点。当用'scan.next()'读取时,第一个包含'input',第二个'scan.next()'包含'newline'。 –

+0

现在啊,工作得很好,非常感谢! –

4

if (input == "y")

总是equals()

比较字符串需要

if ("y".equals(input))

if ("y".equalsIgnoreCase(input)) // will also allow Y

相应地更改其他检查。

1

总是比较.equals字符串()

if (input == "y") 

更换到

if (input.equals("y")) 
1

两个字符串使用==运营商都是平等的您正在检查。总是使用equals方法检查字符串是否相等。

if (input == "y") 

应该

if (input.equals("y")) 

,并在地方休息为好,

==运营商检查,如果两个String引用指向同一个String对象。 equals方法确定两个String对象是否有意义相等。

1

此代码:

if (input.equals("y")) 
{ 
    inputRead = true; 
    result = true; 

} 
else if (input.equals("n")) 
{ 
    inputRead = true; 
    result = false; 

} 

应该解决的问题。请记住,Java中的对象通过引用进行比较,而不是通过值进行比较