Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Cleiton Pereira

Estrutura switch

Recommended Posts

Olá companheiros do Imasters,

 

A uma semana atras decidi iniciar os estudos em programação para desktop e, por ouvir falar muito bem da linguagem, escolhi a linguagem java para começar essa nova gaze de aprendizado.

 

Em meio aos meu estudo me deparei com uma questão que desenvolvi com a estrutura Switch Case. Fuciona da seguinte forma:

 

A variavel do Switch é a variavel chamada mes; nos cases existem estruturas condicionais if, que incrementam a variavel mes se a variavel dias for maior que a variavel diasMes (que é o numero de dias que o mês emitido pelo usuario possui).

 

O problema é o seguinte: Quando a variavel mes é incrementada, a estrutura deveria mudar para o case que corresponde ao novo valor da variavel mes (pelo menos é o que ocorre em php) e isso não esta acontecendo em java.

 

Vou usar um exemplo simples pois meu código está um pouco extenso.

 

public class Switch {
public static void main(String[] args)
{
	int valor = 1;

	switch (valor){
		case 1:
			System.out.println(valor);
			valor = 2;
			break;
		case 2:
			System.out.println(valor);
			valor = 3;
			break;
		case 3:
			System.out.println(valor);
			valor = 1;
			break;
	}
}
}

 

Essa estrutura deveria formar um loop, o que não está ocorrendo. Alguém tem uma dica que possa me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, não vai formar um loop mesmo, também não faria um loop em nenhuma outra linguagem de programação.

O switch/case é uma estrutura condicional e nunca vai ter um comportamento diferente deste.

 

Se você executa este programa 10 vezes, ele vai cair sempre no primeiro caso, afinal, a variável sempre é inicializada com valor=1.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo bem amigo, concordo com você que a variavel é iniciada com o valor 1, mas quando ela entra no primeiro case ela recebe o valor 2, logo deveria passar para o case que corresponde a este valor.

 

Só queria esclarecer que me expressei mal ou talvez você não entendeu bem. Eu não quero necessariamente um loop, só quero que a estrutura troque de Case caso a variável do Switch receba um novo valor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo bem amigo, concordo com você que a variavel é iniciada com o valor 1, mas quando ela entra no primeiro case ela recebe o valor 2, logo deveria passar para o case que corresponde a este valor.

 

Como eu disse, esse comportamento não deveria ser lógico.

Mas se você quiser que isto aconteça, não coloque o break.

 

Uma estrutura lógica de if ou switch deve atender apenas 1 condição. Tanto no if como no switch se esta condição atender a mais de 1, a primeira verdadeira será atendida e as demais (caso existam) ignoradas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A primeira coisa que me vio a mente quando me ocorreu esse problema foi tirar o break, mas isso não resolve o problema, isso apenas faz com que a estrutura passe para o próximo case, mesmo sem satisfazer a condição do break anterior.

 

Sei que o break é uma estrutura condicional e volto a repetir, não preciso de um loop, e sim que o case se adapte aos novos valores das variaveis.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Visual Basic - http://msdn.microsoft.com/pt-br/library/cy37t14y%28v=vs.90%29.aspx

Java - http://www.tiexpert.net/programacao/java/switch-case-default.php

PHP - http://www.tiexpert.net/programacao/web/php/switch-case-default.php

JavaScript - http://www.tiexpert.net/programacao/web/javascript/switch-case-default.php

C - http://www.tiexpert.net/programacao/c/switch-case-default.php

Pascal - http://pt.wikibooks.org/wiki/Pascal/Estrutura_Condicional

Python - http://www.python.org/dev/peps/pep-3103/

 

Nas várias linguagens é o mesmo comportamento. Com algumas poucas diferenças de sintaxe e parametrização, umas aceitam apenas valores Inteiros, outras trabalham também com Strings, mas a lógica de funcionamento é sempre a mesma.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe o erro amigo, a linguagem que testei o case foi pascal.

 

Estou comk o Pzim! instalado aqui, faça o teste!

 

Quanto ao Java, resolvi o problema inserindo o Switch Case dentro de um For.

 

Por exemplo:

 

public class Switch {
       public static void main(String[] args)
       {
           int valor = 1;

		for (valor = valor; valor <4;){
               switch (valor){
                       case 1:
                               System.out.println(valor);
                               valor = 2;
                               break;
                       case 2:
                               System.out.println(valor);
                               valor = 3;
                               break;
                       case 3:
                               System.out.println(valor);
                               valor = 1;
                               break;
               }
          	}
       }
}

 

 

O exercicio que foi me passado é esse:

 

public class Ano {
public static void main(String[] args)
{
	int diaEmprestimo = 29, mesEmprestimo = 4, anoEmprestimo = 20001, diasMes, contador,
		diaDevolucao, mesDevolucao, anoDevolucao, limiteDias = 3;
	boolean AnoBiSSexto;

	diaDevolucao = diaEmprestimo + limiteDias;
	mesDevolucao = mesEmprestimo;
	anoDevolucao = anoEmprestimo;

	if (((anoEmprestimo % 4) == 0) && ((anoEmprestimo % 100) != 0) || ((anoEmprestimo % 400) == 0)){
		AnoBiSSexto = true;
	}
	else {
		AnoBiSSexto = false;
	}

	for (mesEmprestimo = mesEmprestimo; mesEmprestimo != 0;){
		switch (mesEmprestimo) {
			case 4:
			case 6:
			case 9:
			case 11:
				diasMes = 30;

				if (diaDevolucao <= diasMes) {
					System.out.println("Data do emprestimo: " + diaEmprestimo+"/"+mesEmprestimo+"/"+anoEmprestimo);
					System.out.println("Número de dias: " + limiteDias);
					System.out.println("Data da devolução: " + (diaDevolucao)+"/"+mesDevolucao+"/"+anoDevolucao);
					mesEmprestimo = 0;
				}
				else {
					diaDevolucao = (diaDevolucao - diasMes);
					mesDevolucao++;
				}

				break;
			case 1:
			case 3:
			case 5:
			case 7:
			case 10:
			case 12:
				diasMes = 31;

				if (diaEmprestimo <= diasMes && diaDevolucao <= diasMes) {
					System.out.println("Data do emprestimo: " + diaEmprestimo+"/"+mesEmprestimo+"/"+anoEmprestimo);
					System.out.println("Número de dias: " + limiteDias);
					System.out.println("Data da devolução: " + (diaDevolucao)+"/"+mesDevolucao+"/"+anoDevolucao);
					mesEmprestimo = 0;
				}
				if (mesEmprestimo == 12) {
					mesDevolucao = 1;
					anoDevolucao++;
				}
				if (diaDevolucao > diasMes){
					diaDevolucao = ((diaDevolucao - diasMes));
					mesDevolucao++;
				}

				break;
			case 2:
				if (AnoBiSSexto){
					diasMes = 29;
				}
				else {
					diasMes = 28;
				}

				if (diaEmprestimo <= diasMes && diaDevolucao <= diasMes) {
					System.out.println("Data do emprestimo: " + diaEmprestimo+"/"+mesEmprestimo+"/"+anoEmprestimo);
					System.out.println("Número de dias: " + limiteDias);
					System.out.println("Data da devolução: " + (diaDevolucao)+"/"+mesDevolucao+"/"+anoDevolucao);
					mesEmprestimo = 0;
				}
				if (diaDevolucao > diasMes){
					diaDevolucao = ((diaDevolucao - diasMes));
					mesDevolucao++;
				}
				break;
			default:
				System.out.println("O mês informado  é inválido.");
				break;
		}
	}
}
}

 

Estou estudando apartir de uma apostila que encontrei na web, Introdução à Linguagem Java, escrita por Christian Cleber Masdeval Braz, que por sinal é muito boa.

 

Obrigado pelo ajuda prog, que por sinal foi mais uma tentativa de debate do que uma tentativa de tentar ajudar, mas para isso que o forum serve também, debate.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.