2009-11-04 11 views
0

저는 Java로 놀고 있으며 사용자가 ctrl + z을 누를 때까지 계속 진행하는 간단한 while 루프를 수행하려고합니다. 내가 while(input.hasNext()) { ...을 시도했지만 while 루프 내부의 코드가 실행되지 것while 루프의 코드가 실행되지 않습니다.

public static void main(String[] args) { 

    //declare vars 
    boolean isEvenResult; 
    int num; 

    //create objects 
    Scanner input = new Scanner(System.in); 
    EvenTester app = new EvenTester(); 

    //input user number 
    System.out.print("Please enter a number: "); 
    num = input.nextInt(); 

    while() { 

     //call methods 
     isEvenResult = app.isEven(num); 

     if(isEvenResult) { 
      System.out.printf("%d is even", num); 
     } else { 
      System.out.printf("%d is odd", num); 
     } 

    }//end while loop 

}//end main 

:

나는 이런 식으로 뭔가가있다.

답변

3
//input user number 
System.out.print("Please enter a number: "); 

do { 
    try { 
     num = input.nextInt(); 
    } catch (Exception e) { 
     break; 
    } 
    // call methods 
    isEvenResult = app.isEven(num); 

    if (isEvenResult) { 
     System.out.printf("%d is even", num); 
    } else { 
     System.out.printf("%d is odd", num); 
    } 
} while (true); 

사용자가 숫자가 아닌 값을 쓸 때 루프가 끊어집니다.

+0

이 키를 눌렀을 때 여러 키에 응답하려면 루프 – Joe

+0

을 종료하려면 을 입력 할 수 없다는 점을 제외하면 내가 찾고있는 것이 있습니다. 그러면 KeyBindings를 구현하는 것이 가장 좋습니다. 당신은 당신이 무엇을 요구하고 있는지를 얻기 위해 어떤 열쇠가 눌러져 있는지 들어야 만합니다. – ChadNC

1

동안 (NUM! = 'Z')

당신이 왜 input.getInt을하고는 'Z'를 기대하는 경우 비록()?

Console 클래스도 확인할 수 있습니다.

+0

나는 * control * -Z로 끝내고 입력 스트림을 끝내기를 원한다고 생각합니다. – rsp

+0

불행히도 답변을 드린 후 그는 질문을 변경했습니다. – Gandalf

1

사용자가 Ctrl + Z로 강제 중단해야 할 때까지 반복하려면 while(true)을 수행하십시오. 그러나 당신은 당신의 nextInt()가 루프 내부에 있고, 어쩌면 당신의 프롬프트 문이되기를 원할 것입니다.

0

KeyBindings을 구현해야합니다. 그런 다음 어떤 키를 눌렀는지에 따라 종료 결정을 내릴 수 있습니다.

0

루프 밖에서 입력을하고 있으며 한 번만 실행됩니다.

 
System.out.print("Please enter a number: "); 
num = input.nextInt(); 

위 코드를 루프 안에 넣으십시오.

루프 내부에 시스템이 있기 때문에 루프 내부에 컨트롤이 있는지 여부도 알 수 있습니다. 분명히해야합니다.

또한,() 혼자 작업하는 동안 궁금

 
while(true) 

을 시도합니다.

1

TrueSoft의 솔루션이 작동하지 않습니다. 질문자를 위해 일하지 않는 이유는 프로그램의 범위 밖에 있습니다.

이 프로그램은 나를 위해 작동합니다 : 나는 리눅스에서 그것을 실행하고 라인에 Ctrl-D를 입력하십시오. Ctrl-D는 Windows 용 Ctrl-Z와 같은 방식으로 Linux 용 파일 끝입니다. 프로그램은 트랙에서 완전히 멈 춥니 다.

Windows 콘솔 (검은 색 DOS 상자)은 주름이 있습니다. 입력 내용을 줄 단위로 읽습니다. Ctrl-Z가 표시 될 때까지 Ctrl-Z가 표시되지 않으므로 Ctrl-Z가 표시되기 전에 Enter 키를 입력해야합니다.

Windows를 실행 해보지 않으려 고하지만 내 생각에 CTRL-Z 다음에 Enter 키가 있습니다 (번호 입력 이후처럼) 프로그램이 완전히 멈추어야합니다.

Java 프로그램이 문자 단위로 작동하도록하는 시스템 방식으로 문자를 직접 처리하고 Ctrl-Z에 즉시 응답 할 수 있습니다. 그러나 이것은 고급 기능이며 이와 같은 간단한 프로그래밍 연습에 속하지 않습니다. Ctrl-Z/Enter는 프로그램 종료를 허용하는 방법이라고 생각합니다.

0

이것은 Deitel의 저서 「How to Program, 9th Edition」에서 Exercise 6.16처럼 보입니다.

CTRL-Z charcter는 CTRL-D가 대부분의 UNIX 또는 Linux 플랫폼에서 입력을 종료하는 것처럼 실제로는 Windows 플랫폼에서 입력을 끝냅니다.

또한 프로그램 구성시 스캐너 메소드 및 System.in 바이트 스트림 (즉, 콘솔의 표준 입력)을 잘 나타내지 못하는 논리 오류가 있습니다. 게시 된 프로그램에서

, 성명 :

num = input.nextInt(); 

무조건 실행합니다. 어떤 종류의 입력이 수신 될 때까지 실행을 차단합니다. 입력이 정수가 아니면 예외를 throw합니다. 수신 된 입력이 정수이면 num에 정수 값이 할당되고 입력 스트림 (입력)의 정수는 입력 스트림에서 삭제됩니다. 사용자가 입력 라인을 종료 한 Enter 키를 누르기 전에 입력 한 내용에 따라 라인 끝까지 입력 라인에 잔여 물이 남아있을 수 있으며 스캐너가 스캔중인 System.in 바이트 스트림에 배치됩니다.

input.hasNext()를 while 문 테스트 조건에 넣는 것을 제외하고는 프로그램을 작성한 상태로 두는 경우 nextInt()가 처리 한 정수보다 많은 입력이 입력 스트림에있을 때까지 차단됩니다.

일부 답변은 솔루션으로 KeyBinding을 사용하는 것이 좋습니다. 작동하는 동안 거의 하드웨어 수준에서 키 누르기 이벤트를 기다리고 플랫폼 독립성에 우호적이지 않습니다. Alice 's Wonderland는 모든 종류의 이벤트 처리와 코드가 실행중인 플랫폼을 알아야하는 상황을 파악할 수있는 잠재적 인 토끼 구멍입니다. 입력 스트림의 끝이 모든 플랫폼에서 작동해야 함을 나타내려면 hasNext() 부울 false 반환을 사용하고 거의 하드웨어 이벤트 수준에서 키보드 및 키 누르기를 처리하기 위해 잠재적으로 휴대 할 수없는 gee-whiz 코드를 피할 수 있습니다.

다음 프로그램은 사용자가 (또는 연습 문제)하지 않고도 사용자가 Windows 플랫폼에서 CTRL-Z를 누르거나 UNIX/Linux 플랫폼에서 CTRL-D를 누르면 입력을 종료합니다 코드가 실행되는 플랫폼을 결정하십시오.

// Exercise 6.16: EvenOrOddTest.java 
// Write a method isEven that uses the remainder operator (%) 
// to determine whether an integer is even. The method should 
// take an integer argument and return true if the integer is 
// even and false otherwise. Incorporate this method into an 
// application that inputs a sequence of integers (one at a time) 
// and determines whether each is even or odd. 
import java.util.Scanner; 

public class EvenOrOddTest { 

    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 

     int integer; 
     System.out.println("Odd even integer test."); 
     System.out.printf("Input CTRL-Z on Windows or CTRL-D on UNIX/Linux to end input\n" 
      + "or an integer between values\n" 
      + "%d and %d\n" 
      + "to test whether it is odd or even: ", 
      Integer.MIN_VALUE, Integer.MAX_VALUE); 
     // the input.hasNext() will block until 
     // some kind of input, even a CTRL-Z, 
     // arrives in the stream 
     // the body of the while loop will execute 
     // every time input appears for as long as the input 
     // is not a CTRL-Z 
     while (input.hasNext()) { // repeat until end of input 
      // prompt user 
      // now see if the input we did get is an integer 
      if (input.hasNextInt()) { // we got an integer... 
       integer = input.nextInt(); 
       System.out.printf("\n%d is " 
         + (EvenOrOdd.isEven(integer) ? "even.\n\n" : "odd.\n\n"), integer); 
      } else { // we got a non-integer one too large for int 
       System.out.printf("\nInput %s invalid! Try again...\n\n", input.next());     
      } // end if...else 
      // white space (i.e. spaces and tabs) are separators 
      // next and nextInt get only to the first separator 
      // so it is possible for the user to enter an integer 
      // followed by tabs and/or spaces followed by more 
      // input, integer or not up to the end of the input line 
      // input.nextLine() flushes everything not processed 
      // by the nextInt() or next() to the input line end 
      // won't block execution waiting for input 
      // if there is nothing left on the input line 
      input.nextLine(); 
      // prompt for user input again 
      System.out.printf("Input CTRL-Z to end input\n" 
        + "or an integer between values\n" 
        + "%d and %d\n" 
        + "to test whether it is odd or even: ", 
        Integer.MIN_VALUE, Integer.MAX_VALUE); 
     } // end while 
    } // end main 

    static boolean isEven(int integer) { 
     // integer modulus 2 is zero when integer is even 
     return ((integer % 2) == 0); 
    } // end isEven 
} // end class EvenOrOddTest 
관련 문제