2017-03-23 1 views
0

Je crée ce programme Java qui effectue les opérations suivantes:Java while avec plusieurs conditions: la validation des données Problème

/*Prompt user to enter miles and miles per hour. 
Display approximate travel time in hours and minutes. 
Accept decimal entries. 
Prompt user to continue (if user enters “y” or “Y”). 
*Must* perform data validation: a. only numbers, b. miles range (> 0 and no more than 3000), c. MPH (> 0 and no more than 100). 
Hint: Use integer arithmetic and division and modulus operators to calculate hours and minutes. 

Example: miles: 100, MPH 65: 1 hr(s) 32 min(s)*/ 

Je suis en mesure d'avoir le résultat final correct, mais je rencontre un problème avec la validation des données. Une réponse d'erreur devrait se produire quand il y a une entrée d'une lettre, un nombre inférieur à 0, ou un nombre supérieur à 3000 quand elle demande combien de miles (La même chose devrait fonctionner lorsqu'on lui a demandé de MPH, mais j'allais éditer ça quand j'ai eu la validation des données pour les miles de travail). J'ai fini par mettre toute cette validation dans une boucle while, et ça marche bien pour les deux premières conditions (qui sont si une lettre et un nombre supérieur à 3000 est entré), mais chaque fois que la troisième condition et la bonne entrée (un nombre entre 0 et 3000) sont entrés, le programme ne l'acceptera pas immédiatement, et l'entrée devra être entrée plusieurs fois (voir le dernier bloc de code ci-dessous de la sortie du terminal car je ne pouvais pas mettre une image).

Nous vous remercions de votre aide!

import java.util.Scanner; 

public class timetravel 
{ 
    public static void main(String[] args) 
    { 

    double miles; 
    double MPH; 
    double calculate; 
    double hours; 
    double minutes; 
    char answer; 

    System.out.println("This program displays the approximate travel time in hours and minutes."); 
    System.out.println("It accepts decimal entries and MUST perform data validation: a. only numbers, b. miles range (>0 and no more than 3000), c. MPH (> 0 and no more than 100)."); 
    System.out.println(); 

    do { 
    Scanner sc = new Scanner(System.in);  
    System.out.print("Enter miles: "); 
    while((!sc.hasNextDouble()) || sc.nextDouble() > 3000 || sc.nextDouble() < 0){ 

     System.out.println("Not a valid input."); 
     System.out.print("Please enter only numbers greater than 0 and less than 3001: "); 

     sc.next();   
    } 
    miles = sc.nextDouble(); 


System.out.print("Enter MPH: "); 
    while(!sc.hasNextDouble()){ 
     System.out.println("Not a valid input."); 
     System.out.print("Please enter only numbers greater than 0 and less than 3001: ");   
     sc.next(); 
    } 

    MPH = sc.nextDouble(); 


    calculate = (miles/MPH); 
    hours = Math.floor(calculate); 
    minutes = (calculate * 60) % 60; 
    minutes = Math.floor(minutes);  


    System.out.println("Miles: " + miles + ", MPH " + MPH + ": " + hours + " hr(s) " + minutes + " min(s)"); 
    System.out.println("This is calculate: " + calculate); 

    System.out.println("Would you like to continue?: "); 
    answer = sc.next().charAt(0); 
    answer = Character.toUpperCase(answer);  
    } while(answer == 'Y');  

    } 

} 

Sortie Terminal

Not a valid input. 
Please enter only numbers greater than 0 and less than 3001: 3002 
Not a valid input. 
Please enter only numbers greater than 0 and less than 3001: -1 
-1 
-1 
Not a valid input. 
Please enter only numbers greater than 0 and less than 3001: 30 
30 
30 
30 
Enter MPH: 

Répondre

0

Je peux repérer un problème dans votre boucle while. Vous voulez vérifier si l'entrée de l'utilisateur est dans la plage, mais vous avez lu l'entrée 2 fois avec sc.nextDouble(). Si sc.nextDouble() > 3000 est true, vous obtenez une valeur suivante avec un autre appel de sc.nextDouble(). Cela devrait expliquer le comportement de votre programme.

Vous devriez vérifier s'il y a nextDouble avec sc.hasNextDouble() puis enregistrez à une variable, comme double input = sc.nextDouble() puis vérifier plage avec entrée if (input > 0 && input <= 3000) break; afin que vous venez de sortir de la boucle.