Problema ler char teclado

13 respostas
A

Bem eu estou com um pequeno problema ao querer ler um char do teclado, desta forma venho aqui mais uma vez pedir a vossa ajuda para esclarecer as minhas duvidas e questões.

Bem a minha duvida é, eu pretendo criar um programa que leia um char do teclado, “apenas um”, contudo eu apenas quero que o utilizador digite 1 em 4 chars disponíveis e se o utilizador não usar um desses 4 chars o programa da uma mensagem de erro. Vou colocar aqui o método para que entendam melhor a minha duvida.

public class Example {

	public static void main(String[] args){
	
		Scanner sc = new Scanner(System.in);
		
		boolean correcta = true;
		char opcao;
		
		do{
			System.out.println("Escolha comando: A / B / C / D ");

while(opcao!=A||opcao!=B||opcao!=C||opcao!=D){
			System.out.print("-> ");
			opcao = sc.next();
			
			if(opcao!=A||opcao!=B||opcao!=C||opcao!=D)
System.out.println("Esse comando nao existe");

			}
if(opcao == A){
}
if(opcao == B){
}
if(opcao == C){
}
if(opcao == D){
}
		}while(!correcta);

Será que eu posso fazer assim ? ou está algo de errado?

13 Respostas

E

Não é por nada não, mas o Java é um desastre para ler apenas um caracter do teclado (não existe um “getch” como no Borland Turbo C).

De qualquer maneira, você não consegue ler um “char” do teclado e sim uma “string”, e strings se comparam com “equals”, nunca com “==”.

Procure aqui no GUJ que alguém já deve ter feito algo parecido com o que você quer.

A

Então isso quer dizer que apenas basta eu por a variavel opcao de char para string ?

String opcao;
E

Você leu a segunda frase da segunda linha do meu post?

A

Pois sim esqueci de referir que tenho de fazer:

if(opcao = A){  
}  
if(opcao = B){  
}  
if(opcao = C){  
}  
if(opcao = D){  
}
E

Pois bem, seria algo como:

if(opcao.equals ("A")){    
} else if(opcao.equals ("B")){    
} else if(opcao.equals ("C")){    
} else if(opcao.equals ("D")){    
}
A

Hum percebi, muito obrigado pela paciencia

suelengc

Olá!

Pensando bem rapidamente acho que faria conforme abaixo:

PS.: não compilei o código pq aqui no trabalho não tenho compilador java instalado… :’(

public class Example {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        char opcao;

        do {
            System.out.println("Escolha comando: A / B / C / D ");
            opcao = sc.nextLine().charAt(0);
        } while(!ComandoExiste(opcao));
    }

    static boolean ComandoExiste(char opcao) {
        boolean retorno = true;

        if(!(opcao=='A' || opcao=='B' || opcao=='C' || opcao=='D')) {
            System.out.println("Esse comando nao existe.");
            retorno = false;
        }
        return retorno;
    }
}

Da forma acima você trabalha com o tipo char e usa apenas o primeiro caractere digitado pelo seu usuário, ignorando caso ele insira mais alguma informação que não será relevante… usando char você pode usar o operador de comparação “==”.

Ah! Muito (!!!) importante, o operador “=” é de atribuição, de comparação em Java é “==”.

Abraços!

M

suelengc:
Olá!

Pensando bem rapidamente acho que faria conforme abaixo:

PS.: não compilei o código pq aqui no trabalho não tenho compilador java instalado… :’(

public class Example {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        char opcao;

        do {
            System.out.println("Escolha comando: A / B / C / D ");
            opcao = sc.nextLine().charAt(0);
        } while(!ComandoExiste(opcao))
    }

    static boolean ComandoExiste(char opcao) {
        boolean retorno = true;

        if(!(opcao=='A' || opcao=='B' || opcao=='C' || opcao=='D')) {
            System.out.println("Esse comando nao existe.");
            retorno = false;
        }
    }
}

Da forma acima você trabalha com o tipo char e usa apenas o primeiro caractere digitado pelo seu usuário, ignorando caso ele insira mais alguma informação que não será relevante… usando char você pode usar o operador de comparação “==”.

Ah! Muito (!!!) importante, o operador “=” é de atribuição, de comparação em Java é “==”.

Abraços!

Lógica perfeita, porém, talvez seja equivoco meu, mas eu trocaria o == por .equals(‘X’)

suelengc

Olá Mitidiero!

No próprio GUJ tem um post já resolvido sobre a diferença entre equals e == (http://www.guj.com.br/java/241198-resolvido-diferenca-entre-equals-e-). Muito bom para entender.

Como diz o ViniGodoy: “O == só testa conteúdo no caso dos tipos primitivos.”, como no caso do código que eu postei estamos usando o char, podemos tranquilamente usar o ==.

Acredito que, neste caso, o == seria a melhor opção pois deve ter uma melhor perfomance, mas para ter certeza precisaríamos ver o .class gerado (o que não consigo fazer agora infelizmente).

Abraços!

M

suelengc:
Olá Mitidiero!

No próprio GUJ tem um post já resolvido sobre a diferença entre equals e == (http://www.guj.com.br/java/241198-resolvido-diferenca-entre-equals-e-). Muito bom para entender.

Como diz o ViniGodoy: “O == só testa conteúdo no caso dos tipos primitivos.”, como no caso do código que eu postei estamos usando o char, podemos tranquilamente usar o ==.

Acredito que, neste caso, o == seria a melhor opção pois deve ter uma melhor perfomance, mas para ter certeza precisaríamos ver o .class gerado (o que não consigo fazer agora infelizmente).

Abraços!

Valeu pela explicação, olharei sim =)

suelengc

Ah, outro pequeno detalhe… o .equals só existe em tipos de referência… não existe em tipos primitivos, como o char :wink:

Abraços!

A

Muito obrigado pela sua explicação suelengc . Contudo agora apareceu me outra duvida que já não tem muito a ver com o conteúdo do tópico, ainda assim é uma duvida no seguimento deste código.

A minha divida é, quando o utilizador escolhe por exemplo a letra a eu queria que, na escolha desta opcao, o programa imprimisse no ecra o conteudo de um ficheiro .txt eu tentei fazer da seguinte forma :

public class Example {  
    public static void main(String[] args) {  
        Scanner sc = new Scanner(System.in);  
        BufferedReader in;
		in = new BufferedReader( new FileReader("ficheiro.txt") );
        char opcao;  
  
        do {  
            System.out.println("Escolha comando: A / B / C / D ");  
            opcao = sc.nextLine().charAt(0);
            if(opcao=='M'){
            	System.out.println(in);
        } while(!ComandoExiste(opcao))  
    }  
  
    static boolean ComandoExiste(char opcao) {  
        boolean retorno = true;  
  
        if(!(opcao=='A' || opcao=='B' || opcao=='C' || opcao=='D')) {  
            System.out.println("Esse comando nao existe.");  
            retorno = false;  
        }  
    }  
}
}

Eu fazendo assim estão me a dar alguns erros, pois penso que esta não será a forma correta

suelengc

Olá andrefilipe6!

Realmente seu código não está correto. Mas por favor, ao citar um problema, além de dizer o código que tentou fazer, diga também qual erro está ocorrendo e quais foram suas tentativas de solucionar, não espere simplesmente que alguém venha e coloque o código correto.

Seu problema pode ser facilmente resolvido com o uso das classes FileReader e BufferedReader.

No próprio GUJ há um artigo muito bom e breve do Guilherme Silveira da Caelum que aborda de forma prática e muito simples algumas classes da biblioteca Java.io, dentre elas, ele aborda estas duas classes que citei que podem lhe ajudar.

Segue o link: http://www.guj.com.br/articles/13

Se após ler ainda precisar de ajuda, volte ao GUJ :wink:

Abraços!

Criado 5 de abril de 2012
Ultima resposta 7 de abr. de 2012
Respostas 13
Participantes 4