Swicth dentro de um while(RESOLVIDO)

13 respostas
marco-oliveira
ola pessoal, preciso que o codigo em questao insira um numero inteiro e imprima o mes referente ao numero, e que faça isso ate que seja digitado o numero 0 e encerre o laço;

ja olhei em outros topicos e nao encontrei a soluçao;

quando digito o numero me da um laço infinito;

import java.util.Scanner; public class Mes { public static void main (String [] args) { Scanner s = new Scanner (System.in); System.out.println("Digite o numero correspondente ao mês : "); int num = s.nextInt(); while (num != 0) { switch (num) { case 1: System.out.println("Janeiro"); break; case 2: System.out.println("Fevereiro"); break; case 3: System.out.println("Março"); break; case 4: System.out.println("Abril"); break; case 5: System.out.println("Maio"); break; case 6: System.out.println("Junho"); break; case 7: System.out.println("Julho"); break; case 8: System.out.println("Agosto"); break; case 9: System.out.println("Setembro"); break; case 10: System.out.println("Outubro"); break; case 11: System.out.println("Novembro"); break; case 12: System.out.println("Dezembro"); break; default: System.out.println("Apenas numeros de 1 a 12 são validos"); } } } }

13 Respostas

SandroSoftwares

está dando loop infinito pois vc não está relendo a entrada com o scanner

B

Esse aqui funciona!

import javax.swing.JOptionPane;

public class Meses {
  public static void main(String[] args) {
    String st = "Informe um número entre 1 e 12";
    st = JOptionPane.showInputDialog(null,st);
    byte mes = Byte.parseByte(st);
    
    switch (mes) {
      case 1:
        st = "janeiro";
        break;
      case 2:
        st = "fevereiro";
        break;
      case 3:
        st = "março";
        break;
      case 4:
        st = "abril";
        break;
      case 5:
        st = "maio";
        break;
      case 6:
        st = "junho";
        break;
      case 7:
        st = "julho";
        break;
      case 8:
        st = "agosto";
        break;
      case 9:
        st = "setembro";
        break;
      case 10:
        st = "outubro";
        break;
      case 11:
        st = "novembro";
        break;
      case 12:
        st = "dezembro";
        break;
      default: 
        st = "Mês inválido!";
        JOptionPane.showMessageDialog(null,st,"Erro",0);
        System.exit(0);
    }
    
    st = "Você escolheu o mês de " + st;
    JOptionPane.showMessageDialog(null,st,"Mensagem",1);
    System.exit(0);
  }
}
marco-oliveira

nao compreendi como posso fazer isso, estou tentando aq mais nao esta dando certo, se puder me dar mais alguma dica fico grato…

B

Vey, o code que te mandei em si funciona siim!! esta direitinho…

Agora tem q ver se vc ta colocando o nome da classe certa… igual a sua…

public class meses {

A classe tem q ter o nome “meses”

marco-oliveira
brunaum15:
Esse aqui funciona!
import javax.swing.JOptionPane;

public class Meses {
  public static void main(String[] args) {
    String st = "Informe um número entre 1 e 12";
    st = JOptionPane.showInputDialog(null,st);
    byte mes = Byte.parseByte(st);
    
    switch (mes) {
      case 1:
        st = "janeiro";
        break;
      case 2:
        st = "fevereiro";
        break;
      case 3:
        st = "março";
        break;
      case 4:
        st = "abril";
        break;
      case 5:
        st = "maio";
        break;
      case 6:
        st = "junho";
        break;
      case 7:
        st = "julho";
        break;
      case 8:
        st = "agosto";
        break;
      case 9:
        st = "setembro";
        break;
      case 10:
        st = "outubro";
        break;
      case 11:
        st = "novembro";
        break;
      case 12:
        st = "dezembro";
        break;
      default: 
        st = "Mês inválido!";
        JOptionPane.showMessageDialog(null,st,"Erro",0);
        System.exit(0);
    }
    
    st = "Você escolheu o mês de " + st;
    JOptionPane.showMessageDialog(null,st,"Mensagem",1);
    System.exit(0);
  }
}

o meu tambem funciona desse jeito que vc fez, so que preciso que quando vc digite o numero e imprima o mes e volte para digitar denovo, o numero, ate que digite o 0 para sair;
tipo um menu...

marco-oliveira

obrigado agora compreendi, é so colocar o codigo

System.out.println("Digite o numero correspondente ao mês : "); num = s.nextInt();
no final do while

ViniGodoy

Claro, pra que complicar o que é simples…

import java.util.Scanner; public class Mes { public static void main (String [] args) { String[] meses = {"janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"}; Scanner s = new Scanner (System.in); System.out.println("Digite o numero correspondente ao mês : "); int num = Integer.parseInt(s.nextLine()); while (num != 0) { if (num < 1 || num > 12) System.out.println("Apenas meses de 1 a 12 são validos"); else System.out.println(meses[num-1]); num = Integer.parseInt(s.nextLine()); } } }

ribclauport

No projeto que eu trabalhei, eu precisei que os meses fossem retornados em uma língua especifíca... sendo assim tive que substituir o vetor de meses, pela API Calendar, mesclei o código com a solução que encontrei, pensei ser pertinente postar o código aqui, já que o Vini pode fazer alguma observação de melhora do mesmo, segue:

package food;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;
import java.util.Scanner;
public class Mes {  
	
	Mes(Locale localeUser, String pattern){
		this.localeuser = localeUser;
		sdf = new SimpleDateFormat(pattern,localeuser);
	}
	
	public Locale localeuser;
	private SimpleDateFormat sdf;
	
	public String getMes(int mes){
       	Calendar calendar = Calendar.getInstance(localeuser);
    	calendar.set(Calendar.MONTH, mes-1);
    	String textoMes = sdf.format(calendar.getTime());
    	return textoMes;
     }
	
    public static void main (String [] args) {  
        //Mes m = new Mes(new Locale("pt", "BR"),"MMMM");
    	Mes m = new Mes(new Locale("en","US"),"MMMM");
        Scanner s = new Scanner (System.in);  
        System.out.println("Digite o numero correspondente ao mês : ");  
        int num = Integer.parseInt(s.nextLine());  
        while (num != 0) {  
            if (num < 1 || num > 12)   
                System.out.println("Apenas meses de 1 a 12 são validos");  
            else  
              System.out.println(m.getMes(num));
              num = Integer.parseInt(s.nextLine());  
        }  
    }  
}
marco-oliveira

ViniGodoy:
Claro, pra que complicar o que é simples…

import java.util.Scanner; public class Mes { public static void main (String [] args) { String[] meses = {"janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"}; Scanner s = new Scanner (System.in); System.out.println("Digite o numero correspondente ao mês : "); int num = Integer.parseInt(s.nextLine()); while (num != 0) { if (num < 1 || num > 12) System.out.println("Apenas meses de 1 a 12 são validos"); else System.out.println(meses[num-1]); num = Integer.parseInt(s.nextLine()); } } }

obrigado viny e ribclauport , nem tinha pensado em usar arrays, é sompre bom aprender mais, vou guardar essas podem ser uteis mais pra frente

ViniGodoy
ribclauport:
No projeto que eu trabalhei, eu precisei que os meses fossem retornados em uma língua especifíca... sendo assim tive que substituir o vetor de meses, pela API Calendar, mesclei o código com a solução que encontrei, pensei ser pertinente postar o código aqui, já que o Vini pode fazer alguma observação de melhora do mesmo, segue:

Legal. Você pode obter a lista de todos os meses e dias da semana usados pelo Calendar e pelo Formatter através da classe DateFormatSymbols:
http://docs.oracle.com/javase/7/docs/api/java/text/DateFormatSymbols.html

Por exemplo:
package food;
import java.util.DateFormatSymbols;
import java.util.Calendar;
import java.util.Locale;
import java.util.Scanner;
public class Mes {  
    private Locale localeUser;

    Mes(Locale localeUser){
        this.localeuser = localeUser;		
    }
	
    public String getMes(int mes){
        String meses[] = new DateFormatSymbols(localeUser).getMonths();
        return meses[mes-1];
    }
	
    public static void main (String [] args) {  
        //Mes m = new Mes(new Locale("pt", "BR"));
        Mes m = new Mes(new Locale("en","US"));
        Scanner s = new Scanner (System.in);  
        System.out.println("Digite o numero correspondente ao mês : ");  
        int num = Integer.parseInt(s.nextLine());  
        while (num != 0) {  
            if (num < 1 || num > 12)   
                System.out.println("Apenas meses de 1 a 12 são validos");  
            else  
              System.out.println(m.getMes(num));
              num = Integer.parseInt(s.nextLine());  
        }  
    }  
}

É claro que não tem a flexibilidade e escolher o formato do mês (no caso, eu usaria mesmo o seu código), mas se isso não é necessário, esse método é bem mais leve (o que pode ser útil se vc estiver fazendo uma rotina para converter milhares de registros de um BD, por exemplo). O DateFormatSymbols também tem o método getAvailableLocales() que retorna todos os locales para os quais o java possui formato de data disponível.

ribclauport

Vini eu li o java Doc que você me passou mas eu ainda não consegui pensar na lógica em como usar, já que o codigo abaixo esta dando erro veja:

public String getMes(int mes){  
        String meses[] = new DateFormatSymbols(localeUser);  
        return meses[mes-1];  
    }

Primeira dúvida:
No Caso DateFormaSymbols(localeUser) retorna um DateFormatSymbols… e não um array de Strings

Segunda dúvida
Como ficaria o código com a adaptação, fiquei confuso agora de como usar o que você passou, poderia explanar melhor?

Obrigado pela atenção, e me desculpe a ignorância.

ribclauport

Pucha agora entendi, na verdade é para chamar:

public String getMes(int mes){  
        String meses[] = new DateFormatSymbols(localeUser).getMonths();  
        return meses[mes-1];  
    }

E ae não cria os objetos Calendar. viche entendi muito obrigado essa foi muito boa mesmo.

ViniGodoy

Ops tem razão, esqueci de chamar o getMonths(). É que montei esse código direto no GUJ, não no Eclipse.

Criado 17 de março de 2012
Ultima resposta 18 de mar. de 2012
Respostas 13
Participantes 5