Estoy haciendo un programa simple que genera una pregunta matemática aleatoria usando números aleatorios entre 1 y 10 . El operador también será aleatorio entre +, - y * . Cuando intento usar una declaración de caso y devolver el valor de la operación e imprimir la pregunta (al final) dice que no hay una variable operación .

    int number1 = (int)(Math.random()* 10) + 1;
    int number2 = (int)(Math.random()* 10) + 1;
    int operator = (int)(Math.random()* 3) + 1;


        switch (operator){
            case 1: {
                String operation = "+";
                int correctResult = number1 + number2;
                break;
            }
            case 2: {
                String operation = "-";
                int correctResult = number1 - number2;
                break;
            }
            case 3: {
                String operation = "*";
                int correctResult = number1 * number2;
                break;
            }
        }
    System.out.print(number1+operation+number2+": ");
    String studentAnswer = scanner.next();    
-1
Harry Potter424 9 sep. 2018 a las 23:06

4 respuestas

La mejor respuesta

Debe declarar el operador fuera del bloque de interruptores:

int number1 = (int)(Math.random()* 10) + 1;
int number2 = (int)(Math.random()* 10) + 1;
int operator = (int)(Math.random()* 3) + 1;
String operation = null; // move outside of switch block
int correctResult; // move outside of switch block

    switch (operator){
        case 1: {
            operation = "+";
            correctResult = number1 + number2;
            break;
        }
        case 2: {
            operation = "-";
            correctResult = number1 - number2;
            break;
        }
        case 3: {
            operation = "*";
            correctResult = number1 * number2;
            break;
        }
    }
System.out.print(number1+operation+number2+": ");
String studentAnswer = scanner.next();    
3
Beri 9 sep. 2018 a las 20:11

Declare el parámetro afuera y colóquelo en la caja del interruptor. Entonces este código será así;

int number1 = (int) (Math.random() * 10) + 1;
int number2 = (int) (Math.random() * 10) + 1;
int operator = (int) (Math.random() * 3) + 1;

//initalize value which is changing in swich case statement and set initializing value
String operation = "";
int correctResult = 0;

switch (operator) {
    case 1: {
        operation = "+";
        correctResult = number1 + number2;
        break;
    }
    case 2: {
        operation = "-";
        correctResult = number1 - number2;
        break;
    }
    case 3: {
        operation = "*";
        correctResult = number1 * number2;
        break;
    }
}
System.out.print(number1 + operation + number2 + ": ");
String studentAnswer = scanner.next();
1
drowny 9 sep. 2018 a las 20:14

El problema es que no está siguiendo el alcance de visibilidad variable. Siempre necesita contar los corchetes {} Aquí hay un ejemplo genérico.

    public void exampleScopeMethod  {
     String localVariable = "I am a local Variable"; 
     {
        String nextScope = " NextScope is One level deeper";
        localVariable += nextScope
      }
      {
         String anotherScope = "Is one level deeper than local variable, still different scope than nextScope";

         //Ooops nextScope is no longer visible I can not do that!!!
         anotherScope +=nextScope;

       { one more scope , useless but valid }
}
      //Ooopppsss... this is again not valid
      return nextScope; 
      // now it is valid 
      return localVariable;
     }

    }
1
Alexandar Petrov 9 sep. 2018 a las 20:17

Como dijo JB Nizet arriba:

Debido a que las variables de operación se definen dentro de cada bloque de casos, y por lo tanto no son visibles fuera de estos bloques. Declare una variable, antes del cambio, y modifique su valor dentro de los bloques de mayúsculas y minúsculas.

La variable operation solo se define dentro de cada caso.

-2
zx485 9 sep. 2018 a las 20:58