Switch em outro switch

6 respostas
PhoenixWings

Boa tarde. Eu criei um programa de tabuada de multiplicação (Exercício 6.35 do Deitel). Porém, quando é impressa a mensagem: “Please ask your instructor for extra help” o controle do programa não volta ao menu de seleção de início da tabuada ou de saída. Ele simplesmente termina (mesmo com o break que eu coloquei após o case 3. Gostaria de saber como consertar o código a fim de que eu possa voltar ao menu principal após a impressão da mensagem citada.
Tenho percebido que aninhar um switch em outro switch diminui a flexibilidade no que diz respeito à extensibilidade do código mas isso é verdade? é correto afirmar isso?
Obrigado pela ajuda.

package aprendertabuada;

/**
 *
 * @author Eduardo Felipe
 */
import java.util.Random;
import java.util.Scanner;
public class AprenderTabuadaTest {
   public static void main(String[] args) {

     Scanner input = new Scanner(System.in);
     Random randomNumber = new Random();
     AprenderTabuada aluno1 = new AprenderTabuada(0,0,0);
     int num1, num2, op1, op2, op3;
     boolean help;
     do {
     System.out.printf("%s\n%s\n\n", "(1)Iniciar tabuada", "(2)Sair");

     System.out.print("\nInforme a opção desejada: ");
     op1 = input.nextInt();

     switch(op1){

          case 1:
          System.out.printf("\n%s\n%s\n%s\n\n",
          "(1)Fácil: multiplicação com apenas um algarismo",
          "(2)Médio: multiplicação com dois algarismos",
          "(3)Difícil: multiplicação com três algarismos");

          System.out.print("Escolha o nível de dificuldade: ");
          op2 = input.nextInt();

          switch(op2){

           case 1:
             num1 = 1 + randomNumber.nextInt(9);
             num2 = 1 + randomNumber.nextInt(9);

            do {
             aluno1.Tabuada(num1, num2);
             help = aluno1.porcAcertos();

           if(help)
            break;

           System.out.print
           ("\nDigite -1 para sair ou qualquer outro número para continuar: ");
           op3 = input.nextInt();

          } while(op3 != -1);

           break;

          case 2:
            num1 = 10 + randomNumber.nextInt(90);
            num2 = 10 + randomNumber.nextInt(90);

            do {
             aluno1.Tabuada(num1, num2);
             help = aluno1.porcAcertos();

           if(help)
            break;

           System.out.print
           ("\nDigite -1 para sair ou qualquer outro número para continuar: ");
           op3 = input.nextInt();

          } while(op3 != -1);

           break;

            case 3:
            num1 = 100 + randomNumber.nextInt(900);
            num2 = 100 + randomNumber.nextInt(900);

            do {
             aluno1.Tabuada(num1, num2);
             help = aluno1.porcAcertos();

           if(help)
            break;

           System.out.print
           ("\nDigite -1 para sair ou qualquer outro número para continuar: ");
           op3 = input.nextInt();

           } while(op3 != -1);

          break;

          default:
          System.out.print("\nInsira apenas uma das opções válidas\n");
       }

          case 2: 
          /*esta instrução é executada após a execução da instrução da linha  64. Só que eu preciso
            que isto não ocorra para que o controle do programa volte ao menu principal */
          System.exit(0);

          default:
          // e infelizmente este default também acaba sendo executado após o break do if(help) ser executado.
           System.out.println("\nInforme opções válidas\n");
      }
     } while(op1 != 2);
   }
 }
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package aprendertabuada;

/**
 *
 * @author Eduardo Felipe
 */

import java.util.Scanner;
import java.util.Random;
public class AprenderTabuada {

   private int nacertos, nerros, nresp;

   public AprenderTabuada(int nacertos, int nerros, int nresp)
   {
       this.nacertos = nacertos;
       this.nerros = nerros;
       this.nresp = nresp;
   }

  public void Tabuada(int num1, int num2){

      Scanner input = new Scanner(System.in);
      Random randomNumber = new Random();
      
      int acerta = 1 + randomNumber.nextInt(4);
      int resp;
      
      do {

      int erra = 1 + randomNumber.nextInt(4);
      System.out.printf("How much is %d times %d? ", num1, num2);
      resp = input.nextInt();

       if(resp == num1 * num2)
        switch(acerta){

          case 1:
          System.out.println("Very good!");
          ++nacertos;
          ++nresp;
          break;

          case 2:
          System.out.println("Excellent!");
          ++nacertos;
          ++nresp;
          break;

          case 3:
          System.out.println("Nice work!");
          ++nacertos;
          ++nresp;
          break;
            
          case 4:
          System.out.println("Keep up the good work!");
          ++nacertos;
          ++nresp;
          break;
        }

       else
        switch(erra){
            
          case 1:
          System.out.println("No. Please try again.");
          ++nerros;
          ++nresp;
          break;

          case 2:
          System.out.println("Wrong. Try once more.");
          ++nerros;
          ++nresp;
          break;

          case 3:
          System.out.println("Don't give up!");
          ++nerros;
          ++nresp;
          break;

          case 4:
          System.out.println("No. Keep trying.");
          ++nerros;
          ++nresp;
          break;
            
        }

      if(nresp == 10 && nacertos < nerros)
      break;

     } while(resp != num1 * num2);
    }

    public boolean porcAcertos(){

       float porcacertos = 0;

       porcacertos = (float) (nacertos * 0.1);
       if(porcacertos < 0.7)
          System.out.print("\nPlease ask your instructor for extra help\n\n");

         return true;
     }
   }

6 Respostas

rmendes08

Particularmente, aninhar switch é algo que eu nunca faria em um código meu. As estruturas de código tem que serem usadas para aumentarem a clareza do código, e não para dificultar a vida. Não é surpresa alguma que um código com switchs aninhados não funcione. Há alguns dias eu vi um palestrante no Youtube que falou: “Quando as regras do jogo estão difíceis, nós mudamos a regra”. Eu acho que esse é um caso em que se aplica. Eu acho que a sua vida ficaria muito mais fácil se você fizesse um único menu:

(1) Fácil
(2) Médio
(3) Difícil
(4) Sair

Você diminui as digitações do usuário e a sua lógica fica muito mais fácil!

PhoenixWings

Obrigado pelo conselho! eu também penso que ficaria mais fácil como citado acima porém o exercício exige que apareça este primeiro menu de inicialização. (que na verdade, foi requerido num exercício anterior inerente a esse algoritmo). Vou parar de usar switchs aninhados porém, como posso implementar com clareza um menu seguido de outro? :?

rmendes08
if( op1 == 2){
  System.exit(0);
}
Andre_Rosa

Faz melhor…

dentro deste switch, quando você precisar usar o switch, você chama outra classe, por exemplo que contenha o outro switch, bem mais fácil e organizado.

PhoenixWings

juniorlinux:
Faz melhor…

dentro deste switch, quando você precisar usar o switch, você chama outra classe, por exemplo que contenha o outro switch, bem mais fácil e organizado.

Eu ainda não conheço este recurso :frowning: mas não tem problema, eu tentarei reescrever a minha classe que contém o método Tabuada. Obrigado mais uma vez.

Andre_Rosa
PhoenixWings:
juniorlinux:
Faz melhor...

dentro deste switch, quando você precisar usar o switch, você chama outra classe, por exemplo que contenha o outro switch, bem mais fácil e organizado.

Eu ainda não conheço este recurso :( mas não tem problema, eu tentarei reescrever a minha classe que contém o método Tabuada. Obrigado mais uma vez.

Eu me empolguei demais ao citar uma classe especifica para cada switch. Um método especifico p/ o switch dentro de uma classe basta :-)

ex:

public static void metodoSwitch()
{

switch(variavel)
{

case 1:

//vou chamar outro método
 metodoSwitch2();

break;

}

public static void  metodoSwitch2()
{

switch(variavel2)
{

blablabla

}

Mais ou menos isso, entendeu ? :D

Criado 15 de junho de 2010
Ultima resposta 18 de jun. de 2010
Respostas 6
Participantes 3