2017-10-17 2 views
-3

J'ai essayé de faire un code robuste sur Java, mais cela ne semble pas fonctionner. Ce que je recherche est pour un utilisateur d'entrer une entrée, le programme vérifiera l'entrée si ce n'est pas une entrée requise, alors l'utilisateur aura une option pour entrer à nouveau l'entrée appropriée jusqu'à ce que l'entrée corresponde aux entrées requises, ou simplement quitter. Voici ce que j'ai jusqu'ici. Quand je cours ce code, tout fonctionne bien sauf quand un utilisateur entre une mauvaise entrée et veut quitter. La boucle while continue à fonctionner et ne s'arrête pas même lorsqu'un utilisateur entre de nouveau dans une entrée correcte ou quitte. Comment puis-je faire ce travail?Comment puis-je faire en sorte que cette robustesse fonctionne en utilisant l'entrée de l'utilisateur?

//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

ne pas inclure le code comme une image collez-le ici – Lokesh

+0

s'il vous plaît coller votre code ici et explai n quelle erreur vous recevez –

+1

quel est le problème avec votre code existant? –

Répondre

0

Le problème est que vous ne mettez pas à jour les valeurs de vos variables booléennes lorsque vous lisez une nouvelle entrée; vous ne le lisez même pas dans la même variable.

Alors:

favSeason = in.next(); 

devrait être:

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

Mais notez que cette façon de vérifier une entrée valide est terrible. Il est très inefficace (en extrayant des sous-chaînes à chaque vérification), mais aussi très fragile (vous devez corriger ces index), et vous devez mettre à jour le code à plusieurs endroits lorsque vos besoins changent.

Vous cartographient une chaîne à un entier, utilisez donc une carte:

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

Ensuite, votre variable isSeason devient:

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

Et vos conditionals disparaissent, devenant ainsi:

seasonScore = seasonScores.get(favSeasonInput);