Switch/case - Qual é a sua função?

Olá!
Estou tendo dificuldade para entender a função de switch/case. Poderiam me dá um exemplo de como funciona ? (em código)

Obrigado!

[quote=hackum]Olá!
Estou tendo dificuldade para entender a função de switch/case. Poderiam me dá um exemplo de como funciona ? (em código)

Obrigado![/quote]

É uma estrutura de decisão, assim como o if/else. Basicamente seu formato é este:

switch(decisao){ case 1: (...) break; case 2: (...) break; default: (...) break; }

No exemplo acima, se o valor da variável decisao fosse 1, ele entraria no bloco do “case 1”, se fosse 2, entraria no bloco do “case 2”, e se não fosse de nenhum dos dois, entraria no bloco do “default”. Você não só pode usar inteiros como também caracteres. Por exemplo:

switch(decisao){ case 'a': (...)

há este artigo aqui [ http://www.tiexpert.net/programacao/java/switch-case-default.php ], bem mais detalhado que minha explicação.

ficou claro?

1 curtida

Oi,

Nesse link da para perceber bem…

http://www.guj.com.br/java/225635-classe-com-ifelse

É parecido com a função do SE.

Digamos que você vai digitar o número do mês e ele irá imprimir o mês referente ao número digitado, ficaria assim.
Exemplo:

switch(3){

caso 1 imprima janeiro
caso 2 imprima fevereiro
caso 3 imprima março

… e assim por diante, veja que dentro do switch tem o número 3 então ele vai verificar os cases de acordo com o número do switch … case/caso seja 1 imprima janeiro, 2 fevereiro, 3 março. como dentro do switch tem o número 3 então vai cair no mês de março. quando se usa case/switch é sempre bom colocar um break dentro dos case para que ele não saia imprimindo todos os meses que tem depois do mês escolhido.

}

Olá, Andre Rosa!

Obrigado por sua explicação, não entendi completamente, mas estou entendendo sim, a função de switch!

Mas… qual é a diferença dele do if…else. Por que ter duas função que façam a mesma coisa ? Provavelmente tem alguma diferença. No caso, qual é?

Abraços!

[quote=hackum]Olá, Andre Rosa!

Obrigado por sua explicação, não entendi completamente, mas estou entendendo sim, a função de switch!

Mas… qual é a diferença dele do if…else. Por que ter duas função que façam a mesma coisa ? Provavelmente tem alguma diferença. No caso, qual é?

Abraços![/quote]

veja:
http://www.htmlstaff.org/ver.php?id=23350

[quote=hackum]Olá, Andre Rosa!

Obrigado por sua explicação, não entendi completamente, mas estou entendendo sim, a função de switch!

Mas… qual é a diferença dele do if…else. Por que ter duas função que façam a mesma coisa ? Provavelmente tem alguma diferença. No caso, qual é?

Abraços![/quote]

Usando o switch o código fica mais legivel e mais limpo do que vc sair colocando um punhado de if e else mas ambos funcionam basicamente para a mesma coisa. Depende de cada caso.

Obrigado a todos que me responderam!

Bom, por exemplo, com o if…else, eu posso fazer uma comparação ou definir se um número é maior ou menor. Com o case é possível ? Ou ele só serve para a pessoa digitar um valor e aparecer o que esta no case ?

Se possível, mais exemplo, por favor.

Até mais…

Estrutura condicional if é usada para comparar expressões, variáveis e condições booleanas.
Para comparar multiplas condições o ideal é usar o else if.

Estrutura condicional switch funciona por meio da verificação de condições diversas ,as quais determinaram diversos casos.Realiza um unico teste,verificando condições numéricas(não booleanas)…

1 curtida

Vejamos essa classe:


//GradeBook.java
//Classe GradeBook utiliza instrução switch para contas as nota A, B, C, D, E, F.

import java.util.Scanner; //importa a classe Scanner
public class GradeBook {
	
	private String courseName; //nome do curso que essa GradeBook representa
	private int total; //soma das notas
	private int gradeCounter; //número de notas inseridas
	private int aCount; //contagem de notas A
	private int bCount; //contagem de notas B
	private int cCount; //contagem de notas C
	private int dCount; //contagem de notas D
	private int fCount; //contagem de notas F
	
	//construtor inicializa courseName
	public GradeBook(String name)
	{
		courseName = name;
	}
	
	//método para configurar o nome do curso
	public void setCourseName(String name)
	{
		courseName = name;
	}
	
	//método para recuperar o nome do curso
	public String getCourseName()
	{
		return courseName;
	}
	
	//exibe uma mensagem de boas-vindas para o usuário GradeBook
	public void displayMessage()
	{
		System.out.printf("Bem vindo(a) a classe GradeBook! %s\n",getCourseName());
	}
	
	//insere número arbitrário de notas do usuário
	public void inputGrades()
	{
		//cria Scanner para obter dados a partir da janela de comando
		Scanner input = new Scanner(System.in);
		
		int grade; //nota inserida pelo usuário
		
		System.out.printf("Digite a nota ou <ctrl> d para sair.\n");
		
		//faz o loop até o usuário inserir o indicador de fim do arquivo
		
		while(input.hasNext())
		{
			grade = input.nextInt(); //lê a nota
			total += grade; //adciona grade a total
			++gradeCounter; //incrementa o número de notas
			
			//chama o método para incrementar o contador adequado
			incrementLetterGradeCounter(grade);
			
		}
		
	}

	
	//adciona 1 ao contador adequado da nota especificada
	public void incrementLetterGradeCounter(int grade)
	{
		//determina a nota que foi inserida
		switch(grade / 10)
		{
		case 9: //nota estava entre 90
		case 10: //e 100
			++aCount; //incrementa aCount
			break; //necessário para sair do switch
		case 8: //nota estava entre 80 e 89
			++bCount; //incrementa bCount
			break; //sair do switch
		case 7: //nota estava entre 70 e 79
			++cCount; //incrementa cCount
			break; //sai do switch
		case 6: //nota estava entre 60 e 69
			++dCount;
			break;
		default: //nota era menor que 60
			++fCount;
			break;
		
		
		}
		
	}

	public void displayGradeReport()
	{
		System.out.println("\nVotação de relatório: ");
		
		//se o usuário inseriu pelo menos uma nota
		if(gradeCounter != 0)
		{
			double average = (double) total / gradeCounter;
			
			System.out.printf("Total %d e graus: %d",gradeCounter, total);
			System.out.printf("Classe média: %.2f\n",average);
			System.out.printf("%s\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n",
					          "Número de alunos que receberam cada grau: \n",
					          "A: ",aCount,
					          "B: ",bCount,
					          "C: ",cCount,
					          "D: ",dCount,
					          "F: ",fCount);
		}
		else
			System.out.println("Nenhuma nota foi inserida");
	}
}

Não consigui entender o switch nesse caso!

Tente passar para if que irá entender.Dica, preste muita atenção nos comentarios… :wink:

      switch(grade / 10)  
        {  
        case 9: //nota estava entre 90  
        case 10: //e 100  
            ++aCount; //incrementa aCount  
            break; //necessário para sair do switch  
        case 8: //nota estava entre 80 e 89  
            ++bCount; //incrementa bCount  
            break; //sair do switch  
        case 7: //nota estava entre 70 e 79  
            ++cCount; //incrementa cCount  
            break; //sai do switch  
        case 6: //nota estava entre 60 e 69  
            ++dCount;  
            break;  
        default: //nota era menor que 60  
            ++fCount;  
            break;  
          
          
        }  
          
    }  

Como assim ? nota estava entre 90 e 100 :
Passa esse código em if ? Não vou consiguir. Poderia passar para eu ver ?

[quote=hackum][code]
switch(grade / 10)
{
case 9: //nota estava entre 90
case 10: //e 100
++aCount; //incrementa aCount
break; //necessário para sair do switch
case 8: //nota estava entre 80 e 89
++bCount; //incrementa bCount
break; //sair do switch
case 7: //nota estava entre 70 e 79
++cCount; //incrementa cCount
break; //sai do switch
case 6: //nota estava entre 60 e 69
++dCount;
break;
default: //nota era menor que 60
++fCount;
break;

    }  
      
}  

[/code]

Como assim ? nota estava entre 90 e 100 :
Passa esse código em if ? Não vou consiguir. Poderia passar para eu ver ?[/quote]

Consegue sim, se eu consigo por que vc não vai conseguir… E já começou bem (Como assim ? nota estava entre 90 e 100 )

Preste atenção nos comentários e no que eu expliquei acima.

if(90 > 100)
   ++aCount;

É mais ou menos isso ?
Mas, pq ele não colocou case: 90 e case: 100 ?
Me confundi todo… =/

[quote=hackum] if(90 > 100) ++aCount;

É mais ou menos isso ?[/quote]

Quase, a nota tem que ser entre 90 e 100…

Olá hackum,
A instrução Switch é chamada de instrução de seleção multipla uma vez que seleciona entre muitas ações diferentes.
Vou postar um trecho de código para exemplo:

               // Armazena a opção do usuário 
               int opcao;

		String dia_semana;
		
		switch(opcao)
	        {
	            case 0: 
	            	dia_semana = "Domingo";
	            	break;
	            case 1: 
	            	dia_semana = "Segunda";
	            	break;
	            case 2: 
	            	dia_semana = "Terça";
	            	break;
	            case 3: 
	            	dia_semana = "Quarta";
	            	break;
	            case 4: 
	            	dia_semana = "Quinta";
	            	break;
	            case 5: 
	            	dia_semana = "Sexta";
	            	break;
	            case 6: 
	            	dia_semana = "Sábado";
	            	break;
	        }

A variavél opcao poderia ser um (byte, short, int ou char mas não long). O usuário digitaria uma opção e a variavel dia_semana assumiria um dos valores.
Espero ter ajudado

hackum

Pode parecer que eu estou sendo “chata”, mas quero que vc aprenda e só vai aprender certos conceitos se aprender os anteriores, vivo falando aqui, antes de aprender qualquer linguagem é fundamental aprender lógica de programação.

Pra vc entender esse exercício tem que entender primeiro os operadores logicos.
http://www.slideshare.net/aislan/aula-05-logica-de-programacao

Se estiver errada me desculpe, parece que vc não sabe ainda…

Se interessar nesse link tem uma apostila de lógica para baixar.http://www.guj.com.br/java/230067-qual-linguagem-estudar-/2#1181534

A questão, é que não estou entendendo o switch.

O switch não testa intervalos. O que esse código fez foi dividir grade por 10, numa divisão de inteiros, para que notas como 80,81,82,83,84,85,87,88 e 89, virassem simplesmente 8.
Com esse artifício, o switch então pode só testar a parte do número na casa das dezenas.

O switch é muito parecido com um if. Um switch assim:

switch (opcao) { case 1: fazAlgo(); break; case 2: case 3: fazOutraCoisa(); break; default: fazUmaTerceiraCoisa(); break; }

É equivalente ao if:

if (opcao == 1) { fazAlgo(); } else if (opcao == 2 || opcao == 3) { fazOutraCoisa(); } else { fazUmaTerceiraCoisa(); }

Note que sem o break, o switch faz o que chamamos de “fall through”. Ou seja, ele entra na condição que estiver abaixo dele. O exemplo acima é um caso onde usamos fallthrough da maneira correta. Abaixo, mostro um exemplo onde um erro de programação pode gerar um comportamento inesperado:

switch (opcao) { case 1: fazAlgo(); //Ops, esqueceu do break case 2: fazOutraCoisa(); break. default: fazUmaTerceiraCoisa(); break; }

Isso fica equivalente ao código:

if (opcao == 1) { fazAlgo(); fazOutraCoisa(); } else (if opcao == 2) { fazOutraCoisa(); } else { fazUmaTerceiraCoisa(); }

Não há como testar condições mais complexas no switch. Intervalos por exemplo. Quanto a ser mais legível, também tenho minhas dúvidas.
Eu sempre preferi código com if, e o problema do break é um exemplo de como ele pode prejudicar a legibilidade.

Depois da existência do polimorfismo, o switch e ifs como esses praticamente desapareceram. Mas isso você só vai ver com um pouco mais de estudo na linguagem.

[quote=hackum][code]
switch(grade / 10)
{
case 9: //nota estava entre 90
case 10: //e 100
++aCount; //incrementa aCount
break; //necessário para sair do switch
case 8: //nota estava entre 80 e 89
++bCount; //incrementa bCount
break; //sair do switch
case 7: //nota estava entre 70 e 79
++cCount; //incrementa cCount
break; //sai do switch
case 6: //nota estava entre 60 e 69
++dCount;
break;
default: //nota era menor que 60
++fCount;
break;

    }  
      
}  

[/code]

Como assim ? nota estava entre 90 e 100 :
Passa esse código em if ? Não vou consiguir. Poderia passar para eu ver ?[/quote]

Já que não conseguiu mesmo…


       if ((nota >= 90 ) && (nota <= 100)) {
            ++aCount; //incrementa aCount 
        } else if((nota >= 80) && (nota <= 89)){
            ++bCount; //incrementa bCount 
        } else if((nota >= 70) && (nota <= 79)) {
            ++cCount; //incrementa cCount 
        } else if((nota >= 60) && (nota <= 69)){
            ++dCount;
        } else {
            ++fCount;
        }

Espero que ajude realmente…