0
votes

Problème de continuité dans la calculatrice Java

Je suis nouveau sur Java et je fais une application de calculatrice.

J'essaie de faire en sorte que ma calculatrice continue à demander à l'utilisateur la bonne réponse (en tapant Y ou N) après l'instruction else suivant «Invalid Input».
Je veux que le programme continue avec les calculs une fois que l'entrée correcte est finalement entrée.

J'ai joué avec une boucle while intégrée, mais je me suis retrouvé avec une boucle infinie ou une boucle qui se termine sans résolution. Le code est ci-dessous.

import java.util.Scanner;
class Calculate {
    public static void.main(String[] args) {
            System.out.println("Welcome To Calculator!");
            System.out.println("*************************************************************************");
            Scanner userinput = new Scanner(System.in);
            double num1, num2;
            String choice;
            boolean youDecide = true;
            while(youDecide == true) {
                System.out.println("Please enter a number: ");
                num1 = userinput.nextDouble();
                System.out.println("Please enter an available operator (+, -, *, /): ");
                char operator = userinput.next().charAt(0);
                System.out.println("Please enter another number: ");
                num2 = userinput.nextDouble();
                double output;      
                switch(operator) 
                {
                case '+':
                    output = num1 + num2;
                    break;
                
                case '-':
                    output = num1 - num2;
                    break;
                
                case '*':
                    output = num1 * num2;
                    break;
                
                case '/':
                    output = num1 / num2;
                        if(num2 == 0)
                            System.out.println("Math error! A number cannot be divided by zero.");
                    break;
                default:
                    System.out.println("Invalid input. Please enter an available operator, i.e (+, -, *, /): ");
                    return;
                }
                System.out.println("*************************************************************************");
                System.out.println("The answer is: " + "\n" + output);
                System.out.println("*************************************************************************");
                System.out.println("Would you like to calculate again?");
                System.out.println("Please enter Y for yes, or N for no");
                choice = userinput.next();
            
                if(choice.equalsIgnoreCase("Y")) {
                    System.out.println("Okay. Let's continue!");
                    System.out.println("*************************************************************************");
                    youDecide = true;
                }
                else if(choice.equalsIgnoreCase("N")) {
                    System.out.println("*************************************************************************");
                    System.out.println("Okay. Thanks for using Calculator. Goodbye!");
                    System.exit(0);
                }
                else {
                    System.out.println("Invalid input. Please try again...");   
                    System.out.println("*************************************************************************");
                    youDecide = false;
                }
        }
    
    }

}


4 commentaires

public static void.main() comment cela s'est-il compilé? Copiez / collez toujours le code, ne le retapez jamais dans une question StackOverflow.


Pourquoi avez-vous défini youDecide = false dans la section Invalid Input? Cela dit à la boucle de se terminer, et elle appartient au choix 'N' au lieu de System.exit(0) .


Jim, j'ai posté ceci depuis mon téléphone, j'ai donc dû modifier le texte pour pouvoir publier le code dans la question. J'ai collé le code, mais le site s'est plaint des indentions, c'est donc le résultat.


De plus, System.exit (0) semble être le seul moyen de mettre fin au programme une fois que l'utilisateur est invité à prendre la décision de continuer et entre «N». Je jouais avec une boucle while intégrée pour l'instruction else dans laquelle, une fois que l'utilisateur a finalement entré une entrée correcte, la boucle principale continuera. C'est la partie où j'ai rencontré des problèmes car je me suis retrouvé avec une boucle intégrée infinie ou une boucle de terminaison précoce.


3 Réponses :


1
votes

Vous avez besoin d' un while en boucle pour assurer la valeur est correcte.

En raison de la logique de votre code, vous devez le faire lorsque l'utilisateur tape le caractère, sinon vous devez modifier de nombreuses lignes de code ou demander à nouveau toutes les valeurs.

Je pense que pour un débutant, le moyen le plus simple est d'utiliser cette boucle:

char operator;
while(true) {
    operator = userinput.next().charAt(0);
    if(operator=='+' || operator == '-' || operator == '*' || operator == '/') {
        break;
    }else {
        System.out.println("Please enter a valid operator: ");
    }
}

Existe de nombreuses façons plus élégantes de faire cela. Mais je pense que pour un débutant, c'est le moyen le plus simple de comprendre et d'implémenter le code.

Cette boucle sert uniquement à garantir que l'utilisateur saisit un caractère valide. Bien que le personnage n'en fasse pas partie, la boucle sera itérée.

Vous devez placer ce code juste en dessous de cette ligne où vous demandez un opérateur valide.


2 commentaires

Merci JF Le code fonctionne parfaitement.


Je vous en prie! Aussi, si la réponse résout le problème est appréciée par la communauté, marquez la réponse comme acceptée.



1
votes

J'ai apporté des modifications et des commentaires à votre code

import java.util.Scanner;

class Calculator {
    public static void main(String[] args) {
        System.out.println("Welcome To Calculator!");
        System.out.println("*************************************************************************");
        Scanner userinput = new Scanner(System.in);
        double num1, num2;
        String choice;

        //the "youDecide" variable is not needed at all
        while (true) {
            System.out.println("Please enter a number: ");
            num1 = userinput.nextDouble();
            System.out.println("Please enter an available operator (+, -, *, /): ");
            char operator = userinput.next().charAt(0);
            System.out.println("Please enter another number: ");
            num2 = userinput.nextDouble();
            double output;
            switch (operator) {
            case '+':
                output = num1 + num2;
                break;

            case '-':
                output = num1 - num2;
                break;

            case '*':
                output = num1 * num2;
                break;

            case '/':
                output = num1 / num2;
                if (num2 == 0) {
                    System.out.println("Math error! A number cannot be divided by zero.");
                }
                break;
            default:
                System.out.println("Invalid input. Please enter an available operator, i.e (+, -, *, /): ");
                continue; //changed from "return" you don't want to exit, just to skip to the next execution of the loop
            }
            System.out.println("*************************************************************************");
            System.out.println("The answer is: " + "\n" + output);
            System.out.println("*************************************************************************");
            System.out.println("Would you like to calculate again?");
            System.out.println("Please enter Y for yes, or N for no");
            choice = userinput.next();

            if (choice.equalsIgnoreCase("Y")) {
                System.out.println("Okay. Let's continue!");
                System.out.println("*************************************************************************");
            } else if (choice.equalsIgnoreCase("N")) {
                System.out.println("*************************************************************************");
                System.out.println("Okay. Thanks for using Calculator. Goodbye!");
                System.exit(0);
            } else {
                System.out.println("Invalid input. Please try again...");
                System.out.println("*************************************************************************");
            }
        }

    }
}


1 commentaires

Merci Javaman. Après avoir appliqué vos modifications, tout fonctionne toujours. Maintenant, comment pourrais-je faire en sorte que le programme continue à demander à l'utilisateur une entrée correcte jusqu'à ce qu'une entrée soit enfin entrée, puis revienne à la boucle principale? Je fais référence à cette partie du code:} else {System.out.println ("Entrée invalide. Veuillez réessayer ..."); System.out.println ("****************************************** ‌ * ******************* ‌ ************* "); }}}}



0
votes

Après avoir ajouté les modifications suggérées par JF et Javaman ainsi que quelques recherches, j'ai pu résoudre le problème en ajoutant les lignes suivantes à mon code:

import java.util.InputMismatchException;
import java.util.Scanner;


class Calculator {
    public static void main(String[] args) {
        System.out.println("Welcome To Calculator!");
        System.out.println("*************************************************************************");
        Scanner userinput = new Scanner(System.in);
        char operator;
        double num1, num2;
        String choice;
        while(true) {
            System.out.println("Please enter a number: ");
            num1 = userinput.nextDouble();
            System.out.println("Please enter an available operator (+, -, *, /): ");
            while(true) {
                operator = userinput.next().charAt(0);  
                if(operator == '+' || operator == '-' || operator == '*' || operator == '/') {
                    break;
                }else {
                    System.out.println("Invalid input. Please enter an available operator, i.e (+, -, *, /): ");
                }
            }
            System.out.println("Please enter another number: ");
            num2 = userinput.nextDouble();
            double output;
    
            switch(operator) {
            case '+':
                output = num1 + num2;
                break;      
            case '-':
                output = num1 - num2;
                break;  
            case '*':
                output = num1 * num2;
                break;      
            case '/':
                output = num1 / num2;
                break;
            default:
                System.out.println("Invalid input. Please enter an available operator, i.e (+, -, *, /): ");
                continue;
            }
            System.out.println("*************************************************************************");                
            if(num2 == 0) {
                System.out.println("Math error! A number cannot be divided by zero.");
            }else {
                System.out.println("The answer is: " + "\n" + output);
            } 
            System.out.println("*************************************************************************");
            System.out.println("Would you like to calculate again?");
            System.out.println("Please enter Y for yes, or N for no");
            choice = userinput.next();
     
            if(choice.equalsIgnoreCase("Y")) {
                System.out.println("Okay. Let's continue!");
                System.out.println("*************************************************************************");
            }else if(choice.equalsIgnoreCase("N")) {
                System.out.println("*************************************************************************");
                System.out.println("Okay. Thanks for using Calculator. Goodbye!");
                System.exit(0);
            }else {
                System.out.println("Invalid input. Please try again...");   
                System.out.println("*************************************************************************");        
                **while (!("Y").equalsIgnoreCase(choice) && !("N").equalsIgnoreCase(choice)) {
                    System.out.println("Invalid input. Please try again...");   
                    System.out.println("*************************************************************************");        
                    System.out.println("Please enter Y for yes, or N for no");
                    choice = userinput.next();
                    if(choice.equalsIgnoreCase("Y")) {
                        System.out.println("Okay. Let's continue!");
                        System.out.println("*************************************************************************");
                    }else if(choice.equalsIgnoreCase("N")) {
                        System.out.println("*************************************************************************");
                        System.out.println("Okay. Thanks for using Calculator. Goodbye!");
                        System.exit(0);**
                    }
                }
            }
        }
   }

}


0 commentaires