2017-10-17 10 views
-3

자바에서 강력한 코드를 작성하려고했지만 작동하지 않는 것 같습니다. 내가 찾고있는 것은 사용자가 입력을 입력하는 것인데, 프로그램은 필수 입력이 아닌 경우 입력을 검사하고 입력이 필요한 입력에 일치 할 때까지 적절한 입력을 다시 입력 할 수있는 옵션이 제공되며, 또는 단순히 그만 두십시오. 여기까지 내가 지금까지 가지고있는 것이있다. 이 코드를 실행하면 사용자가 잘못된 입력을 입력하고 종료하려고 할 때를 제외하고는 모든 것이 잘 작동합니다. while 루프는 사용자가 적절한 입력을 다시 입력하거나 종료 할 때 실행을 멈추지 않고 계속 실행됩니다. 이 작품을 어떻게 만들 수 있습니까?사용자 입력을 사용하여 어떻게 견고성을 유지할 수 있습니까?

//question 
    System.out.println("Summer, Winter, Fall, or Spring"); 
    System.out.print("Which season is your favarite? "); 
    String favSeason = in.next(); 
    System.out.println(); 

    //Control the inputs by converting them to Upper Case 
    String favSeasonInput = favSeason.toUpperCase(); 

    //required answers of the question 
    String seasons = "SUMMER, WINTER, FALL, SPRING?"; 
    String quit = "QUIT!"; 

    boolean isSeasons = (favSeasonInput.equals(seasons.substring(0, 6)) || 
      favSeasonInput.equals(seasons.substring(8, 14)) || 
      favSeasonInput.equals(seasons.substring(16, 20)) || 
      favSeasonInput.equals(seasons.substring(22, 28))); 
    boolean isQuit = favSeasonInput.equals(quit.substring(0, 4)); 
    //inialize variables that will compute scores 
    int favSeasonScore = 0; 

    //if user enters an input otherthan seasons 
    while (!isSeasons){ 

     favSeason = in.next(); 

     if(isQuit){ 
      System.exit(0); 
     } 

    } 


    //Conditions to set up scores for seasons 
    if(favSeasonInput.equals(seasons.substring(0, 6))){ 
     favSeasonScore = 6; 
     System.out.println("Summer is " + favSeasonScore + " points"); 
    } 
    else if(favSeasonInput.equals(seasons.substring(8, 14))){ 
     favSeasonScore = 14; 
     System.out.println("Winter is " + favSeasonScore + " points"); 
    } 
    else if(favSeasonInput.equals(seasons.substring(16, 20))){ 
     favSeasonScore = 20; 
     System.out.println("Fall is " + favSeasonScore + " points"); 
    } 
    else if(favSeasonInput.equals(seasons.substring(22, 28))){ 
     favSeasonScore = 28; 
     System.out.println("Spring is " + favSeasonScore + " points"); 
    } 

    System.out.println(favSeasonScore); 
+2

코드를 이미지로 붙여 넣지 마십시오 여기에 붙여 넣으십시오 – Lokesh

+0

여기에 코드를 붙여 넣으십시오. 어떤 오류가 발생합니까? –

+1

기존 코드에 어떤 문제가 있습니까? –

답변

0

새로운 입력을 읽을 때 부울 변수의 값을 업데이트하지 않는 것이 문제입니다. 같은 변수로 읽지도 않습니다.

그래서 :

favSeasonInput = in.next().toUpperCase(); 
isSeaons = ...; 
isQuit = ...; 

을하지만 유효한 입력 검사의 방법은 끔찍한이므로주의 :

favSeason = in.next(); 

은이어야한다. 그것은 매우 비효율적이며 (각 수표에서 부분 문자열을 꺼내는 것), 또한 매우 취약하기 때문에 (인덱스를 올바르게 가져야 함) 요구 사항이 변경되면 코드를 여러 곳에서 업데이트해야합니다.

당신은 문자열을 정수로 매핑, 그래서지도 사용됩니다

Map<String, Integer> seasonScores = new HashMap<>(); 
seasonScores.put("SPRING", 28); 
// Etc. 

그런 다음 isSeason된다 변수 :

isSeason = seasonScores.keySet().containsKey(favSeasonInput); 

을 그리고 당신의 조건문이되고, 멀리 이동 :

seasonScore = seasonScores.get(favSeasonInput);