2017-10-20 47 views
0

Actuellement, je travaille sur un calculateur de formule algébrique simple pour obtenir un peu mieux à certaines bases de Java, mais je rencontre un problème.L'utilisation d'une boucle while pour afficher un message d'erreur si plusieurs entrées sur la même ligne ne sont pas valides?

Une de mes méthodes est la formule quadratique. Il demande à l'utilisateur d'entrer A, B et C sur la même ligne, puis le programme effectue le calcul. Mais quand je fais une boucle while pour vérifier si l'entrée est un double, j'obtiens une erreur quand je mets une valeur incorrecte (par exemple, 3 5 x). Dois-je effectuer une boucle pour chaque variable individuelle ou existe-t-il un moyen plus rapide de vérifier si les trois variables d'une entrée sont acceptables?

public static void quadraticFormula() { 
    Scanner sc = new Scanner(System.in); 

    System.out.print("Please enter the values(in order) for A, B and C: "); 

    while(!sc.hasNextDouble()) { 
     System.out.println("Error! One or more of your inputs are not acceptable. Please try again: "); 
     sc.nextDouble(); 
    } 

    double a = sc.nextDouble(); 
    double b = sc.nextDouble(); 
    double c = sc.nextDouble(); 

    int discriminant = (int) (Math.pow(b, 2) - 4 * a * c); 

    double rootPlus = (-1 * b + Math.sqrt(discriminant))/(2 * a); 
    double rootMinus = (-1 * b - Math.sqrt(discriminant))/(2 * a); 

    System.out.println("Your answers are as follows: "); 
    System.out.println("\tB + : " + rootPlus); 
    System.out.println("\tB - : " + rootMinus); 
} 

Répondre

0

Le code que vous avez publié essaie de lire 6 valeurs, 3 dans la boucle et trois après cela. Je lisais les valeurs sous forme de chaînes, puis les analysais à l'intérieur d'un bloc trycatch (un pour chaque variable). De cette façon, vous pouvez valider que les entrées représentent des doubles et que vous pouvez faire le calcul.

0

essayez ceci. J'ai utilisé un drapeau booléen et j'ai analysé le double. Ses calculs ne savent pas s'ils sont corrects, mais la question de l'entrée est correcte.

 


    import java.util.Scanner; 

    public class Teste { 

     public Teste() { 

      Scanner sc = new Scanner(System.in); 
      String[] input = null; 
      boolean flag = true; 
      double a = 0; 
      double b = 0; 
      double c = 0; 

      while (flag) { 
       System.out.print("Please enter the values(in order) for A, B and C: "); 
       String str = sc.nextLine(); 
       input = str.split(" "); 
       System.out.println("You entered: " + str); 
       if (input.length == 3) { 
        try { 
         a = Double.parseDouble(input[0].trim()); 
         b = Double.parseDouble(input[1].trim()); 
         c = Double.parseDouble(input[2].trim()); 
         flag = false; 
        } catch (NumberFormatException e) { 
         flag = true; 
         System.out.println("Input an integer"); 
        } 
       } else { 
        flag = true; 
        System.out.print("Please enter the values(in order) for A, B and C: "); 
       } 
      } 
      sc.close(); 

      int discriminant = (int) (Math.pow(b, 2) - 4 * a * c); 
      System.out.println(discriminant); 
      double rootPlus = (-1 * b + Math.sqrt(discriminant))/(2 * a); 
      double rootMinus = (-1 * b - Math.sqrt(discriminant))/(2 * a); 

      System.out.println("Your answers are as follows: "); 
      System.out.println("\tB + : " + rootPlus); 
      System.out.println("\tB - : " + rootMinus); 
     } 

     public static void main(String[] args) { 
      Teste app = new Teste(); 
     } 
    } 

+0

Parfait! Ceci est exactement ce que je cherchais. Je n'ai jamais utilisé try/catch avant, donc je vais en lire un peu plus. Merci! –

0

J'ai quelques réflexions sur votre problème. Je pense que vous ne pouvez parcourir qu'une seule fois un scanner, alors vous voulez saisir les valeurs que vous voulez quand vous les obtenez. Tout en obtenant l'entrée, vous pouvez simplement vérifier pour s'assurer que c'est un double. Si ce n'est pas le cas, lancez une erreur contrôlée dans un try/catch et demandez de nouveau à l'utilisateur.

Vous savez déjà que 3 doubles sont nécessaires, donc créer une liste pour stocker vos a, b, c pourrait être une bonne option où index 0 = a, index 1 = b et index 2 = c. J'ai créé une méthode ci-dessous qui pourrait aider à utiliser cette stratégie:

public static void scannerPractice() { 

     Scanner sc = new Scanner(System.in); 
     System.out.print("Please enter the values(in order) for A, B and C:  
      "); 

     //create list to store your a, b, c 
     ArrayList<Double> doubles = new ArrayList<Double>(); 

     //iterate over doubles until it has 3 elements (a, b, c) 
     while (doubles.size() < 3) { 
      //You can use a try to make sure the user is entering doubles 
      try { 
       doubles.add(sc.nextDouble()); 
       //found a mismatch, so print error message, enter method to try 
       //try again and break 
      } catch (InputMismatchException e) { 
       System.out.println("Not a double. Please try again: "); 
       scannerPractice(); 
       break; 
      } 
     } 
     //list now has a, b, c 
     if (doubles.size() == 3) { 
      //iterate over the list to make sure you're getting what's 
      //expected 
      for (int i = 0; i < doubles.size(); i++) { 
       System.out.println(doubles.get(i)); 

      } 
      //enter math logic here 
     } 
     //good practice to close scanner when through 
     sc.close(); 
    }