Erro comparação com Retorno

14 respostas
brunoejaera

Galera, estou com uma dúvida sobre um exercício que eu tenho que fazer, a dúvida é a seguite.

Tenho um método confirmar() que foi chamado por outro método, nele eu digito “s” pra sim ou “n” pra não, caso eu digite “s” eu quero que retorne true, caso eu digite “n” eu quero que retorne false, mas aparentemente não está retornando nada…eu fiz um teste retornando true independente se eu digitar “s” ou “n” e vai normal…gostaria de saber qual o problema, vou mandar o método pra ficar mais facil a visualização.

public boolean confirma(String msg) throws IOException { char opcao; System.out.println("\n" + msg); do{ opcao = (char) System.in.read(); } while((opcao == 's') || (opcao == 'n')); if(opcao == 's') return true; else return false; }

Outra pergunta, tem como eu passar o que foi digitado pra minúsculo ?? Eu sei que no caso de String eu posso usar o toLowerCase(), mas e no caso de char ???

Vlw Galera.

14 Respostas

nel
public boolean confirma(String msg) throws IOException {   
        char opcao;   
        char aux;
        System.out.println("\n" + msg);   
        do{   
            opcao = (char) System.in.read();   
            aux = Character.toLowerCase(opcao)
        }  while((aux != 's') || (aux != 'n'));   
        
        if(aux == 's')   
            return true;   
        else   
            return false;   
}

Oi, veja se isso te ajuda.
Tem o Character.toUpperCase(), Character.isUpperCase() e por ai adiante. Veja a classe Character.

Eu coloquei o != 's' porque se forem == você está dizendo que enquanto o usuário digitar 's' ou 'n' ele permanece no loop, era isso mesmo?
Tente como fiz ali.

Abraços.

drsmachado

O erro está no teu do/while. Ele ficará ali para sempre, até que você digite algo diferente de s ou n

char opcao;   
        System.out.println("\n" + msg);   
        do{   
            opcao = (char) System.in.read();   
        }   
        while((opcao == 's') || (opcao == 'n'));   
        if(opcao == 's')   
            return true;   
        else   
            return false;

E o Character possui o método toLowerCase sobrecarregado com int e char como argumentos.

nel

Da uma olhada na minha resposta logo acima que editei ela, arrumei o método porque esqueci de substituir a variavél :slight_smile:

brunoejaera

eu coloquei aqui tudo certinho, mas não está saindo do looping…se eu colocar o == ele sai mas chama o método errado, isso se eu usar o if, se eu usar o == e tirar o if vai certo mas quando eu digitar “n” não é pro método que chamou continuar…

brunoejaera

eu tenho um modelo desse método em português estruturado, ajuda se eu mandar ele ? as vezes eu posso ter feito alguma coisa errado…

nel

Não, manda o seu código JAVA com as alterações.
Recomendo que use o System.out.println() e imprima o valor digitado do char, para ver se está efetuando a leitura corretamente.

Abraços.

brunoejaera

Pronto, o método main tbm está nessa classe, coloquei ai pra não mandar mais um arquivo com 1/2 duzia de linhas.

E

Java != Javascript

Em Javascript você compara 2 strings com “==”

Em Java você usa .equals

Exemplo 1:

if ("s".equals (resposta.toLowerCase()) {
 ....
}
nel

entanglement:
Java != Javascript

Em Javascript você compara 2 strings com “==”

Em Java você usa .equals

Exemplo 1:

if ("s".equals (resposta.toLowerCase()) { .... }

Concordo perfeitamente, mas até o momento está usando char, sendo assim está correto o ‘==’.

nel
public boolean confirma(String msg)throws IOException{
        char opcao;
        char aux;
        System.out.println("\n" + msg);
        do {
            opcao = (char) System.in.read();
            System.out.println("Opcao: " + opcao);
            aux = Character.toLowerCase(opcao);
            System.out.println("Aux: " + aux);
        } while((aux != 's') || (aux != 'n'));
        
		if(aux == 's')
            return true;
        else
            return false;
    }

Veja qual será o valor apresentado no console. Obviamente, a diferença é que um vai sair como foi digitado e o outro, com o mesmo valor mas em minusculo.

brunoejaera

Testei aqui, as variaveis estão recebendo o valor corretamente mas não está saindo do laço.

drsmachado

Analisando bem o teu while, pude verificar o seguinte:

Como você está utilizando o operando || (ou) sempre que UM ou OUTRO ou AMBOS vier a ser verdade, o laço continuará.

Como você lê um char, que é apenas um, a condição do while jamais é satisfeita.
Por quê?

Simples:

Case s:

primeira parte do while é verdadeira, pode seguir.

segunda parte do while é falsa, continua no laço.

break;

Case n:

primeira parte do while é falsa, continua no laço.

nem verifica a segunda.

break;

Isso tanto para

... while((aux != 's') || (aux != 'n'));
quanto para

... while((aux == 's') || (aux == 'n'));
O que apenas inverteria a ordem, mas a lógica seria a mesma.

Sendo assim, o uso de || se torna incorreto para a solução desejada.
É preciso trocar por um operando cuja tabela verdade seja verdadeira para ambas as expressões.
Como estamos trabalhando com while, consideramos que o laço será repetido enquanto a condição aux != ‘s’ for verdadeira (ou seja, aux seja diferente de ‘s’ e, ao mesmo tempo, aux != ‘n’, portanto, aux diferente de ‘n’.
Somente o operador lógico AND, representado no java por && possui tal característica.
Para ilustrar:

O1 O2  Saída
V   V    V
F   V    F
V   F    F
F   F    F

O que quer dizer que somente

while (aux != 's' && aux != 'n');

e Jesus salvam.

nel

Analisando bem o teu while, pude verificar o seguinte:

Como você está utilizando o operando || (ou) sempre que UM ou OUTRO ou AMBOS vier a ser verdade, o laço continuará.

Como você lê um char, que é apenas um, a condição do while jamais é satisfeita.
Por quê?

Simples:

Case s:

primeira parte do while é verdadeira, pode seguir.

segunda parte do while é falsa, continua no laço.

break;

Case n:

primeira parte do while é falsa, continua no laço.

nem verifica a segunda.

break;

Isso tanto para

... while((aux != 's') || (aux != 'n'));
quanto para

... while((aux == 's') || (aux == 'n'));
O que apenas inverteria a ordem, mas a lógica seria a mesma.

Sendo assim, o uso de || se torna incorreto para a solução desejada.
É preciso trocar por um operando cuja tabela verdade seja verdadeira para ambas as expressões.
Como estamos trabalhando com while, consideramos que o laço será repetido enquanto a condição aux != ‘s’ for verdadeira (ou seja, aux seja diferente de ‘s’ e, ao mesmo tempo, aux != ‘n’, portanto, aux diferente de ‘n’.
Somente o operador lógico AND, representado no java por && possui tal característica.
Para ilustrar:

O1 O2  Saída
V   V    V
F   V    F
V  F     F
F   F    F

O que quer dizer que somente

while (aux != 's' && aux != 'n');

e Jesus salvam.

Perfeita a explicação. Eu não me atentei ao caso do || e a tabela verdade.

brunoejaera

Puts… agente quebrando a cabeça e era uma coisa tão simples…testei aqui e funcionou perfeitamente.

Vlw pela ajuda gente, vivendo e aprendendo… =].

Criado 28 de setembro de 2011
Ultima resposta 28 de set. de 2011
Respostas 14
Participantes 4