Java Calculator Problem Using Switch Case

Asked

Viewed 558 times

-1

Hi, I have a problem with calculator, when you enter the switch case, does not change operation and does not resume to default.

package aprimoramentos;

import java.util.Locale;
import java.util.Scanner;

public class Calculadora {

    public static double somarValores(double x, double y, double z) {
        z = y + x;
        return z;
    }

    public static double multiplicarValores(double x, double y, double z) {
        z = x * y;
        return z;
    }

    public static double subtrairValores(double x, double y, double z) {
        z = x - y;
        return z;
    }

    public static double dividirValores(double x, double y, double z) {
        z = x / y;
        return z;
    }

    public static double restoDivisao(double x, double y, double z) {
        z = x % y;
        return z;
    }

    public static double potenciaValores(double x, double y, double z) {
        z = Math.pow(x, y);
        return z;
    }


    public static void main(String[] args) {

        Locale.setDefault(Locale.US);
        Scanner sc = new Scanner(System.in);

        double var1 = 0 , var2 = 0 , result = 0;
        String captcha;
        int escolha =0 , i = 0;


            switch (escolha) {
            case 0:
                System.out.printf("Escolha a opção: %n1 Adição%n2 Subtração%n3 Multiplicacao%n4 Divisao%n5 Resto da divisão%n6 Potenciação%n");
                escolha = sc.nextInt();
                System.out.println("Digite os valores: ");
                var1 = sc.nextDouble();
                var2 = sc.nextDouble();
            case 1:
                result = somarValores(var1, var2, result);
                System.out.println("Resultado: " + result);
                break;
            case 2:
                result = subtrairValores(var1, var2, result);
                System.out.println("Resultado: " + result);
                break;
            case 3:
                result = multiplicarValores(var1, var2, result);
                System.out.println("Resultado: " + result);
                break;
            case 4:
                result = dividirValores(var1, var2, result);
                System.out.println("Resultado: " + result);
                break;
            case 5:
                result = potenciaValores(var1, var2, result);
                System.out.println("Resultado: " + result);
                break;
            default:
                System.out.printf("Deseja fazer mais alguma operação ? (s/n)%n");
                captcha = sc.next();
                if (captcha == "s") {
                    escolha = 0;
                } else if (captcha == "n") {
                    System.out.println("Obrigado :D");
                    i = 99 ;
                } else {
                    System.out.println("Opção invalida");
                    escolha = 99;
                }
            }
    }

}

Someone can help me ?

  • It seems that escolha will always be zero no? int escolha =0 , i = 0;

  • I think you’re using the wrong structure to solve your problem, look for while

  • It does not enter the default, because after the case 0, the case 1 gives a break, soon the switch is terminated, is the expected behavior for this decision structure.

2 answers

1

Try wrapping your switch in a while to keep the system running:

while (!condicaoParada) {
 switch (escolha) {
            case 0:
                System.out.printf("Escolha a opção: %n1 Adição%n2 Subtração%n3 Multiplicacao%n4 Divisao%n5 Resto da divisão%n6 Potenciação%n");
                escolha = sc.nextInt();
                System.out.println("Digite os valores: ");
                var1 = sc.nextDouble();
                var2 = sc.nextDouble();
            case 1:
                result = somarValores(var1, var2, result);
                System.out.println("Resultado: " + result);
                break;
            case 2:
                result = subtrairValores(var1, var2, result);
                System.out.println("Resultado: " + result);
                break;
            case 3:
                result = multiplicarValores(var1, var2, result);
                System.out.println("Resultado: " + result);
                break;
            case 4:
                result = dividirValores(var1, var2, result);
                System.out.println("Resultado: " + result);
                break;
            case 5:
                result = potenciaValores(var1, var2, result);
                System.out.println("Resultado: " + result);
                break;
            default:
                System.out.printf("Deseja fazer mais alguma operação ? (s/n)%n");
                captcha = sc.next();
                if (captcha == "s") {
                    escolha = 0;
                } else if (captcha == "n") {
                    System.out.println("Obrigado :D");
                    i = 99 ;
                } else {
                    System.out.println("Opção invalida");
                    escolha = 99;
                }
            }
}

1

  1. You don’t need to pass result/z as a parameter.

  2. You want to read the value of escolha before the switch. And not after. Think about switch as if it were a sequence of ifs.

  3. What did you put in default should come after the end of the switch and not yet inside it. Just as the switch is similar to a sequence of ifs, the default would be equivalent to the latter else.

  4. The switch does not repeat operations automatically. For this, you will use a while or do-while.

  5. Beware when using the class Scanner. See more about this in this question.

  6. You forgot the option of the rest of the division.

  7. Do not use == to compare Strings. See more about this in that question.

package aprimoramentos;

import java.util.List;
import java.util.Locale;
import java.util.Scanner;

public class Calculadora {

    public static double somar(double x, double y) {
        return y + x;
    }

    public static double multiplicar(double x, double y) {
        return x * y;
    }

    public static double subtrair(double x, double y) {
        return x - y;
    }

    public static double dividir(double x, double y) {
        return x / y;
    }

    public static double resto(double x, double y) {
        return x % y;
    }

    public static double potencia(double x, double y) {
        return Math.pow(x, y);
    }

    public static double lerDouble(Scanner sc) {
        return Double.parseDouble(sc.nextLine());
    }

    public static int lerInt(Scanner sc) {
        return Integer.parseInt(sc.nextLine());
    }

    public static void main(String[] args) {
        Locale.setDefault(Locale.US);
        Scanner sc = new Scanner(System.in);

        boolean maisUma = true;
        while (maisUma) {
            System.out.println("Escolha a opção:");
            System.out.println("1 Adição");
            System.out.println("2 Subtração");
            System.out.println("3 Multiplicação");
            System.out.println("4 Divisão");
            System.out.println("5 Resto da divisão");
            System.out.println("6 Potenciação");

            int escolha = lerInt(sc);
            System.out.println("Digite os valores: ");
            double var1 = lerDouble(sc);
            double var2 = lerDouble(sc);

            switch (escolha) {
                case 1:
                    System.out.println("Resultado: " + somar(var1, var2));
                    break;
                case 2:
                    System.out.println("Resultado: " + subtrair(var1, var2));
                    break;
                case 3:
                    System.out.println("Resultado: " + multiplicar(var1, var2));
                    break;
                case 4:
                    System.out.println("Resultado: " + dividir(var1, var2));
                    break;
                case 5:
                    System.out.println("Resultado: " + resto(var1, var2));
                    break;
                case 6:
                    System.out.println("Resultado: " + potencia(var1, var2));
                    break;
                default:
                    System.out.println("Opção inválida");
            }
            while (true) {
                System.out.println("Deseja fazer mais alguma operação? (s/n)");
                String captcha = sc.nextLine();
                if (List.of("s", "S", "n", "N").contains(captcha)) {
                    maisUma = List.of("s", "S").contains(captcha);
                    break;
                } else {
                    System.out.println("Opção inválida");
                }
            }
        }
        System.out.println("Obrigado :D");
    }
}

We can still improve and simplify by eliminating the switch and using DoubleBinaryOperator with Amble:

package aprimoramentos;

import java.util.List;
import java.util.Locale;
import java.util.Scanner;
import java.util.function.DoubleBinaryOperator;

public class Calculadora {
    public static double lerDouble(Scanner sc) {
        return Double.parseDouble(sc.nextLine());
    }

    public static int lerInt(Scanner sc) {
        return Integer.parseInt(sc.nextLine());
    }

    public static void main(String[] args) {
        Locale.setDefault(Locale.US);
        Scanner sc = new Scanner(System.in);

        DoubleBinaryOperator[] ops = new DoubleBinaryOperator[] {
            (a, b) -> a + b,
            (a, b) -> a - b,
            (a, b) -> a * b,
            (a, b) -> a / b,
            (a, b) -> a % b,
            (a, b) -> Math.pow(a, b)
        };

        boolean maisUma = true;
        while (maisUma) {
            System.out.println("Escolha a opção:");
            System.out.println("1 Adição");
            System.out.println("2 Subtração");
            System.out.println("3 Multiplicação");
            System.out.println("4 Divisão");
            System.out.println("5 Resto da divisão");
            System.out.println("6 Potenciação");

            int escolha = lerInt(sc);

            if (escolha >= 1 && escolha <= ops.length) {
                System.out.println("Digite os valores: ");
                double var1 = lerDouble(sc);
                double var2 = lerDouble(sc);
                System.out.println("Resultado: " + ops[escolha - 1].applyAsDouble(var1, var2));
            } else {
                System.out.println("Opção inválida");
            }
            while (true) {
                System.out.println("Deseja fazer mais alguma operação? (s/n)");
                String captcha = sc.nextLine();
                if (List.of("s", "S", "n", "N").contains(captcha)) {
                    maisUma = List.of("s", "S").contains(captcha);
                    break;
                } else {
                    System.out.println("Opção inválida");
                }
            }
        }
        System.out.println("Obrigado :D");
    }
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.